@@ -196,33 +196,39 @@ static void command_loop(void)
196
196
uint32_t slen , rlen ;
197
197
readbytes_blocking (& slen , 3 ); // Read send length
198
198
readbytes_blocking (& rlen , 3 ); // Read receive length
199
- slen &= 0x00FFFFFF ; // Mask to zero out the upper 8 bits
200
- rlen &= 0x00FFFFFF ; // Mask to zero out the upper 8 bitsgi
199
+ slen &= 0x00FFFFFF ; // Mask to use only the lower 24 bits
200
+ rlen &= 0x00FFFFFF ; // Mask to use only the lower 24 bits
201
201
202
202
uint8_t tx_buffer [MAX_BUFFER_SIZE ]; // Buffer for transmit data
203
203
uint8_t rx_buffer [MAX_BUFFER_SIZE ]; // Buffer for receive data
204
204
205
+ // Handle error for oversized slen
206
+ if (slen > MAX_BUFFER_SIZE ) {
207
+ sendbyte_blocking (S_NAK );
208
+ break ;
209
+ }
210
+
205
211
// Read data to be sent (if slen > 0)
206
212
if (slen > 0 ) {
207
213
readbytes_blocking (tx_buffer , slen );
214
+ cs_select (SPI_CS );
215
+ spi_write_blocking (SPI_IF , tx_buffer , slen );
216
+ cs_deselect (SPI_CS );
208
217
}
209
218
219
+ // Send ACK after handling slen
210
220
sendbyte_blocking (S_ACK );
211
221
212
- if ( slen > 0 ) {
213
- spi_write_blocking ( SPI_IF , tx_buffer , slen );
214
- }
222
+ // Handle rlen in chunks
223
+ while ( rlen > 0 ) {
224
+ uint32_t chunk_size = ( rlen < MAX_BUFFER_SIZE ) ? rlen : MAX_BUFFER_SIZE ;
215
225
216
- // Perform SPI operation in chunks
217
- while (rlen > MAX_BUFFER_SIZE ) {
218
226
cs_select (SPI_CS );
219
- spi_read_blocking (SPI_IF , 0 , rx_buffer , MAX_BUFFER_SIZE );
227
+ spi_read_blocking (SPI_IF , 0 , rx_buffer , chunk_size );
220
228
cs_deselect (SPI_CS );
221
229
222
- // Send ACK followed by received data
223
- sendbytes_blocking (rx_buffer , MAX_BUFFER_SIZE );
224
-
225
- rlen -= MAX_BUFFER_SIZE ;
230
+ sendbytes_blocking (rx_buffer , chunk_size );
231
+ rlen -= chunk_size ;
226
232
}
227
233
228
234
break ;
0 commit comments