@@ -167,19 +167,58 @@ int spi_master_write(spi_t *obj, int value)
167
167
return * req .rx_data ;
168
168
}
169
169
170
- int spi_master_block_write (spi_t * obj , const char * tx_buffer , int tx_length ,
171
- char * rx_buffer , int rx_length , char write_fill ) {
172
- int total = (tx_length > rx_length ) ? tx_length : rx_length ;
173
-
174
- for (int i = 0 ; i < total ; i ++ ) {
175
- char out = (i < tx_length ) ? tx_buffer [i ] : write_fill ;
176
- char in = spi_master_write (obj , out );
177
- if (i < rx_length ) {
178
- rx_buffer [i ] = in ;
170
+ //******************************************************************************
171
+ int spi_master_block_write (spi_t * obj , const char * tx_buffer , int tx_length , char * rx_buffer , int rx_length , char write_fill )
172
+ {
173
+ spim_req_t req ;
174
+
175
+ if (!(tx_length | rx_length ) ||
176
+ (tx_length < 0 ) ||
177
+ (rx_length < 0 )) {
178
+ return 0 ;
179
+ }
180
+
181
+ req .width = SPIM_WIDTH_1 ;
182
+ req .ssel = 0 ;
183
+ req .deass = 1 ;
184
+ req .callback = NULL ;
185
+
186
+ __disable_irq ();
187
+ if (tx_length == rx_length ) {
188
+ req .tx_data = (uint8_t * )tx_buffer ;
189
+ req .rx_data = (uint8_t * )rx_buffer ;
190
+ req .len = tx_length ;
191
+ SPIM_Trans (obj -> spi , & req );
192
+ } else if (tx_length < rx_length ) {
193
+ req .tx_data = (tx_length > 0 ) ? (uint8_t * )tx_buffer : NULL ;
194
+ req .rx_data = (uint8_t * )rx_buffer ;
195
+ req .len = (tx_length > 0 ) ? tx_length : rx_length ;
196
+ SPIM_Trans (obj -> spi , & req );
197
+
198
+ if (tx_length ) {
199
+ req .tx_data = NULL ;
200
+ req .rx_data = (uint8_t * )(rx_buffer + tx_length );
201
+ req .len = rx_length - tx_length ;
202
+ SPIM_Trans (obj -> spi , & req );
203
+ }
204
+ } else {
205
+ req .tx_data = (uint8_t * )tx_buffer ;
206
+ req .rx_data = (rx_length > 0 ) ? (uint8_t * )rx_buffer : NULL ;
207
+ req .len = (rx_length > 0 ) ? rx_length : tx_length ;
208
+ SPIM_Trans (obj -> spi , & req );
209
+
210
+ if (rx_length ) {
211
+ req .tx_data = (uint8_t * )(tx_buffer + rx_length );
212
+ req .rx_data = NULL ;
213
+ req .len = tx_length - rx_length ;
214
+ SPIM_Trans (obj -> spi , & req );
179
215
}
180
216
}
217
+ __enable_irq ();
218
+
219
+ while (SPIM_Busy (obj -> spi ));
181
220
182
- return total ;
221
+ return tx_length > rx_length ? tx_length : rx_length ;
183
222
}
184
223
185
224
//******************************************************************************
@@ -193,4 +232,3 @@ uint8_t spi_get_module(spi_t *obj)
193
232
{
194
233
return obj -> index ;
195
234
}
196
-
0 commit comments