Microchip SPI SRAM 23LC1024 demo

Dependencies:   mbed

Committer:
discypus
Date:
Mon Nov 09 12:40:31 2015 +0000
Revision:
3:b585283f5932
Parent:
2:e0d7ea47d2a5
????? status -> mode?????????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
discypus 0:9750a875cbda 1 /*
discypus 0:9750a875cbda 2 * sample for Microchip 23LC1024 (SRAM, SPI 20MHz)
discypus 0:9750a875cbda 3 */
discypus 0:9750a875cbda 4
discypus 0:9750a875cbda 5 #include "mbed.h"
discypus 0:9750a875cbda 6
discypus 3:b585283f5932 7 #define DWT_CONTROL ((volatile uint32_t *)0xE0001000)
discypus 3:b585283f5932 8 #define DWT_CYCCNT ((volatile uint32_t *)0xE0001004)
discypus 3:b585283f5932 9 #define SCB_DEMCR ((volatile uint32_t *)0xE000EDFC)
discypus 3:b585283f5932 10
discypus 3:b585283f5932 11 static inline void enableDwtCyccnt()
discypus 3:b585283f5932 12 {
discypus 3:b585283f5932 13 // const uint32_t NOCYCCNT = 1u << 25; // 1:CYCCNT is NOT support
discypus 3:b585283f5932 14 const uint32_t TRCENA = 1u << 24; // enable DWT
discypus 3:b585283f5932 15 const uint32_t CYCCNTENA = 1u << 0; // enable counter
discypus 3:b585283f5932 16
discypus 3:b585283f5932 17 // if (*DWT_CONTROL & NOCYCCNT) { // F401REではsetされていたが、動作する。
discypus 3:b585283f5932 18 *SCB_DEMCR |= TRCENA;
discypus 3:b585283f5932 19 *DWT_CONTROL |= CYCCNTENA;
discypus 3:b585283f5932 20 *DWT_CYCCNT = 0; // reset the counter
discypus 3:b585283f5932 21 // } else {
discypus 3:b585283f5932 22 // NOT supported DWT_CYCCNT
discypus 3:b585283f5932 23 // pc.printf("NOT supported DWT_CYCCNT\r\n");
discypus 3:b585283f5932 24 // }
discypus 3:b585283f5932 25 }
discypus 3:b585283f5932 26 static inline uint32_t getDwtCyccnt(void)
discypus 3:b585283f5932 27 {
discypus 3:b585283f5932 28 return *DWT_CYCCNT;
discypus 3:b585283f5932 29 }
discypus 3:b585283f5932 30
discypus 0:9750a875cbda 31 /** Serial port for DEBUG */
discypus 0:9750a875cbda 32 Serial pc(USBTX, USBRX);
discypus 0:9750a875cbda 33
discypus 0:9750a875cbda 34 DigitalIn user_button(USER_BUTTON);
discypus 0:9750a875cbda 35
discypus 0:9750a875cbda 36 /** */
discypus 0:9750a875cbda 37 SPI spi(SPI_MOSI, SPI_MISO, SPI_SCK);
discypus 0:9750a875cbda 38
discypus 0:9750a875cbda 39 /** */
discypus 0:9750a875cbda 40 DigitalOut cs(SPI_CS);
discypus 0:9750a875cbda 41
discypus 0:9750a875cbda 42 /**
discypus 0:9750a875cbda 43 * USERボタンが押されるまで待つ。
discypus 0:9750a875cbda 44 */
discypus 0:9750a875cbda 45 void
discypus 0:9750a875cbda 46 wait_until_user_button_pressed() {
discypus 0:9750a875cbda 47 while (user_button) {
discypus 0:9750a875cbda 48 __nop();
discypus 0:9750a875cbda 49 }
discypus 0:9750a875cbda 50 pc.printf("USER button is pressed\r\n");
discypus 0:9750a875cbda 51 wait(0.2);
discypus 0:9750a875cbda 52 }
discypus 0:9750a875cbda 53
discypus 3:b585283f5932 54 /**
discypus 3:b585283f5932 55 * 動作確認のために、spiオブジェクトを直接使って読み書きする。
discypus 3:b585283f5932 56 * @pre SPI初期化ずみであること。
discypus 3:b585283f5932 57 */
discypus 3:b585283f5932 58 void
discypus 3:b585283f5932 59 try_single_byte_access() {
discypus 3:b585283f5932 60 const uint32_t address = 0u;
discypus 3:b585283f5932 61 const uint8_t address_high = (address >> (8 * 2)) & 0xFFu;
discypus 3:b585283f5932 62 const uint8_t address_mid = (address >> (8 * 1)) & 0xFFu;
discypus 3:b585283f5932 63 const uint8_t address_low = (address >> (8 * 0)) & 0xFFu;
discypus 3:b585283f5932 64
discypus 3:b585283f5932 65 const uint8_t command_write = 0x02u;
discypus 3:b585283f5932 66 const uint8_t command_read = 0x03u;
discypus 3:b585283f5932 67
discypus 3:b585283f5932 68 const uint8_t data = 0x55;
discypus 3:b585283f5932 69
discypus 3:b585283f5932 70 static uint32_t cpuCounter[100] = {};
discypus 3:b585283f5932 71 size_t counterIndex = 0;
discypus 3:b585283f5932 72 enableDwtCyccnt();
discypus 3:b585283f5932 73
discypus 3:b585283f5932 74 // 1byte write
discypus 3:b585283f5932 75 cpuCounter[counterIndex++] = getDwtCyccnt();
discypus 3:b585283f5932 76 cs = 0; cpuCounter[counterIndex++] = getDwtCyccnt();
discypus 3:b585283f5932 77 spi.write(command_write); cpuCounter[counterIndex++] = getDwtCyccnt();
discypus 3:b585283f5932 78 spi.write(address_high); cpuCounter[counterIndex++] = getDwtCyccnt();
discypus 3:b585283f5932 79 spi.write(address_mid); cpuCounter[counterIndex++] = getDwtCyccnt();
discypus 3:b585283f5932 80 spi.write(address_low); cpuCounter[counterIndex++] = getDwtCyccnt();
discypus 3:b585283f5932 81 spi.write(data); cpuCounter[counterIndex++] = getDwtCyccnt(); // 3:CS Hold Time 50ns(min)=1cycle(20MHz)
discypus 3:b585283f5932 82 cs = 1; cpuCounter[counterIndex++] = getDwtCyccnt();
discypus 3:b585283f5932 83
discypus 3:b585283f5932 84 // 1byte read
discypus 3:b585283f5932 85 cs = 0; cpuCounter[counterIndex++] = getDwtCyccnt(); // 2:CS setup time 25ns(min)
discypus 3:b585283f5932 86 spi.write(command_read); cpuCounter[counterIndex++] = getDwtCyccnt();
discypus 3:b585283f5932 87 spi.write(address_high); cpuCounter[counterIndex++] = getDwtCyccnt();
discypus 3:b585283f5932 88 spi.write(address_mid); cpuCounter[counterIndex++] = getDwtCyccnt();
discypus 3:b585283f5932 89 spi.write(address_low); cpuCounter[counterIndex++] = getDwtCyccnt();
discypus 3:b585283f5932 90 const uint8_t value = spi.write(0); cpuCounter[counterIndex++] = getDwtCyccnt(); // 3:CS Hold Time 50ns(min)
discypus 3:b585283f5932 91 cs = 1; cpuCounter[counterIndex++] = getDwtCyccnt();
discypus 3:b585283f5932 92
discypus 3:b585283f5932 93 pc.printf("single byte access test: result\r\n");
discypus 3:b585283f5932 94 pc.printf(" write: %02x -> read: %02x\r\n", data, value);
discypus 3:b585283f5932 95
discypus 3:b585283f5932 96 pc.printf("CPU Cycle counter\r\n");
discypus 3:b585283f5932 97 for (int i = 1; i < counterIndex; i++) {
discypus 3:b585283f5932 98 const float ns = (cpuCounter[i] - cpuCounter[i - 1]) / (float)SystemCoreClock * 1.0e9;
discypus 3:b585283f5932 99 pc.printf(" %02d = %.3f\r\n", i, ns);
discypus 3:b585283f5932 100 }
discypus 3:b585283f5932 101 }
discypus 3:b585283f5932 102
discypus 0:9750a875cbda 103 /*
discypus 1:4b45ee2c9b51 104 * SPI COMMAND (Microchip 23LC1024, 23K256 SPI SRAM)
discypus 0:9750a875cbda 105 */
discypus 3:b585283f5932 106 enum Microchip23LC1024Commnd {
discypus 0:9750a875cbda 107 READ = 0x03u,
discypus 0:9750a875cbda 108 WRITE = 0x02u,
discypus 0:9750a875cbda 109 EDIO = 0x3bu,
discypus 0:9750a875cbda 110 EQIO = 0x38u,
discypus 0:9750a875cbda 111 RSTIO = 0xffu,
discypus 3:b585283f5932 112 RDMR = 0x05u,
discypus 3:b585283f5932 113 WRMR = 0x01u,
discypus 0:9750a875cbda 114 };
discypus 0:9750a875cbda 115
discypus 1:4b45ee2c9b51 116 /** SRAM Mode (Microchip 23LC1024, 23K256 SPI SRAM) */
discypus 3:b585283f5932 117 enum Microchip23LC1024Mode {
discypus 0:9750a875cbda 118 MODE_MASK = 0xc0u,
discypus 0:9750a875cbda 119 BYTE = 0x00u,
discypus 0:9750a875cbda 120 SEQUENTIAL = 0x40u, // default operation
discypus 0:9750a875cbda 121 PAGE = 0x80u,
discypus 1:4b45ee2c9b51 122 RESERVED = 0xC0u,
discypus 0:9750a875cbda 123 };
discypus 0:9750a875cbda 124
discypus 0:9750a875cbda 125 /**
discypus 0:9750a875cbda 126 * assert CS
discypus 0:9750a875cbda 127 */
discypus 0:9750a875cbda 128 inline void
discypus 0:9750a875cbda 129 assert_CS() {
discypus 0:9750a875cbda 130 cs = 0;
discypus 0:9750a875cbda 131 }
discypus 0:9750a875cbda 132
discypus 0:9750a875cbda 133 /**
discypus 0:9750a875cbda 134 * negate CS
discypus 0:9750a875cbda 135 */
discypus 0:9750a875cbda 136 inline void
discypus 0:9750a875cbda 137 negate_CS() {
discypus 0:9750a875cbda 138 cs = 1;
discypus 0:9750a875cbda 139 }
discypus 0:9750a875cbda 140
discypus 0:9750a875cbda 141 /**
discypus 3:b585283f5932 142 * モードレジスタ読みだし
discypus 0:9750a875cbda 143 * @return レジスタ値
discypus 0:9750a875cbda 144 */
discypus 0:9750a875cbda 145 inline uint8_t
discypus 3:b585283f5932 146 read_mode_register() {
discypus 0:9750a875cbda 147 assert_CS();
discypus 3:b585283f5932 148 spi.write(RDMR);
discypus 3:b585283f5932 149 const uint8_t mode = spi.write(0x00);
discypus 0:9750a875cbda 150 negate_CS();
discypus 0:9750a875cbda 151
discypus 3:b585283f5932 152 return mode;
discypus 0:9750a875cbda 153 }
discypus 0:9750a875cbda 154
discypus 0:9750a875cbda 155 /**
discypus 3:b585283f5932 156 * モードレジスタ書き込み
discypus 3:b585283f5932 157 * @param[in] mode
discypus 0:9750a875cbda 158 */
discypus 0:9750a875cbda 159 inline void
discypus 3:b585283f5932 160 write_mode_register(const uint8_t mode) {
discypus 0:9750a875cbda 161 assert_CS();
discypus 3:b585283f5932 162 spi.write(WRMR);
discypus 3:b585283f5932 163 spi.write(mode);
discypus 0:9750a875cbda 164 negate_CS();
discypus 0:9750a875cbda 165 }
discypus 0:9750a875cbda 166
discypus 0:9750a875cbda 167 /**
discypus 0:9750a875cbda 168 * モードを切り替える。
discypus 0:9750a875cbda 169 * @param[in] mode モード
discypus 0:9750a875cbda 170 * @return 切替前のモード
discypus 3:b585283f5932 171 * @invariant レジスタ中のモード以外のフラグは変更しない。
discypus 0:9750a875cbda 172 */
discypus 0:9750a875cbda 173 inline uint8_t
discypus 0:9750a875cbda 174 change_mode(const unsigned int next_mode) {
discypus 3:b585283f5932 175 const uint8_t previous_register = read_mode_register();
discypus 3:b585283f5932 176 const uint8_t previous_mode = previous_register & MODE_MASK;
discypus 0:9750a875cbda 177 if (next_mode != previous_mode) {
discypus 3:b585283f5932 178 const uint8_t next_register = (previous_register & ~MODE_MASK) | uint8_t(next_mode);
discypus 3:b585283f5932 179 write_mode_register(next_register);
discypus 0:9750a875cbda 180 }
discypus 0:9750a875cbda 181 return previous_mode;
discypus 0:9750a875cbda 182 }
discypus 0:9750a875cbda 183
discypus 0:9750a875cbda 184 /**
discypus 0:9750a875cbda 185 * 1byte read
discypus 2:e0d7ea47d2a5 186 * @param[in] address アドレス 24bit
discypus 0:9750a875cbda 187 * @return データ
discypus 0:9750a875cbda 188 */
discypus 0:9750a875cbda 189 uint8_t
discypus 0:9750a875cbda 190 read_byte(const uint32_t address) {
discypus 0:9750a875cbda 191 const uint8_t address_high = (address >> (8 * 2)) & 0xFFu;
discypus 0:9750a875cbda 192 const uint8_t address_mid = (address >> (8 * 1)) & 0xFFu;
discypus 0:9750a875cbda 193 const uint8_t address_low = (address >> (8 * 0)) & 0xFFu;
discypus 0:9750a875cbda 194
discypus 0:9750a875cbda 195 assert_CS();
discypus 0:9750a875cbda 196 spi.write(READ);
discypus 0:9750a875cbda 197 spi.write(address_high);
discypus 0:9750a875cbda 198 spi.write(address_mid);
discypus 0:9750a875cbda 199 spi.write(address_low);
discypus 0:9750a875cbda 200 const uint8_t data = spi.write(0);
discypus 0:9750a875cbda 201 negate_CS();
discypus 0:9750a875cbda 202
discypus 0:9750a875cbda 203 return data;
discypus 0:9750a875cbda 204 }
discypus 0:9750a875cbda 205
discypus 0:9750a875cbda 206 /**
discypus 0:9750a875cbda 207 * 1byte write
discypus 2:e0d7ea47d2a5 208 * @param[in] address アドレス 24bit
discypus 0:9750a875cbda 209 * @param[in] data データ
discypus 0:9750a875cbda 210 */
discypus 0:9750a875cbda 211 void
discypus 0:9750a875cbda 212 write_byte(const uint32_t address, const uint8_t data) {
discypus 0:9750a875cbda 213 const uint8_t address_high = (address >> (8 * 2)) & 0xFFu;
discypus 0:9750a875cbda 214 const uint8_t address_mid = (address >> (8 * 1)) & 0xFFu;
discypus 0:9750a875cbda 215 const uint8_t address_low = (address >> (8 * 0)) & 0xFFu;
discypus 0:9750a875cbda 216
discypus 0:9750a875cbda 217 assert_CS();
discypus 0:9750a875cbda 218 spi.write(WRITE);
discypus 0:9750a875cbda 219 spi.write(address_high);
discypus 0:9750a875cbda 220 spi.write(address_mid);
discypus 0:9750a875cbda 221 spi.write(address_low);
discypus 0:9750a875cbda 222 spi.write(data);
discypus 0:9750a875cbda 223 negate_CS();
discypus 0:9750a875cbda 224 }
discypus 0:9750a875cbda 225
discypus 0:9750a875cbda 226 /**
discypus 0:9750a875cbda 227 * 連続読み出し
discypus 2:e0d7ea47d2a5 228 * @pre sequentialモードかpageモードに切り替えていること。
discypus 0:9750a875cbda 229 */
discypus 0:9750a875cbda 230 void
discypus 0:9750a875cbda 231 read_bytes(const uint32_t address, uint8_t __restrict data[], const uint32_t size) {
discypus 0:9750a875cbda 232 const uint8_t address_high = (address >> (8 * 2)) & 0xFFu;
discypus 0:9750a875cbda 233 const uint8_t address_mid = (address >> (8 * 1)) & 0xFFu;
discypus 0:9750a875cbda 234 const uint8_t address_low = (address >> (8 * 0)) & 0xFFu;
discypus 0:9750a875cbda 235
discypus 0:9750a875cbda 236 assert_CS();
discypus 0:9750a875cbda 237 spi.write(READ);
discypus 0:9750a875cbda 238 spi.write(address_high);
discypus 0:9750a875cbda 239 spi.write(address_mid);
discypus 0:9750a875cbda 240 spi.write(address_low);
discypus 0:9750a875cbda 241 for (uint32_t i = 0; i < size; ++i) {
discypus 0:9750a875cbda 242 data[i] = spi.write(0x00);
discypus 0:9750a875cbda 243 }
discypus 0:9750a875cbda 244 negate_CS();
discypus 0:9750a875cbda 245 }
discypus 0:9750a875cbda 246
discypus 0:9750a875cbda 247 /**
discypus 0:9750a875cbda 248 * 連続書き込み
discypus 2:e0d7ea47d2a5 249 * @pre sequentialモードかpageモードに切り替えていること。
discypus 0:9750a875cbda 250 */
discypus 0:9750a875cbda 251 void
discypus 0:9750a875cbda 252 write_bytes(const uint32_t address, const uint8_t __restrict data[], const uint32_t size) {
discypus 0:9750a875cbda 253 const uint8_t address_high = (address >> (8 * 2)) & 0xFFu;
discypus 0:9750a875cbda 254 const uint8_t address_mid = (address >> (8 * 1)) & 0xFFu;
discypus 0:9750a875cbda 255 const uint8_t address_low = (address >> (8 * 0)) & 0xFFu;
discypus 0:9750a875cbda 256
discypus 0:9750a875cbda 257 assert_CS();
discypus 0:9750a875cbda 258 spi.write(WRITE);
discypus 0:9750a875cbda 259 spi.write(address_high);
discypus 0:9750a875cbda 260 spi.write(address_mid);
discypus 0:9750a875cbda 261 spi.write(address_low);
discypus 0:9750a875cbda 262 for (uint32_t i = 0; i < size; ++i) {
discypus 0:9750a875cbda 263 spi.write(data[i]);
discypus 0:9750a875cbda 264 }
discypus 0:9750a875cbda 265 negate_CS();
discypus 0:9750a875cbda 266 }
discypus 0:9750a875cbda 267
discypus 0:9750a875cbda 268 /*
discypus 0:9750a875cbda 269 *
discypus 0:9750a875cbda 270 */
discypus 0:9750a875cbda 271
discypus 0:9750a875cbda 272
discypus 0:9750a875cbda 273 /** 動作確認用 SPI buffer */
discypus 0:9750a875cbda 274 uint8_t buf[256] = {};
discypus 0:9750a875cbda 275
discypus 0:9750a875cbda 276 /**
discypus 2:e0d7ea47d2a5 277 * byteアクセスを複数回実行して、照合する
discypus 0:9750a875cbda 278 */
discypus 0:9750a875cbda 279 void
discypus 0:9750a875cbda 280 try_byte_access() {
discypus 0:9750a875cbda 281 const uint8_t size = 16;
discypus 0:9750a875cbda 282
discypus 0:9750a875cbda 283 // write data
discypus 0:9750a875cbda 284 for (int i = 0; i < size; i++) {
discypus 0:9750a875cbda 285 write_byte(i, i);
discypus 0:9750a875cbda 286 }
discypus 0:9750a875cbda 287
discypus 0:9750a875cbda 288 // read data
discypus 0:9750a875cbda 289 for (int i = 0; i < size; i++) {
discypus 0:9750a875cbda 290 buf[i] = read_byte(i);
discypus 0:9750a875cbda 291 }
discypus 0:9750a875cbda 292
discypus 0:9750a875cbda 293 // show data (to SERIAL)
discypus 0:9750a875cbda 294 pc.printf("byte access test: result\r\n");
discypus 0:9750a875cbda 295 for (int i = 0; i < size; i++) {
discypus 0:9750a875cbda 296 pc.printf(" %04x : %02x %s\r\n", i, buf[i], (buf[i] ==i)?"OK":"BAD");
discypus 0:9750a875cbda 297 }
discypus 0:9750a875cbda 298 }
discypus 0:9750a875cbda 299
discypus 0:9750a875cbda 300 /**
discypus 2:e0d7ea47d2a5 301 * pageアクセスを実行して、照合する
discypus 0:9750a875cbda 302 */
discypus 0:9750a875cbda 303 void
discypus 0:9750a875cbda 304 try_page_access() {
discypus 0:9750a875cbda 305 const uint32_t address = 0x1000;
discypus 2:e0d7ea47d2a5 306 const uint32_t page_size = 32;
discypus 0:9750a875cbda 307
discypus 0:9750a875cbda 308 // write
discypus 2:e0d7ea47d2a5 309 for (uint32_t i = 0; i < page_size; ++i) {
discypus 0:9750a875cbda 310 buf[i] = i;
discypus 0:9750a875cbda 311 }
discypus 2:e0d7ea47d2a5 312 write_bytes(address, buf, page_size);
discypus 0:9750a875cbda 313
discypus 0:9750a875cbda 314 // read
discypus 2:e0d7ea47d2a5 315 for (uint32_t i = 0; i < page_size; ++i) {
discypus 0:9750a875cbda 316 buf[i] = 0;
discypus 0:9750a875cbda 317 }
discypus 0:9750a875cbda 318
discypus 2:e0d7ea47d2a5 319 read_bytes(address, buf, page_size);
discypus 0:9750a875cbda 320
discypus 0:9750a875cbda 321 // show data (to SERIAL)
discypus 0:9750a875cbda 322 pc.printf("page access test: result\r\n");
discypus 2:e0d7ea47d2a5 323 for (int i = 0; i < page_size; i++) {
discypus 0:9750a875cbda 324 pc.printf(" %04x : %02x %s\r\n", address + i, buf[i], (buf[i] ==i)?"OK":"BAD");
discypus 0:9750a875cbda 325 }
discypus 0:9750a875cbda 326 }
discypus 0:9750a875cbda 327
discypus 0:9750a875cbda 328 /**
discypus 2:e0d7ea47d2a5 329 * sequentialアクセスを実行して、照合する
discypus 0:9750a875cbda 330 */
discypus 0:9750a875cbda 331 void
discypus 0:9750a875cbda 332 try_sequential_access() {
discypus 0:9750a875cbda 333 const uint32_t address = 0x2000;
discypus 0:9750a875cbda 334 const uint32_t size = 256;
discypus 0:9750a875cbda 335
discypus 0:9750a875cbda 336 // write
discypus 0:9750a875cbda 337 for (uint32_t i = 0; i < size; ++i) {
discypus 0:9750a875cbda 338 buf[i] = i;
discypus 0:9750a875cbda 339 }
discypus 0:9750a875cbda 340
discypus 0:9750a875cbda 341 write_bytes(address, buf, size);
discypus 0:9750a875cbda 342
discypus 0:9750a875cbda 343 // read
discypus 0:9750a875cbda 344 for (uint32_t i = 0; i < size; ++i) {
discypus 0:9750a875cbda 345 buf[i] = 0;
discypus 0:9750a875cbda 346 }
discypus 0:9750a875cbda 347
discypus 0:9750a875cbda 348 read_bytes(address, buf, size);
discypus 0:9750a875cbda 349
discypus 0:9750a875cbda 350 // show data (to SERIAL)
discypus 0:9750a875cbda 351 pc.printf("sequential access test: result\r\n");
discypus 0:9750a875cbda 352 for (int i = 0; i < size; i++) {
discypus 0:9750a875cbda 353 pc.printf(" %04x : %02x %s\r\n", address + i, buf[i], (buf[i] ==i)?"OK":"BAD");
discypus 0:9750a875cbda 354 }
discypus 0:9750a875cbda 355 }
discypus 0:9750a875cbda 356
discypus 0:9750a875cbda 357 /**
discypus 0:9750a875cbda 358 * 動作確認用。TODO: テストコードにすること。
discypus 0:9750a875cbda 359 */
discypus 0:9750a875cbda 360 int
discypus 0:9750a875cbda 361 main()
discypus 0:9750a875cbda 362 {
discypus 0:9750a875cbda 363 pc.baud(115200);
discypus 0:9750a875cbda 364 pc.printf("CPU SystemCoreClock is %.2f MHz\r\n", (float)SystemCoreClock/1.0e6f);
discypus 0:9750a875cbda 365
discypus 0:9750a875cbda 366 // initialize SPI
discypus 0:9750a875cbda 367 spi.format(8, 0); // 8bit, mode=0
discypus 0:9750a875cbda 368 spi.frequency(20 * 1000 * 1000); // max 20MHz
discypus 0:9750a875cbda 369 negate_CS();
discypus 0:9750a875cbda 370
discypus 3:b585283f5932 371 // read mode
discypus 3:b585283f5932 372 pc.printf("\r\nread mode register\r\n");
discypus 3:b585283f5932 373 const uint8_t mode = read_mode_register();
discypus 3:b585283f5932 374 pc.printf(" mode register = %02x\r\n", mode);
discypus 3:b585283f5932 375
discypus 0:9750a875cbda 376 // test
discypus 0:9750a875cbda 377 pc.printf("\r\npush user button to start: try_single_byte_access\r\n");
discypus 0:9750a875cbda 378 wait_until_user_button_pressed();
discypus 0:9750a875cbda 379 try_single_byte_access();
discypus 0:9750a875cbda 380
discypus 1:4b45ee2c9b51 381 pc.printf("\r\npush user button to start: try_sequential_access (default)\r\n");
discypus 1:4b45ee2c9b51 382 wait_until_user_button_pressed();
discypus 1:4b45ee2c9b51 383 try_sequential_access();
discypus 1:4b45ee2c9b51 384
discypus 0:9750a875cbda 385 pc.printf("\r\npush user button to start: try_byte_access\r\n");
discypus 0:9750a875cbda 386 wait_until_user_button_pressed();
discypus 1:4b45ee2c9b51 387 change_mode(BYTE);
discypus 0:9750a875cbda 388 try_byte_access();
discypus 0:9750a875cbda 389
discypus 0:9750a875cbda 390 pc.printf("\r\npush user button to start: try_page_access\r\n");
discypus 0:9750a875cbda 391 wait_until_user_button_pressed();
discypus 1:4b45ee2c9b51 392 change_mode(PAGE);
discypus 0:9750a875cbda 393 try_page_access();
discypus 0:9750a875cbda 394
discypus 0:9750a875cbda 395 pc.printf("\r\npush user button to start: try_sequential_access\r\n");
discypus 0:9750a875cbda 396 wait_until_user_button_pressed();
discypus 1:4b45ee2c9b51 397 change_mode(SEQUENTIAL);
discypus 0:9750a875cbda 398 try_sequential_access();
discypus 0:9750a875cbda 399
discypus 0:9750a875cbda 400 pc.printf("\r\nTEST END\r\n\r\n");
discypus 0:9750a875cbda 401
discypus 0:9750a875cbda 402 for(;;) {
discypus 0:9750a875cbda 403 }
discypus 0:9750a875cbda 404 }