Daisuke Yanagihara / Mbed 2 deprecated p_fhash_specified_sector

Dependencies:   mbed

Committer:
Yanagihara
Date:
Wed Sep 29 05:23:28 2021 +0000
Revision:
1:534cb807eeff
Parent:
0:29e55001d8e4
Child:
2:dd1c560b4906
Flash verification(any sector) complete

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Yanagihara 0:29e55001d8e4 1 #include "mbed.h"
Yanagihara 0:29e55001d8e4 2
Yanagihara 0:29e55001d8e4 3 SPI spi(p5,p6,p7); //mosi,miso,sclk
Yanagihara 0:29e55001d8e4 4 DigitalOut cs(p8);
Yanagihara 1:534cb807eeff 5 Serial pc(USBTX,USBRX);
Yanagihara 1:534cb807eeff 6 Timer t;
Yanagihara 0:29e55001d8e4 7
Yanagihara 0:29e55001d8e4 8 /*Flashのコマンドを発行*/
Yanagihara 0:29e55001d8e4 9 #define CMD_RDID 0x9f //
Yanagihara 1:534cb807eeff 10 #define CMD_READ 0x03 // Address Read Data
Yanagihara 1:534cb807eeff 11 #define CMD_WREN 0x06 // Write Enable
Yanagihara 1:534cb807eeff 12 #define CMD_SE 0x20 // Sector Erase
Yanagihara 1:534cb807eeff 13 #define CMD_PP 0x02 // Page Programming
Yanagihara 1:534cb807eeff 14 #define CMD_RDSR1 0x05 // Read Status Resistor (WIP check)
Yanagihara 0:29e55001d8e4 15
Yanagihara 0:29e55001d8e4 16
Yanagihara 0:29e55001d8e4 17 void spi_init(){ /*spi通信設定*/
Yanagihara 0:29e55001d8e4 18 spi.format(8,0);
Yanagihara 0:29e55001d8e4 19 spi.frequency(1000000); // 1,000,000=1MHz clock rate
Yanagihara 0:29e55001d8e4 20 cs = 1; //初期化
Yanagihara 0:29e55001d8e4 21 }
Yanagihara 0:29e55001d8e4 22
Yanagihara 1:534cb807eeff 23 void spi_transfer(const uint8_t* tx_buf, uint8_t* rx_buf, uint16_t length) { // 送受信両方判断し通信実行する関数
Yanagihara 1:534cb807eeff 24 pc.printf("#spi_transfer length= 0x%X\r\n",length);
Yanagihara 1:534cb807eeff 25 for(uint16_t i = 0 ; i<length ; i++){
Yanagihara 1:534cb807eeff 26 uint8_t data = spi.write(tx_buf != NULL ? tx_buf[i] : 0x0); // txDataが有るならtxDataを送る,無いなら0を送る
Yanagihara 1:534cb807eeff 27 if(rx_buf != NULL){ // もし受信データを表示したい場合
Yanagihara 1:534cb807eeff 28 rx_buf[i] = data;
Yanagihara 1:534cb807eeff 29 }
Yanagihara 1:534cb807eeff 30 }
Yanagihara 1:534cb807eeff 31 }
Yanagihara 1:534cb807eeff 32 void spi_read_data(uint8_t* rx_buf, uint16_t length){ /*受信*/
Yanagihara 1:534cb807eeff 33 spi_transfer(NULL, rx_buf, length);
Yanagihara 1:534cb807eeff 34 }
Yanagihara 1:534cb807eeff 35 void spi_write_data(const uint8_t* tx_buf, uint16_t length){ /*受信*/
Yanagihara 1:534cb807eeff 36 spi_transfer(tx_buf, NULL, length);
Yanagihara 1:534cb807eeff 37 }
Yanagihara 1:534cb807eeff 38
Yanagihara 1:534cb807eeff 39 /*Flash関数*/
Yanagihara 1:534cb807eeff 40 void flash_send_addr(uint32_t addr) {
Yanagihara 1:534cb807eeff 41 const uint8_t data[] = {
Yanagihara 1:534cb807eeff 42 (addr >> 16) & 0xff, // 1のところだけ残す
Yanagihara 1:534cb807eeff 43 (addr >> 8) & 0xff,
Yanagihara 1:534cb807eeff 44 (addr >> 0) & 0xff,
Yanagihara 1:534cb807eeff 45 };
Yanagihara 1:534cb807eeff 46 for(int i=0; i<3; i++){ // addr : 3byte
Yanagihara 1:534cb807eeff 47 spi.write(data[i]);
Yanagihara 1:534cb807eeff 48 }
Yanagihara 1:534cb807eeff 49 }
Yanagihara 1:534cb807eeff 50
Yanagihara 0:29e55001d8e4 51 void flash_rdid(uint8_t* rx_buf, uint16_t length){ /*RDID読み出し*/
Yanagihara 0:29e55001d8e4 52 cs = 0;
Yanagihara 0:29e55001d8e4 53 spi.write(CMD_RDID);
Yanagihara 1:534cb807eeff 54 spi_read_data(rx_buf, length);
Yanagihara 1:534cb807eeff 55 cs = 1;
Yanagihara 1:534cb807eeff 56 }
Yanagihara 1:534cb807eeff 57
Yanagihara 1:534cb807eeff 58 void flash_read(uint32_t addr, uint8_t* rx_buf, uint16_t length) { /*読み出し*/
Yanagihara 1:534cb807eeff 59 cs = 0;
Yanagihara 1:534cb807eeff 60 spi.write(CMD_READ);
Yanagihara 1:534cb807eeff 61 flash_send_addr(addr);
Yanagihara 1:534cb807eeff 62 spi_read_data(rx_buf, length);
Yanagihara 1:534cb807eeff 63 cs = 1;
Yanagihara 1:534cb807eeff 64 }
Yanagihara 1:534cb807eeff 65
Yanagihara 1:534cb807eeff 66
Yanagihara 1:534cb807eeff 67 void flash_wren(){ // write enable
Yanagihara 1:534cb807eeff 68 cs = 0;
Yanagihara 1:534cb807eeff 69 spi.write(CMD_WREN);
Yanagihara 1:534cb807eeff 70 cs = 1;
Yanagihara 1:534cb807eeff 71 }
Yanagihara 1:534cb807eeff 72
Yanagihara 1:534cb807eeff 73 void flash_se(uint32_t addr) { // sector erase
Yanagihara 1:534cb807eeff 74 cs = 0;
Yanagihara 1:534cb807eeff 75 spi.write(CMD_SE);
Yanagihara 1:534cb807eeff 76 flash_send_addr(addr);
Yanagihara 1:534cb807eeff 77 cs = 1;
Yanagihara 1:534cb807eeff 78 }
Yanagihara 1:534cb807eeff 79 void flash_pp(uint32_t addr, const uint8_t* wr_data, uint16_t length) { // Page Program
Yanagihara 1:534cb807eeff 80 cs = 0;
Yanagihara 1:534cb807eeff 81 spi.write(CMD_PP);
Yanagihara 1:534cb807eeff 82 flash_send_addr(addr);
Yanagihara 1:534cb807eeff 83 spi_write_data(wr_data, length);
Yanagihara 0:29e55001d8e4 84 cs = 1;
Yanagihara 0:29e55001d8e4 85 }
Yanagihara 0:29e55001d8e4 86
Yanagihara 1:534cb807eeff 87 void flash_rdsr(uint8_t* rx_buf, uint16_t length) {
Yanagihara 1:534cb807eeff 88 cs = 0;
Yanagihara 1:534cb807eeff 89 spi.write(CMD_RDSR1);
Yanagihara 1:534cb807eeff 90 spi_read_data(rx_buf, length); // rx_bufにRDSRの値が入っている
Yanagihara 1:534cb807eeff 91 cs = 1;
Yanagihara 1:534cb807eeff 92
Yanagihara 1:534cb807eeff 93 }
Yanagihara 1:534cb807eeff 94
Yanagihara 1:534cb807eeff 95 uint8_t flash_is_wip() { // (WIP)Write In Progress(書込み中)かどうか確認
Yanagihara 1:534cb807eeff 96 uint8_t data; //❓
Yanagihara 1:534cb807eeff 97 flash_rdsr(&data, 0x01); // 1byte(StatusRegister情報)
Yanagihara 1:534cb807eeff 98 return(data & 0x01); //WIP // ビット演算_&
Yanagihara 1:534cb807eeff 99 }
Yanagihara 1:534cb807eeff 100
Yanagihara 1:534cb807eeff 101
Yanagihara 1:534cb807eeff 102 void data_debug_print(const uint8_t* data, uint16_t bytes){ //配列を表示
Yanagihara 1:534cb807eeff 103 pc.printf("+0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F\r\n");
Yanagihara 0:29e55001d8e4 104 pc.printf("-----------------------------------------------\r\n");
Yanagihara 1:534cb807eeff 105 uint16_t depth = ((bytes - 1) >> 4) + 1;
Yanagihara 1:534cb807eeff 106 for(uint16_t j = 0 ; j < depth ; ++j){ //depthは何行❓
Yanagihara 1:534cb807eeff 107 for(uint16_t i = 0 ; i < 16 ; ++i){
Yanagihara 1:534cb807eeff 108 uint8_t d = data[i + (j << 4)];
Yanagihara 1:534cb807eeff 109 pc.printf("%X", (d >> 4) & 0x0f);
Yanagihara 1:534cb807eeff 110 pc.printf("%X", (d >> 0) & 0x0f);
Yanagihara 1:534cb807eeff 111 pc.printf(" ");
Yanagihara 1:534cb807eeff 112 }
Yanagihara 1:534cb807eeff 113 pc.printf("\r\n");
Yanagihara 0:29e55001d8e4 114 }
Yanagihara 1:534cb807eeff 115 pc.printf("\r\n");
Yanagihara 0:29e55001d8e4 116 }
Yanagihara 0:29e55001d8e4 117
Yanagihara 1:534cb807eeff 118 /******************** main *********************/
Yanagihara 0:29e55001d8e4 119 int main() {
Yanagihara 1:534cb807eeff 120 uint8_t tx_buf[256];
Yanagihara 0:29e55001d8e4 121 uint8_t rx_buf[256]; // 受信バッファ用意
Yanagihara 1:534cb807eeff 122 uint32_t addr = 0x0; // 3byte (or 4byte)
Yanagihara 1:534cb807eeff 123 uint16_t length = 0x100;
Yanagihara 1:534cb807eeff 124
Yanagihara 0:29e55001d8e4 125 spi_init(); // spi初期設定
Yanagihara 1:534cb807eeff 126
Yanagihara 1:534cb807eeff 127 pc.printf("-- verification of Flash memory --\r\n");
Yanagihara 1:534cb807eeff 128 pc.printf("\r\n");
Yanagihara 1:534cb807eeff 129
Yanagihara 1:534cb807eeff 130 /*RDID Phase*/
Yanagihara 1:534cb807eeff 131 pc.printf("<<RDID start>>\r\n");
Yanagihara 1:534cb807eeff 132 flash_rdid(rx_buf, 3); // RDID読み出し関数
Yanagihara 1:534cb807eeff 133 data_debug_print(rx_buf, 3); // 取得データ表示
Yanagihara 1:534cb807eeff 134
Yanagihara 1:534cb807eeff 135 pc.printf("<<Read start>>\r\n");
Yanagihara 1:534cb807eeff 136 flash_read(addr, rx_buf, length); // 読み出し関数
Yanagihara 1:534cb807eeff 137 data_debug_print(rx_buf, length); // 取得データ表示
Yanagihara 1:534cb807eeff 138
Yanagihara 1:534cb807eeff 139 /*Erase Phase*/
Yanagihara 1:534cb807eeff 140 pc.printf("<<Erase start>>\r\n");
Yanagihara 1:534cb807eeff 141 t.start(); // 消去時間計測
Yanagihara 1:534cb807eeff 142 flash_wren(); // 書込み・消去の前に必ず必要
Yanagihara 1:534cb807eeff 143 flash_se(addr);
Yanagihara 1:534cb807eeff 144
Yanagihara 1:534cb807eeff 145 pc.printf("*SPI For WIP\r\n");
Yanagihara 1:534cb807eeff 146 while(flash_is_wip()){ // 消去待ち(WIPが 1 の間) // While文が1周回る毎にflash_is_wipを実行している?
Yanagihara 1:534cb807eeff 147 }
Yanagihara 1:534cb807eeff 148 t.stop();
Yanagihara 1:534cb807eeff 149 pc.printf("\r\n");
Yanagihara 1:534cb807eeff 150 pc.printf("Erase complete! \r\n");
Yanagihara 1:534cb807eeff 151 printf("The Erase time taken was %f μs\r\n", t.read_us());
Yanagihara 1:534cb807eeff 152 pc.printf("\r\n");
Yanagihara 1:534cb807eeff 153
Yanagihara 1:534cb807eeff 154 pc.printf("Erase check (Read the erased address.)\r\n");
Yanagihara 1:534cb807eeff 155 flash_read(addr, rx_buf, length);
Yanagihara 1:534cb807eeff 156 data_debug_print(rx_buf, length);
Yanagihara 1:534cb807eeff 157
Yanagihara 1:534cb807eeff 158
Yanagihara 1:534cb807eeff 159 /*Write Phase*/
Yanagihara 1:534cb807eeff 160 pc.printf("Make Sequential Data...\r\n\r\n");
Yanagihara 1:534cb807eeff 161 for(uint16_t i = 0; i < length; ++i) {
Yanagihara 1:534cb807eeff 162 tx_buf[i] = i & 0xff; // 配列に1~256(0xFF)まで入れる
Yanagihara 1:534cb807eeff 163 }
Yanagihara 1:534cb807eeff 164
Yanagihara 1:534cb807eeff 165 pc.printf("<<Write start>>\r\n");
Yanagihara 1:534cb807eeff 166 t.start(); // 書込時間計測
Yanagihara 1:534cb807eeff 167 flash_wren(); // 書込み・消去の前に必ず必要
Yanagihara 1:534cb807eeff 168 flash_pp(addr, tx_buf, length);
Yanagihara 1:534cb807eeff 169
Yanagihara 1:534cb807eeff 170 pc.printf("*SPI For WIP\r\n");
Yanagihara 1:534cb807eeff 171 while(flash_is_wip()){ // 消去待ち(WIPが 1 の間) // While文が1周回る毎にflash_is_wipを実行している?
Yanagihara 0:29e55001d8e4 172 }
Yanagihara 1:534cb807eeff 173 pc.printf("\r\n");
Yanagihara 1:534cb807eeff 174 t.stop();
Yanagihara 0:29e55001d8e4 175
Yanagihara 1:534cb807eeff 176 pc.printf("Write complete! \r\n");
Yanagihara 1:534cb807eeff 177 printf("The Write time taken was %f μs\r\n", t.read_us());
Yanagihara 1:534cb807eeff 178 pc.printf("\r\n");
Yanagihara 1:534cb807eeff 179
Yanagihara 1:534cb807eeff 180 pc.printf("Write Data check (Read the Written address.)\r\n");
Yanagihara 1:534cb807eeff 181 flash_read(addr, rx_buf, length);
Yanagihara 1:534cb807eeff 182 data_debug_print(rx_buf, length);
Yanagihara 1:534cb807eeff 183
Yanagihara 1:534cb807eeff 184 }