@@ -45,6 +45,7 @@ const uint8_t _COMMANDS_32BIT[] = {0x13, 0x12, 0x21}; // READ, PROGRAM_PAGE, ER
45
45
46
46
#define COMMAND_JEDEC_ID (0x9F)
47
47
#define COMMAND_READ_STATUS (0x05)
48
+ #define COMMAND_WRITE_SR1 (0x01)
48
49
#define COMMAND_WRITE_ENABLE (0x06)
49
50
#define COMMAND_READ_SFDP (0x5A)
50
51
#define PAGE_SIZE (256)
@@ -88,7 +89,7 @@ static void wait(spiflash_obj_t *self) {
88
89
mp_hal_pin_write (self -> cs , 0 );
89
90
spi_transfer ((mp_obj_base_t * )self -> spi , 2 , msg , msg );
90
91
mp_hal_pin_write (self -> cs , 1 );
91
- } while (msg [1 ] != 0 && timeout -- > 0 );
92
+ } while (( msg [1 ] & 1 ) != 0 && timeout -- > 0 );
92
93
}
93
94
94
95
static void get_id (spiflash_obj_t * self , uint8_t id [3 ]) {
@@ -123,6 +124,17 @@ static void write_enable(spiflash_obj_t *self) {
123
124
mp_hal_pin_write (self -> cs , 1 );
124
125
}
125
126
127
+ // Write status register 1
128
+ static void write_sr1 (spiflash_obj_t * self , uint8_t value ) {
129
+ uint8_t msg [2 ];
130
+ msg [0 ] = COMMAND_WRITE_SR1 ;
131
+ msg [1 ] = value ;
132
+
133
+ mp_hal_pin_write (self -> cs , 0 );
134
+ spi_transfer (self -> spi , 2 , msg , NULL );
135
+ mp_hal_pin_write (self -> cs , 1 );
136
+ }
137
+
126
138
static void get_sfdp (spiflash_obj_t * self , uint32_t addr , uint8_t * buffer , int size ) {
127
139
uint8_t dummy [1 ];
128
140
write_addr (self , COMMAND_READ_SFDP , addr );
@@ -155,27 +167,36 @@ static mp_obj_t spiflash_make_new(const mp_obj_type_t *type, size_t n_args, size
155
167
mp_hal_pin_write (self -> cs , 1 );
156
168
157
169
wait (self );
158
-
159
170
// Get the flash size from the device ID (default)
160
171
uint8_t id [3 ];
161
172
get_id (self , id );
173
+ bool read_sfdp = true;
174
+
162
175
if (id [1 ] == 0x84 && id [2 ] == 1 ) { // Adesto
163
176
self -> size = 512 * 1024 ;
164
- } else if (id [1 ] == 0x1f && id [2 ] == 1 ) { // Atmel / Renesas
177
+ } else if (id [0 ] == 0x1f && id [1 ] == 0x45 && id [ 2 ] == 1 ) { // Adesto/ Renesas 8 MBit
165
178
self -> size = 1024 * 1024 ;
179
+ read_sfdp = false;
180
+ self -> sectorsize = 4096 ;
181
+ self -> addr_is_32bit = false;
182
+ // Globally unlock the sectors, which are locked after power on.
183
+ write_enable (self );
184
+ write_sr1 (self , 0 );
166
185
} else {
167
186
self -> size = 1 << id [2 ];
168
187
}
169
188
170
189
// Get the addr_is_32bit flag and the sector size
171
- uint8_t buffer [128 ];
172
- get_sfdp (self , 0 , buffer , 16 ); // get the header
173
- int len = MIN (buffer [11 ] * 4 , sizeof (buffer ));
174
- if (len >= 29 ) {
175
- int addr = buffer [12 ] + (buffer [13 ] << 8 ) + (buffer [14 ] << 16 );
176
- get_sfdp (self , addr , buffer , len ); // Get the JEDEC mandatory table
177
- self -> sectorsize = 1 << buffer [28 ];
178
- self -> addr_is_32bit = ((buffer [2 ] >> 1 ) & 0x03 ) != 0 ;
190
+ if (read_sfdp ) {
191
+ uint8_t buffer [128 ];
192
+ get_sfdp (self , 0 , buffer , 16 ); // get the header
193
+ int len = MIN (buffer [11 ] * 4 , sizeof (buffer ));
194
+ if (len >= 29 ) {
195
+ int addr = buffer [12 ] + (buffer [13 ] << 8 ) + (buffer [14 ] << 16 );
196
+ get_sfdp (self , addr , buffer , len ); // Get the JEDEC mandatory table
197
+ self -> sectorsize = 1 << buffer [28 ];
198
+ self -> addr_is_32bit = ((buffer [2 ] >> 1 ) & 0x03 ) != 0 ;
199
+ }
179
200
}
180
201
self -> commands = self -> addr_is_32bit ? _COMMANDS_32BIT : _COMMANDS_24BIT ;
181
202
0 commit comments