Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@1:534cb807eeff, 2021-09-29 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |