@@ -58,14 +58,20 @@ static bool spi_eeprom_start(void) {
58
58
59
59
static spi_status_t spi_eeprom_wait_while_busy (int timeout ) {
60
60
uint32_t deadline = timer_read32 () + timeout ;
61
- spi_status_t response ;
62
- do {
61
+ spi_status_t response = SR_WIP ;
62
+ while (response & SR_WIP ) {
63
+ if (!spi_eeprom_start ()) {
64
+ return SPI_STATUS_ERROR ;
65
+ }
66
+
63
67
spi_write (CMD_RDSR );
64
68
response = spi_read ();
69
+ spi_stop ();
70
+
65
71
if (timer_read32 () >= deadline ) {
66
72
return SPI_STATUS_TIMEOUT ;
67
73
}
68
- } while ( response & SR_WIP );
74
+ }
69
75
return SPI_STATUS_SUCCESS ;
70
76
}
71
77
@@ -105,27 +111,21 @@ void eeprom_driver_erase(void) {
105
111
void eeprom_read_block (void * buf , const void * addr , size_t len ) {
106
112
//-------------------------------------------------
107
113
// Wait for the write-in-progress bit to be cleared
108
- bool res = spi_eeprom_start ();
109
- if (!res ) {
110
- dprint ("failed to start SPI for WIP check\n" );
111
- memset (buf , 0 , len );
112
- return ;
113
- }
114
-
115
114
spi_status_t response = spi_eeprom_wait_while_busy (EXTERNAL_EEPROM_SPI_TIMEOUT );
116
- spi_stop ();
117
- if (response == SPI_STATUS_TIMEOUT ) {
118
- dprint ("SPI timeout for WIP check\n" );
115
+ if (response != SPI_STATUS_SUCCESS ) {
116
+ spi_stop ();
119
117
memset (buf , 0 , len );
118
+ dprint ("SPI timeout for WIP check\n" );
120
119
return ;
121
120
}
122
121
123
122
//-------------------------------------------------
124
123
// Perform read
125
- res = spi_eeprom_start ();
124
+ bool res = spi_eeprom_start ();
126
125
if (!res ) {
127
- dprint ( "failed to start SPI for read\n" );
126
+ spi_stop ( );
128
127
memset (buf , 0 , len );
128
+ dprint ("failed to start SPI for read\n" );
129
129
return ;
130
130
}
131
131
@@ -158,15 +158,9 @@ void eeprom_write_block(const void *buf, void *addr, size_t len) {
158
158
159
159
//-------------------------------------------------
160
160
// Wait for the write-in-progress bit to be cleared
161
- res = spi_eeprom_start ();
162
- if (!res ) {
163
- dprint ("failed to start SPI for WIP check\n" );
164
- return ;
165
- }
166
-
167
161
spi_status_t response = spi_eeprom_wait_while_busy (EXTERNAL_EEPROM_SPI_TIMEOUT );
168
- spi_stop ();
169
- if ( response == SPI_STATUS_TIMEOUT ) {
162
+ if ( response != SPI_STATUS_SUCCESS ) {
163
+ spi_stop ();
170
164
dprint ("SPI timeout for WIP check\n" );
171
165
return ;
172
166
}
@@ -175,6 +169,7 @@ void eeprom_write_block(const void *buf, void *addr, size_t len) {
175
169
// Enable writes
176
170
res = spi_eeprom_start ();
177
171
if (!res ) {
172
+ spi_stop ();
178
173
dprint ("failed to start SPI for write-enable\n" );
179
174
return ;
180
175
}
@@ -186,6 +181,7 @@ void eeprom_write_block(const void *buf, void *addr, size_t len) {
186
181
// Perform the write
187
182
res = spi_eeprom_start ();
188
183
if (!res ) {
184
+ spi_stop ();
189
185
dprint ("failed to start SPI for write\n" );
190
186
return ;
191
187
}
0 commit comments