@@ -180,29 +180,43 @@ void mp_spiflash_init(mp_spiflash_t *self) {
180
180
// Ensure SPI flash is out of sleep mode
181
181
mp_spiflash_deepsleep_internal (self , 0 );
182
182
183
- #if defined(CHECK_DEVID )
184
- // Validate device id
183
+ // Read JEDEC ID:
184
+ // "ISSI IS25LP256" = 0x0019609d (ISSI = 0x9d)
185
+ // "Winbond W25Q256" = 0x001940ef (Winbond = 0xef)
185
186
uint32_t devid ;
186
187
int ret = mp_spiflash_read_cmd (self , CMD_RD_DEVID , 3 , & devid );
187
- if (ret != 0 || devid != CHECK_DEVID ) {
188
+ if (ret != 0 ) {
188
189
mp_spiflash_release_bus (self );
189
190
return ;
190
191
}
191
- #endif
192
192
193
193
if (self -> config -> bus_kind == MP_SPIFLASH_BUS_QSPI ) {
194
194
// Set QE bit
195
- uint32_t sr = 0 , cr = 0 ;
196
- int ret = mp_spiflash_read_cmd (self , CMD_RDSR , 1 , & sr );
197
- if (ret == 0 ) {
198
- ret = mp_spiflash_read_cmd (self , CMD_RDCR , 1 , & cr );
199
- }
200
- uint32_t data = (sr & 0xff ) | (cr & 0xff ) << 8 ;
201
- if (ret == 0 && !(data & (QSPI_QE_MASK << 8 ))) {
202
- data |= QSPI_QE_MASK << 8 ;
203
- mp_spiflash_write_cmd (self , CMD_WREN );
204
- mp_spiflash_write_cmd_data (self , CMD_WRSR , 2 , data );
205
- mp_spiflash_wait_wip0 (self );
195
+ if ((devid & 0xff ) == 0x9d ) {
196
+ // Manufacturer ISSI has QE in bit 6 of a 1-byte status register
197
+ uint32_t sr = 0 ;
198
+ int ret = mp_spiflash_read_cmd (self , CMD_RDSR , 1 , & sr );
199
+ uint32_t data = (sr & 0xff );
200
+ if (ret == 0 && !(data & (1 << 6 ))) {
201
+ data |= 1 << 6 ;
202
+ mp_spiflash_write_cmd (self , CMD_WREN );
203
+ mp_spiflash_write_cmd_data (self , CMD_WRSR , 1 , data );
204
+ mp_spiflash_wait_wip0 (self );
205
+ }
206
+ } else {
207
+ // MicroPython default writes QE to bit 9 of a 2-byte status register (e.g. Winbond)
208
+ uint32_t sr = 0 , cr = 0 ;
209
+ int ret = mp_spiflash_read_cmd (self , CMD_RDSR , 1 , & sr );
210
+ if (ret == 0 ) {
211
+ ret = mp_spiflash_read_cmd (self , CMD_RDCR , 1 , & cr );
212
+ }
213
+ uint32_t data = (sr & 0xff ) | (cr & 0xff ) << 8 ;
214
+ if (ret == 0 && !(data & (QSPI_QE_MASK << 8 ))) {
215
+ data |= QSPI_QE_MASK << 8 ;
216
+ mp_spiflash_write_cmd (self , CMD_WREN );
217
+ mp_spiflash_write_cmd_data (self , CMD_WRSR , 2 , data );
218
+ mp_spiflash_wait_wip0 (self );
219
+ }
206
220
}
207
221
}
208
222
0 commit comments