|
22 | 22 | // Command for reading status register
|
23 | 23 | #define QSPI_CMD_RDSR 0x05
|
24 | 24 | // Command for reading configuration register
|
25 |
| -#define QSPI_CMD_RDCR 0x15 |
| 25 | +#define QSPI_CMD_RDCR0 0x15 |
26 | 26 | // Command for writing status/configuration register
|
27 | 27 | #define QSPI_CMD_WRSR 0x01
|
28 | 28 | // Command for reading security register
|
|
41 | 41 | // WRSR operations max time [us] (datasheet max time + 15%)
|
42 | 42 | #define QSPI_WRSR_MAX_TIME 34500 // 30ms
|
43 | 43 | // general wait max time [us]
|
44 |
| -#define QSPI_WAIT_MAX_TIME 10000 // 100ms |
| 44 | +#define QSPI_WAIT_MAX_TIME 100000 // 100ms |
45 | 45 |
|
46 | 46 |
|
47 | 47 | // Commands for writing (page programming)
|
|
76 | 76 |
|
77 | 77 | // erase operations max time [us] (datasheet max time + 15%)
|
78 | 78 | #define QSPI_ERASE_SECTOR_MAX_TIME 276000 // 240 ms
|
79 |
| -#define QSPI_ERASE_BLOCK_32_MAX_TIME 3000000 // 3s |
80 |
| -#define QSPI_ERASE_BLOCK_64_MAX_TIME 3500000 // 3.5s |
| 79 | +#define QSPI_ERASE_BLOCK_32_MAX_TIME 3450000 // 3s |
| 80 | +#define QSPI_ERASE_BLOCK_64_MAX_TIME 4025000 // 3.5s |
81 | 81 |
|
82 | 82 | // max frequency for basic rw operation
|
83 | 83 | #define QSPI_COMMON_MAX_FREQUENCY 32000000
|
84 | 84 |
|
85 |
| -#define QSPI_STATUS_REGISTER_SIZE 1 |
86 |
| -#define QSPI_CONFIGURATION_REGISTER_SIZE 2 |
87 |
| -#define QSPI_SECURITY_REGISTER_SIZE 1 |
| 85 | +#define QSPI_STATUS_REG_SIZE 1 |
| 86 | +#define QSPI_CONFIG_REG_0_SIZE 2 |
| 87 | +#define QSPI_SECURITY_REG_SIZE 1 |
| 88 | +#define QSPI_MAX_REG_SIZE 2 |
88 | 89 |
|
89 | 90 | // status register
|
90 | 91 | #define STATUS_BIT_WIP (1 << 0) // write in progress bit
|
|
106 | 107 | #define CONFIG1_BIT_LH (1 << 1) // 0 = Ultra Low power mode, 1 = High performance mode
|
107 | 108 |
|
108 | 109 |
|
| 110 | +// single quad enable flag for both dual and quad mode |
| 111 | +#define QUAD_ENABLE_IMPLEMENTATION() \ |
| 112 | + \ |
| 113 | + uint8_t reg_data[QSPI_STATUS_REG_SIZE]; \ |
| 114 | + \ |
| 115 | + reg_data[0] = STATUS_BIT_QE; \ |
| 116 | + qspi.cmd.build(QSPI_CMD_WRSR); \ |
| 117 | + \ |
| 118 | + if (qspi_command_transfer(&qspi.handle, qspi.cmd.get(), \ |
| 119 | + reg_data, QSPI_STATUS_REG_SIZE, NULL, 0) != QSPI_STATUS_OK) { \ |
| 120 | + return QSPI_STATUS_ERROR; \ |
| 121 | + } \ |
| 122 | + WAIT_FOR(WRSR_MAX_TIME, qspi); \ |
| 123 | + \ |
| 124 | + memset(reg_data, 0, QSPI_STATUS_REG_SIZE); \ |
| 125 | + if (read_register(STATUS_REG, reg_data, \ |
| 126 | + QSPI_STATUS_REG_SIZE, qspi) != QSPI_STATUS_OK) { \ |
| 127 | + return QSPI_STATUS_ERROR; \ |
| 128 | + } \ |
| 129 | + \ |
| 130 | + return ((reg_data[0] & STATUS_BIT_QE) != 0 ? \ |
| 131 | + QSPI_STATUS_OK : QSPI_STATUS_ERROR) |
| 132 | + |
| 133 | + |
| 134 | + |
| 135 | +#define QUAD_DISABLE_IMPLEMENTATION() \ |
| 136 | + \ |
| 137 | + uint8_t reg_data[QSPI_STATUS_REG_SIZE]; \ |
| 138 | + \ |
| 139 | + reg_data[0] = 0; \ |
| 140 | + qspi.cmd.build(QSPI_CMD_WRSR); \ |
| 141 | + \ |
| 142 | + if (qspi_command_transfer(&qspi.handle, qspi.cmd.get(), \ |
| 143 | + reg_data, QSPI_STATUS_REG_SIZE, NULL, 0) != QSPI_STATUS_OK) { \ |
| 144 | + return QSPI_STATUS_ERROR; \ |
| 145 | + } \ |
| 146 | + WAIT_FOR(WRSR_MAX_TIME, qspi); \ |
| 147 | + \ |
| 148 | + reg_data[0] = 0; \ |
| 149 | + if (read_register(STATUS_REG, reg_data, \ |
| 150 | + QSPI_STATUS_REG_SIZE, qspi) != QSPI_STATUS_OK) { \ |
| 151 | + return QSPI_STATUS_ERROR; \ |
| 152 | + } \ |
| 153 | + \ |
| 154 | + return ((reg_data[0] & STATUS_BIT_QE) == 0 ? \ |
| 155 | + QSPI_STATUS_OK : QSPI_STATUS_ERROR) |
| 156 | + |
| 157 | + |
| 158 | + |
| 159 | +#define FAST_MODE_ENABLE_IMPLEMENTATION() \ |
| 160 | + \ |
| 161 | + qspi_status_t ret; \ |
| 162 | + const int32_t reg_size = QSPI_STATUS_REG_SIZE + QSPI_CONFIG_REG_0_SIZE; \ |
| 163 | + uint8_t reg_data[reg_size]; \ |
| 164 | + \ |
| 165 | + if (read_register(STATUS_REG, reg_data, \ |
| 166 | + QSPI_STATUS_REG_SIZE, qspi) != QSPI_STATUS_OK) { \ |
| 167 | + return QSPI_STATUS_ERROR; \ |
| 168 | + } \ |
| 169 | + if (read_register(CONFIG_REG0, reg_data + QSPI_STATUS_REG_SIZE, \ |
| 170 | + QSPI_CONFIG_REG_0_SIZE, qspi) != QSPI_STATUS_OK) { \ |
| 171 | + return QSPI_STATUS_ERROR; \ |
| 172 | + } \ |
| 173 | + \ |
| 174 | + reg_data[2] |= CONFIG1_BIT_LH; \ |
| 175 | + qspi.cmd.build(QSPI_CMD_WRSR); \ |
| 176 | + \ |
| 177 | + return qspi_command_transfer(&qspi.handle, qspi.cmd.get(), \ |
| 178 | + reg_data, reg_size, NULL, 0) |
| 179 | + |
| 180 | + |
| 181 | + |
109 | 182 | #endif // MBED_QSPI_FLASH_MX25R6435F_H
|
0 commit comments