mbed_example / Mbed OS mbed-os-example-qspi
Committer:
Maciej Bocianski
Date:
Tue Sep 04 09:46:36 2018 +0200
Revision:
5:da509493e3e6
Parent:
2:3165b07182ad
Child:
6:3a643419d247
code refactoring and astyle formatting

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Senthil Ramakrishnan 0:f741508e07a3 1 #include "mbed.h"
Senthil Ramakrishnan 0:f741508e07a3 2 #include "QSPI.h"
Senthil Ramakrishnan 0:f741508e07a3 3
Senthil Ramakrishnan 0:f741508e07a3 4 // The below values are command codes defined in Datasheet for MX25R6435F Macronix Flash Memory
Maciej Bocianski 2:3165b07182ad 5 // should work for whole MX25RXX35F chip family
Maciej Bocianski 2:3165b07182ad 6
Senthil Ramakrishnan 0:f741508e07a3 7 // Command for reading status register
Senthil Ramakrishnan 0:f741508e07a3 8 #define QSPI_STD_CMD_RDSR 0x05
Maciej Bocianski 2:3165b07182ad 9 // Command for reading configuration register
Maciej Bocianski 2:3165b07182ad 10 #define QSPI_STD_CMD_RDCR 0x15
Maciej Bocianski 2:3165b07182ad 11 // Command for writing status/configuration register
Senthil Ramakrishnan 0:f741508e07a3 12 #define QSPI_STD_CMD_WRSR 0x01
Senthil Ramakrishnan 0:f741508e07a3 13 // Command for setting WREN (supported only by some memories)
Senthil Ramakrishnan 0:f741508e07a3 14 #define QSPI_STD_CMD_WREN 0x06
Senthil Ramakrishnan 0:f741508e07a3 15 // Command for Sector erase (supported only by some memories)
Senthil Ramakrishnan 0:f741508e07a3 16 #define QSPI_STD_CMD_SECT_ERASE 0x20
Maciej Bocianski 2:3165b07182ad 17 //
Maciej Bocianski 2:3165b07182ad 18 #define QSPI_STD_CMD_WRITE_1IO 0x02 // 1-1-1 mode
Maciej Bocianski 2:3165b07182ad 19 #define QSPI_STD_CMD_WRITE_4IO 0x38 // 1-4-4 mode
Maciej Bocianski 2:3165b07182ad 20 #define QSPI_STD_CMD_READ_1IO 0x03 // 1-1-1 mode
Maciej Bocianski 2:3165b07182ad 21 #define QSPI_STD_CMD_READ_4IO 0xEB // 1-4-4 mode
Maciej Bocianski 2:3165b07182ad 22
Maciej Bocianski 2:3165b07182ad 23 #define QSPI_STD_CMD_RSTEN 0x66
Maciej Bocianski 2:3165b07182ad 24 // Command for setting Reset (supported only by some memories)
Maciej Bocianski 2:3165b07182ad 25 #define QSPI_STD_CMD_RST 0x99
Maciej Bocianski 2:3165b07182ad 26
Maciej Bocianski 2:3165b07182ad 27 #define STATUS_BIT_WIP (1 << 0) // write in progress bit
Maciej Bocianski 2:3165b07182ad 28 #define STATUS_BIT_QE (1 << 6) // Quad Enable
Maciej Bocianski 2:3165b07182ad 29
Maciej Bocianski 2:3165b07182ad 30 #define QSPI_STATUS_REG_SIZE 1
Maciej Bocianski 2:3165b07182ad 31
Maciej Bocianski 2:3165b07182ad 32 #define QSPI_READ_4IO_DUMMY_CYCLE 6
Maciej Bocianski 2:3165b07182ad 33
Maciej Bocianski 2:3165b07182ad 34 #define QSPI_MAX_WAIT_TIME 1000 // 1000 ms
Maciej Bocianski 2:3165b07182ad 35
Maciej Bocianski 5:da509493e3e6 36 #define TEST_FLASH_ADDRESS 0x1000
Senthil Ramakrishnan 0:f741508e07a3 37
Senthil Ramakrishnan 0:f741508e07a3 38 //#define DEBUG_ON 1
Senthil Ramakrishnan 0:f741508e07a3 39 #ifdef DEBUG_ON
Maciej Bocianski 2:3165b07182ad 40 #define VERBOSE_PRINT(x) printf x
Maciej Bocianski 2:3165b07182ad 41 #else
Maciej Bocianski 2:3165b07182ad 42 #define VERBOSE_PRINT(x)
Senthil Ramakrishnan 0:f741508e07a3 43 #endif
Senthil Ramakrishnan 0:f741508e07a3 44
Maciej Bocianski 2:3165b07182ad 45 bool InitializeFlashMem(QSPI &qspi);
Maciej Bocianski 2:3165b07182ad 46 bool WaitForMemReady(QSPI &qspi);
Maciej Bocianski 2:3165b07182ad 47 bool SectorErase(QSPI &qspi, unsigned int flash_addr);
Maciej Bocianski 2:3165b07182ad 48 bool WriteReadQuad(QSPI &qspi, unsigned int flash_addr);
Maciej Bocianski 2:3165b07182ad 49 bool QuadEnable(QSPI &qspi);
Maciej Bocianski 2:3165b07182ad 50 bool QuadDisable(QSPI &qspi);
Maciej Bocianski 2:3165b07182ad 51
Maciej Bocianski 2:3165b07182ad 52
Senthil Ramakrishnan 0:f741508e07a3 53 // main() runs in its own thread in the OS
Maciej Bocianski 2:3165b07182ad 54 int main()
Maciej Bocianski 2:3165b07182ad 55 {
Maciej Bocianski 2:3165b07182ad 56 printf(">>> Start...\r\n");
Maciej Bocianski 5:da509493e3e6 57 QSPI myQspi((PinName)QSPI_FLASH1_IO0, (PinName)QSPI_FLASH1_IO1, (PinName)QSPI_FLASH1_IO2,
Maciej Bocianski 5:da509493e3e6 58 (PinName)QSPI_FLASH1_IO3, (PinName)QSPI_FLASH1_SCK, (PinName)QSPI_FLASH1_CSN);
Maciej Bocianski 2:3165b07182ad 59
Maciej Bocianski 2:3165b07182ad 60 if (false == InitializeFlashMem(myQspi)) {
Maciej Bocianski 2:3165b07182ad 61 printf("[main] Unable to initialize flash memory, tests failed\r\n");
Senthil Ramakrishnan 0:f741508e07a3 62 return -1;
Senthil Ramakrishnan 0:f741508e07a3 63 }
Maciej Bocianski 2:3165b07182ad 64
Maciej Bocianski 2:3165b07182ad 65 if (false == WriteReadQuad(myQspi, TEST_FLASH_ADDRESS)) {
Maciej Bocianski 2:3165b07182ad 66 printf("[main] Unable to read/write using QuadSPI\r\n");
Senthil Ramakrishnan 0:f741508e07a3 67 return -1;
Senthil Ramakrishnan 0:f741508e07a3 68 }
Maciej Bocianski 2:3165b07182ad 69
Maciej Bocianski 5:da509493e3e6 70 printf("<<< Done...\r\n\r\n");
Senthil Ramakrishnan 0:f741508e07a3 71 }
Senthil Ramakrishnan 0:f741508e07a3 72
Maciej Bocianski 2:3165b07182ad 73 bool WriteReadQuad(QSPI &qspi, unsigned int flash_addr)
Senthil Ramakrishnan 0:f741508e07a3 74 {
Senthil Ramakrishnan 0:f741508e07a3 75 int result = 0;
Maciej Bocianski 2:3165b07182ad 76 char tx_buf[] = { 'H', 'E', 'L', 'L', 'O', ' ', 'Q', 'U', 'A', 'D', '-', 'S', 'P', 'I', '!', 0 };
Maciej Bocianski 2:3165b07182ad 77 char rx_buf[16];
Senthil Ramakrishnan 0:f741508e07a3 78 size_t buf_len = sizeof(tx_buf);
Maciej Bocianski 2:3165b07182ad 79
Maciej Bocianski 2:3165b07182ad 80 if (false == SectorErase(qspi, flash_addr)) {
Maciej Bocianski 2:3165b07182ad 81 printf("[WriteReadQuad] ERROR: SectorErase failed(addr = 0x%08lX)\r\n", flash_addr);
Maciej Bocianski 2:3165b07182ad 82 return false;
Maciej Bocianski 2:3165b07182ad 83 }
Maciej Bocianski 2:3165b07182ad 84
Maciej Bocianski 2:3165b07182ad 85 if (false == QuadEnable(qspi)) {
Maciej Bocianski 2:3165b07182ad 86 printf("[WriteReadQuad] ERROR: Quad enable failed\r\n");
Senthil Ramakrishnan 0:f741508e07a3 87 return false;
Senthil Ramakrishnan 0:f741508e07a3 88 }
Maciej Bocianski 2:3165b07182ad 89
Maciej Bocianski 2:3165b07182ad 90 // Send write enable
Maciej Bocianski 2:3165b07182ad 91 if (QSPI_STATUS_OK == qspi.command_transfer(QSPI_STD_CMD_WREN, // command to send
Maciej Bocianski 2:3165b07182ad 92 -1, // no address to transmit
Maciej Bocianski 2:3165b07182ad 93 NULL, 0, // do not transmit
Maciej Bocianski 2:3165b07182ad 94 NULL, 0)) { // do not receive
Maciej Bocianski 2:3165b07182ad 95 VERBOSE_PRINT(("[WriteReadQuad] Sending WREN command success\r\n"));
Maciej Bocianski 2:3165b07182ad 96 } else {
Maciej Bocianski 2:3165b07182ad 97 printf("[WriteReadQuad] ERROR: Sending WREN command failed\r\n");
Maciej Bocianski 2:3165b07182ad 98 return false;
Maciej Bocianski 2:3165b07182ad 99 }
Maciej Bocianski 2:3165b07182ad 100
Maciej Bocianski 5:da509493e3e6 101 if (QSPI_STATUS_OK == qspi.configure_format(QSPI_CFG_BUS_SINGLE, QSPI_CFG_BUS_QUAD, QSPI_CFG_ADDR_SIZE_24,
Maciej Bocianski 5:da509493e3e6 102 QSPI_CFG_BUS_QUAD, QSPI_CFG_ALT_SIZE_8, QSPI_CFG_BUS_QUAD, 0)) {
Maciej Bocianski 5:da509493e3e6 103 printf("Configured QSPI driver succesfully: 1-4-4\r\n");
Maciej Bocianski 2:3165b07182ad 104 } else {
Maciej Bocianski 2:3165b07182ad 105 printf("[WriteReadQuad] ERROR: Failed configuring QSPI driver\r\n");
Maciej Bocianski 2:3165b07182ad 106 return -1;
Maciej Bocianski 2:3165b07182ad 107 }
Maciej Bocianski 2:3165b07182ad 108
Maciej Bocianski 5:da509493e3e6 109 printf("Writing: %s\r\n", tx_buf);
Maciej Bocianski 2:3165b07182ad 110 result = qspi.write(QSPI_STD_CMD_WRITE_4IO, 0, flash_addr, tx_buf, &buf_len);
Maciej Bocianski 2:3165b07182ad 111 if ((result != QSPI_STATUS_OK) || buf_len != sizeof(tx_buf)) {
Maciej Bocianski 2:3165b07182ad 112 printf("[WriteReadQuad] ERROR: Write failed\r\n");
Maciej Bocianski 2:3165b07182ad 113 }
Maciej Bocianski 2:3165b07182ad 114
Maciej Bocianski 2:3165b07182ad 115 if (false == WaitForMemReady(qspi)) {
Maciej Bocianski 2:3165b07182ad 116 printf("[WriteReadQuad] ERROR: Device not ready, tests failed\r\n");
Senthil Ramakrishnan 0:f741508e07a3 117 return false;
Senthil Ramakrishnan 0:f741508e07a3 118 }
Maciej Bocianski 2:3165b07182ad 119
Maciej Bocianski 5:da509493e3e6 120 // Set dummy cycle count for read operation
Maciej Bocianski 5:da509493e3e6 121 if (QSPI_STATUS_OK == qspi.configure_format(QSPI_CFG_BUS_SINGLE, QSPI_CFG_BUS_QUAD, QSPI_CFG_ADDR_SIZE_24,
Maciej Bocianski 5:da509493e3e6 122 QSPI_CFG_BUS_QUAD, QSPI_CFG_ALT_SIZE_8, QSPI_CFG_BUS_QUAD, QSPI_READ_4IO_DUMMY_CYCLE)) {
Maciej Bocianski 5:da509493e3e6 123 printf("Configured QSPI driver succesfully: dummy cycle set to 6\r\n");
Maciej Bocianski 2:3165b07182ad 124 } else {
Maciej Bocianski 2:3165b07182ad 125 printf("[WriteReadQuad] ERROR: Failed configuring QSPI driver\r\n");
Maciej Bocianski 2:3165b07182ad 126 return -1;
Senthil Ramakrishnan 0:f741508e07a3 127 }
Maciej Bocianski 2:3165b07182ad 128
Maciej Bocianski 2:3165b07182ad 129 memset(rx_buf, 0, sizeof(rx_buf));
Maciej Bocianski 2:3165b07182ad 130 result = qspi.read(QSPI_STD_CMD_READ_4IO, 0, flash_addr, rx_buf, &buf_len);
Maciej Bocianski 2:3165b07182ad 131 if (result != QSPI_STATUS_OK) {
Maciej Bocianski 2:3165b07182ad 132 printf("[WriteReadQuad] ERROR: Read failed\r\n");
Senthil Ramakrishnan 0:f741508e07a3 133 return false;
Senthil Ramakrishnan 0:f741508e07a3 134 }
Maciej Bocianski 2:3165b07182ad 135
Maciej Bocianski 2:3165b07182ad 136 if (buf_len != sizeof(rx_buf)) {
Maciej Bocianski 2:3165b07182ad 137 printf("[WriteReadQuad] ERROR: Unable to read the entire buffer\r\n");
Senthil Ramakrishnan 0:f741508e07a3 138 return false;
Senthil Ramakrishnan 0:f741508e07a3 139 }
Maciej Bocianski 2:3165b07182ad 140
Maciej Bocianski 2:3165b07182ad 141 if (0 != (memcmp(rx_buf, tx_buf, sizeof(rx_buf)))) {
Maciej Bocianski 2:3165b07182ad 142 printf("[WriteReadQuad] ERROR: Buffer contents are invalid\r\n");
Maciej Bocianski 2:3165b07182ad 143 printf("tx_buf: ");
Maciej Bocianski 2:3165b07182ad 144 for (uint32_t i = 0; i < buf_len; i++) {
Maciej Bocianski 2:3165b07182ad 145 printf("%d ", tx_buf[i]);
Maciej Bocianski 2:3165b07182ad 146 }
Maciej Bocianski 2:3165b07182ad 147 printf("\r\n");
Maciej Bocianski 2:3165b07182ad 148 printf("rx_buf: ");
Maciej Bocianski 2:3165b07182ad 149 for (uint32_t i = 0; i < buf_len; i++) {
Maciej Bocianski 2:3165b07182ad 150 printf("%d ", rx_buf[i]);
Maciej Bocianski 2:3165b07182ad 151 }
Maciej Bocianski 2:3165b07182ad 152 printf("\r\n");
Senthil Ramakrishnan 0:f741508e07a3 153 return false;
Senthil Ramakrishnan 0:f741508e07a3 154 }
Maciej Bocianski 5:da509493e3e6 155 printf("Read: %s\r\n", rx_buf);
Maciej Bocianski 5:da509493e3e6 156
Maciej Bocianski 5:da509493e3e6 157 // Reset dummy cycle count
Maciej Bocianski 5:da509493e3e6 158 if (QSPI_STATUS_OK == qspi.configure_format(QSPI_CFG_BUS_SINGLE, QSPI_CFG_BUS_QUAD, QSPI_CFG_ADDR_SIZE_24,
Maciej Bocianski 5:da509493e3e6 159 QSPI_CFG_BUS_QUAD, QSPI_CFG_ALT_SIZE_8, QSPI_CFG_BUS_QUAD, 0)) {
Maciej Bocianski 5:da509493e3e6 160 printf("Configured QSPI driver succesfully: dummy cycle set to 0\r\n");
Maciej Bocianski 5:da509493e3e6 161 } else {
Maciej Bocianski 5:da509493e3e6 162 printf("[WriteReadQuad] ERROR: Failed configuring QSPI driver\r\n");
Maciej Bocianski 5:da509493e3e6 163 return -1;
Maciej Bocianski 5:da509493e3e6 164 }
Maciej Bocianski 5:da509493e3e6 165
Maciej Bocianski 5:da509493e3e6 166 if (false == QuadDisable(qspi)) {
Maciej Bocianski 5:da509493e3e6 167 printf("[WriteReadQuad] ERROR: Quad disable failed\r\n");
Maciej Bocianski 5:da509493e3e6 168 return false;
Maciej Bocianski 5:da509493e3e6 169 }
Maciej Bocianski 2:3165b07182ad 170
Senthil Ramakrishnan 0:f741508e07a3 171 return true;
Senthil Ramakrishnan 0:f741508e07a3 172 }
Senthil Ramakrishnan 0:f741508e07a3 173
Maciej Bocianski 2:3165b07182ad 174 bool InitializeFlashMem(QSPI &qspi)
Senthil Ramakrishnan 0:f741508e07a3 175 {
Maciej Bocianski 2:3165b07182ad 176 char reg_data[QSPI_STATUS_REG_SIZE];
Maciej Bocianski 2:3165b07182ad 177
Maciej Bocianski 2:3165b07182ad 178 // Read the Status Register from device
Maciej Bocianski 2:3165b07182ad 179 if (QSPI_STATUS_OK == qspi.command_transfer(QSPI_STD_CMD_RDSR, // command to send
Maciej Bocianski 2:3165b07182ad 180 -1, // no address to transmit
Maciej Bocianski 2:3165b07182ad 181 NULL, 0, // do not transmit
Maciej Bocianski 2:3165b07182ad 182 reg_data, QSPI_STATUS_REG_SIZE)) {
Maciej Bocianski 2:3165b07182ad 183 VERBOSE_PRINT(("[InitializeFlashMem] Reading Status Register Success: value = 0x%02X\r\n", status_value[0]));
Senthil Ramakrishnan 0:f741508e07a3 184 } else {
Maciej Bocianski 2:3165b07182ad 185 printf("[InitializeFlashMem] ERROR: Reading Status Register failed\r\n");
Maciej Bocianski 2:3165b07182ad 186 return false;
Senthil Ramakrishnan 0:f741508e07a3 187 }
Maciej Bocianski 2:3165b07182ad 188
Maciej Bocianski 2:3165b07182ad 189 // Send Reset Enable
Maciej Bocianski 2:3165b07182ad 190 if (QSPI_STATUS_OK == qspi.command_transfer(QSPI_STD_CMD_RSTEN, // command to send
Maciej Bocianski 2:3165b07182ad 191 -1, // no address to transmit
Maciej Bocianski 2:3165b07182ad 192 NULL, 0, // do not transmit
Maciej Bocianski 2:3165b07182ad 193 NULL, 0)) { // do not receive
Maciej Bocianski 2:3165b07182ad 194 VERBOSE_PRINT(("[InitializeFlashMem] Sending RSTEN Success\r\n"));
Maciej Bocianski 2:3165b07182ad 195 } else {
Maciej Bocianski 2:3165b07182ad 196 printf("[InitializeFlashMem] ERROR: Sending RSTEN failed\r\n");
Maciej Bocianski 2:3165b07182ad 197 return false;
Senthil Ramakrishnan 0:f741508e07a3 198 }
Maciej Bocianski 2:3165b07182ad 199
Maciej Bocianski 2:3165b07182ad 200 // Reset device
Maciej Bocianski 2:3165b07182ad 201 if (QSPI_STATUS_OK == qspi.command_transfer(QSPI_STD_CMD_RST, // command to send
Maciej Bocianski 2:3165b07182ad 202 -1, // no address to transmit
Maciej Bocianski 2:3165b07182ad 203 NULL, 0, // do not transmit
Maciej Bocianski 2:3165b07182ad 204 NULL, 0)) { // do not receive
Maciej Bocianski 2:3165b07182ad 205 VERBOSE_PRINT(("[InitializeFlashMem] Sending RST Success\r\n"));
Maciej Bocianski 2:3165b07182ad 206 } else {
Maciej Bocianski 2:3165b07182ad 207 printf("[InitializeFlashMem] ERROR: Sending RST failed\r\n");
Maciej Bocianski 2:3165b07182ad 208 return false;
Maciej Bocianski 2:3165b07182ad 209 }
Maciej Bocianski 2:3165b07182ad 210
Maciej Bocianski 2:3165b07182ad 211 return true;
Senthil Ramakrishnan 0:f741508e07a3 212 }
Senthil Ramakrishnan 0:f741508e07a3 213
Maciej Bocianski 2:3165b07182ad 214 bool WaitForMemReady(QSPI &qspi)
Senthil Ramakrishnan 0:f741508e07a3 215 {
Maciej Bocianski 2:3165b07182ad 216 char status_value[QSPI_STATUS_REG_SIZE];
Maciej Bocianski 2:3165b07182ad 217 Timer timer;
Maciej Bocianski 2:3165b07182ad 218
Maciej Bocianski 2:3165b07182ad 219 timer.start();
Maciej Bocianski 2:3165b07182ad 220 do {
Maciej Bocianski 2:3165b07182ad 221 // Read the Status Register from device
Maciej Bocianski 2:3165b07182ad 222 if (QSPI_STATUS_OK == qspi.command_transfer(QSPI_STD_CMD_RDSR, // command to send
Maciej Bocianski 2:3165b07182ad 223 -1, // no address to transmit
Maciej Bocianski 2:3165b07182ad 224 NULL, 0, // do not transmit
Maciej Bocianski 2:3165b07182ad 225 status_value, QSPI_STATUS_REG_SIZE)) {
Maciej Bocianski 2:3165b07182ad 226 VERBOSE_PRINT(("[WaitForMemReady] Readng Status Register Success: value = 0x%02X\r\n", status_value[0]));
Senthil Ramakrishnan 0:f741508e07a3 227 } else {
Maciej Bocianski 2:3165b07182ad 228 printf("[WaitForMemReady] ERROR: Reading Status Register failed\r\n");
Senthil Ramakrishnan 0:f741508e07a3 229 }
Maciej Bocianski 2:3165b07182ad 230 } while ((status_value[0] & STATUS_BIT_WIP) != 0 && timer.read_ms() < QSPI_MAX_WAIT_TIME);
Maciej Bocianski 2:3165b07182ad 231
Maciej Bocianski 2:3165b07182ad 232 if ((status_value[0] & STATUS_BIT_WIP) != 0) {
Maciej Bocianski 2:3165b07182ad 233 return false;
Maciej Bocianski 2:3165b07182ad 234 }
Senthil Ramakrishnan 0:f741508e07a3 235 return true;
Senthil Ramakrishnan 0:f741508e07a3 236 }
Senthil Ramakrishnan 0:f741508e07a3 237
Maciej Bocianski 2:3165b07182ad 238 bool SectorErase(QSPI &qspi, unsigned int flash_addr)
Senthil Ramakrishnan 0:f741508e07a3 239 {
Maciej Bocianski 2:3165b07182ad 240 // Set wite enable
Maciej Bocianski 2:3165b07182ad 241 if (QSPI_STATUS_OK == qspi.command_transfer(QSPI_STD_CMD_WREN, // command to send
Maciej Bocianski 2:3165b07182ad 242 -1, // no address to transmit
Maciej Bocianski 2:3165b07182ad 243 NULL, 0, // do not transmit
Maciej Bocianski 2:3165b07182ad 244 NULL, 0)) { // do not receive
Maciej Bocianski 2:3165b07182ad 245 VERBOSE_PRINT(("[SectorErase] Sending WREN command success\r\n"));
Senthil Ramakrishnan 0:f741508e07a3 246 } else {
Maciej Bocianski 2:3165b07182ad 247 printf("[SectorErase] ERROR: Sending WREN command failed\r\n");
Senthil Ramakrishnan 0:f741508e07a3 248 return false;
Senthil Ramakrishnan 0:f741508e07a3 249 }
Maciej Bocianski 2:3165b07182ad 250 // sector erase
Maciej Bocianski 2:3165b07182ad 251 if (QSPI_STATUS_OK == qspi.command_transfer(QSPI_STD_CMD_SECT_ERASE, // command to send
Maciej Bocianski 2:3165b07182ad 252 flash_addr, // sector address (any address within sector)
Maciej Bocianski 2:3165b07182ad 253 NULL, 0, // do not transmit
Maciej Bocianski 2:3165b07182ad 254 NULL, 0)) { // do not receive
Maciej Bocianski 2:3165b07182ad 255 VERBOSE_PRINT(("[SectorErase] Sending SECT_ERASE command success\r\n"));
Senthil Ramakrishnan 0:f741508e07a3 256 } else {
Maciej Bocianski 2:3165b07182ad 257 printf("[SectorErase] ERROR: Readng SECT_ERASE command failed\r\n");
Senthil Ramakrishnan 0:f741508e07a3 258 return false;
Senthil Ramakrishnan 0:f741508e07a3 259 }
Maciej Bocianski 2:3165b07182ad 260
Maciej Bocianski 2:3165b07182ad 261 if (false == WaitForMemReady(qspi)) {
Maciej Bocianski 2:3165b07182ad 262 printf("[SectorErase] ERROR: Device not ready, tests failed\r\n");
Maciej Bocianski 2:3165b07182ad 263 return false;
Maciej Bocianski 2:3165b07182ad 264 }
Maciej Bocianski 2:3165b07182ad 265
Senthil Ramakrishnan 0:f741508e07a3 266 return true;
Senthil Ramakrishnan 0:f741508e07a3 267 }
Senthil Ramakrishnan 0:f741508e07a3 268
Maciej Bocianski 2:3165b07182ad 269 bool QuadEnable(QSPI &qspi)
Maciej Bocianski 2:3165b07182ad 270 {
Maciej Bocianski 2:3165b07182ad 271 char reg_data[QSPI_STATUS_REG_SIZE];
Maciej Bocianski 2:3165b07182ad 272
Maciej Bocianski 2:3165b07182ad 273 //Read the Status Register from device
Maciej Bocianski 2:3165b07182ad 274 if (QSPI_STATUS_OK == qspi.command_transfer(QSPI_STD_CMD_RDSR, // command to send
Maciej Bocianski 2:3165b07182ad 275 -1, // no address to transmit
Maciej Bocianski 2:3165b07182ad 276 NULL, 0, // do not transmit
Maciej Bocianski 2:3165b07182ad 277 reg_data, QSPI_STATUS_REG_SIZE)) {
Maciej Bocianski 2:3165b07182ad 278 VERBOSE_PRINT(("[QuadEnable] Reading Status Register Success: value = 0x%02X\r\n", reg_data[0]));
Maciej Bocianski 2:3165b07182ad 279 } else {
Maciej Bocianski 2:3165b07182ad 280 printf("ERROR: Reading Status Register failed\r\n");
Maciej Bocianski 2:3165b07182ad 281 return false;
Maciej Bocianski 2:3165b07182ad 282 }
Maciej Bocianski 5:da509493e3e6 283 // Set wite enable
Maciej Bocianski 2:3165b07182ad 284 if (QSPI_STATUS_OK == qspi.command_transfer(QSPI_STD_CMD_WREN, // command to send
Maciej Bocianski 2:3165b07182ad 285 -1, // no address to transmit
Maciej Bocianski 2:3165b07182ad 286 NULL, 0, // do not transmit
Maciej Bocianski 2:3165b07182ad 287 NULL, 0)) { // do not receive
Maciej Bocianski 2:3165b07182ad 288 VERBOSE_PRINT(("[QuadEnable] Sending WREN command success\r\n"));
Maciej Bocianski 2:3165b07182ad 289 } else {
Maciej Bocianski 2:3165b07182ad 290 printf("[QuadEnable] ERROR: Sending WREN command failed\r\n");
Maciej Bocianski 2:3165b07182ad 291 return false;
Maciej Bocianski 2:3165b07182ad 292 }
Maciej Bocianski 5:da509493e3e6 293 //Set the Status Register to set QE enable bit
Maciej Bocianski 2:3165b07182ad 294 reg_data[0] |= (STATUS_BIT_QE);
Maciej Bocianski 2:3165b07182ad 295 if (QSPI_STATUS_OK == qspi.command_transfer(QSPI_STD_CMD_WRSR, // command to send
Maciej Bocianski 2:3165b07182ad 296 -1, // no address to transmit
Maciej Bocianski 2:3165b07182ad 297 reg_data, QSPI_STATUS_REG_SIZE,
Maciej Bocianski 2:3165b07182ad 298 NULL, 0)) { // do not receive
Maciej Bocianski 2:3165b07182ad 299 VERBOSE_PRINT(("[QuadEnable] Writing Status Register Success\r\n"));
Maciej Bocianski 2:3165b07182ad 300 } else {
Maciej Bocianski 2:3165b07182ad 301 printf("[QuadEnable] ERROR: Writing Status Register failed\r\n");
Maciej Bocianski 2:3165b07182ad 302 return false;
Maciej Bocianski 2:3165b07182ad 303 }
Maciej Bocianski 2:3165b07182ad 304
Maciej Bocianski 2:3165b07182ad 305 if (false == WaitForMemReady(qspi)) {
Maciej Bocianski 2:3165b07182ad 306 printf("[QuadEnable] ERROR: Device not ready, tests failed\r\n");
Maciej Bocianski 2:3165b07182ad 307 return false;
Maciej Bocianski 2:3165b07182ad 308 }
Maciej Bocianski 2:3165b07182ad 309
Maciej Bocianski 2:3165b07182ad 310 return true;
Maciej Bocianski 2:3165b07182ad 311 }
Maciej Bocianski 2:3165b07182ad 312
Maciej Bocianski 2:3165b07182ad 313 bool QuadDisable(QSPI &qspi)
Maciej Bocianski 2:3165b07182ad 314 {
Maciej Bocianski 2:3165b07182ad 315 char reg_data[QSPI_STATUS_REG_SIZE];
Maciej Bocianski 2:3165b07182ad 316
Maciej Bocianski 2:3165b07182ad 317 // Read the Status Register from device
Maciej Bocianski 2:3165b07182ad 318 if (QSPI_STATUS_OK == qspi.command_transfer(QSPI_STD_CMD_RDSR, // command to send
Maciej Bocianski 2:3165b07182ad 319 -1, // no address to transmit
Maciej Bocianski 2:3165b07182ad 320 NULL, 0, // do not transmit
Maciej Bocianski 2:3165b07182ad 321 reg_data, QSPI_STATUS_REG_SIZE)) {
Maciej Bocianski 2:3165b07182ad 322 VERBOSE_PRINT(("[QuadDisable] Reading Status Register Success: value = 0x%02X\r\n", reg_data[0]));
Maciej Bocianski 2:3165b07182ad 323 } else {
Maciej Bocianski 2:3165b07182ad 324 printf("[QuadDisable] ERROR: Reading Status Register failed\r\n");
Maciej Bocianski 2:3165b07182ad 325 return false;
Maciej Bocianski 2:3165b07182ad 326 }
Maciej Bocianski 2:3165b07182ad 327
Maciej Bocianski 2:3165b07182ad 328 // Set write enable
Maciej Bocianski 2:3165b07182ad 329 if (QSPI_STATUS_OK == qspi.command_transfer(QSPI_STD_CMD_WREN, // command to send
Maciej Bocianski 2:3165b07182ad 330 -1, // no address to transmit
Maciej Bocianski 2:3165b07182ad 331 NULL, 0, // do not transmit
Maciej Bocianski 2:3165b07182ad 332 NULL, 0)) { // do not receive
Maciej Bocianski 2:3165b07182ad 333 VERBOSE_PRINT(("[QuadDisable] Sending WREN command success\r\n"));
Maciej Bocianski 2:3165b07182ad 334 } else {
Maciej Bocianski 2:3165b07182ad 335 printf("[QuadDisable] ERROR: Sending WREN command failed\r\n");
Maciej Bocianski 2:3165b07182ad 336 return false;
Maciej Bocianski 2:3165b07182ad 337 }
Maciej Bocianski 5:da509493e3e6 338 //Set the Status Register to reset QE enable bit
Maciej Bocianski 2:3165b07182ad 339 reg_data[0] &= ~(STATUS_BIT_QE);
Maciej Bocianski 2:3165b07182ad 340 if (QSPI_STATUS_OK == qspi.command_transfer(QSPI_STD_CMD_WRSR, // command to send
Maciej Bocianski 2:3165b07182ad 341 -1, // no address to transmit
Maciej Bocianski 2:3165b07182ad 342 reg_data, QSPI_STATUS_REG_SIZE,
Maciej Bocianski 2:3165b07182ad 343 NULL, 0)) { // do not receive
Maciej Bocianski 2:3165b07182ad 344 VERBOSE_PRINT(("[QuadDisable] Writing Status Register Success\r\n"));
Maciej Bocianski 2:3165b07182ad 345 } else {
Maciej Bocianski 2:3165b07182ad 346 printf("[QuadDisable] ERROR: Writing Status Register failed\r\n");
Maciej Bocianski 2:3165b07182ad 347 return false;
Maciej Bocianski 2:3165b07182ad 348 }
Maciej Bocianski 2:3165b07182ad 349
Maciej Bocianski 2:3165b07182ad 350 if (false == WaitForMemReady(qspi)) {
Maciej Bocianski 2:3165b07182ad 351 printf("[QuadDisable] ERROR: Device not ready, tests failed\r\n");
Maciej Bocianski 2:3165b07182ad 352 return false;
Maciej Bocianski 2:3165b07182ad 353 }
Maciej Bocianski 2:3165b07182ad 354
Maciej Bocianski 2:3165b07182ad 355 return true;
Maciej Bocianski 2:3165b07182ad 356 }