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@5:da509493e3e6, 2018-09-04 (annotated)
- 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?
User | Revision | Line number | New 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 | } |