@@ -216,8 +216,16 @@ void SPIClass::setClockDivider(uint32_t clockDiv) {
216
216
SPI1CLK = clockDiv;
217
217
}
218
218
219
+ inline void SPIClass::setDataBits (uint16_t bits) {
220
+ const uint32_t mask = ~((SPIMMOSI << SPILMOSI) | (SPIMMISO << SPILMISO));
221
+ bits--;
222
+ SPI1U1 = ((SPI1U1 & mask) | ((bits << SPILMOSI) | (bits << SPILMISO)));
223
+ }
224
+
219
225
uint8_t SPIClass::transfer (uint8_t data) {
220
226
while (SPI1CMD & SPIBUSY) {}
227
+ // reset to 8Bit mode
228
+ setDataBits (8 );
221
229
SPI1W0 = data;
222
230
SPI1CMD |= SPIBUSY;
223
231
while (SPI1CMD & SPIBUSY) {}
@@ -248,19 +256,21 @@ uint16_t SPIClass::transfer16(uint16_t data) {
248
256
249
257
void SPIClass::write (uint8_t data) {
250
258
while (SPI1CMD & SPIBUSY) {}
259
+ // reset to 8Bit mode
260
+ setDataBits (8 );
251
261
SPI1W0 = data;
252
262
SPI1CMD |= SPIBUSY;
253
263
while (SPI1CMD & SPIBUSY) {}
254
264
}
255
265
256
266
void SPIClass::write16 (uint16_t data) {
257
- write16 (data, (SPI1C & (SPICWBO | SPICRBO)));
267
+ write16 (data, ! (SPI1C & (SPICWBO | SPICRBO)));
258
268
}
259
269
260
270
void SPIClass::write16 (uint16_t data, bool msb) {
261
271
while (SPI1CMD & SPIBUSY) {}
262
272
// Set to 16Bits transfer
263
- SPI1U1 = (SPI1U1 & ~((SPIMMOSI << SPILMOSI))) | (( 16 - 1 ) << SPILMOSI );
273
+ setDataBits ( 16 );
264
274
if (msb) {
265
275
// MSBFIRST Byte first
266
276
SPI1W0 = (data >> 8 ) | (data << 8 );
@@ -271,8 +281,31 @@ void SPIClass::write16(uint16_t data, bool msb) {
271
281
SPI1CMD |= SPIBUSY;
272
282
}
273
283
while (SPI1CMD & SPIBUSY) {}
274
- // reset to 8Bit mode
275
- SPI1U1 = (SPI1U1 & ~((SPIMMOSI << SPILMOSI))) | ((8 - 1 ) << SPILMOSI);
284
+ }
285
+
286
+ void SPIClass::write32 (uint32_t data) {
287
+ write32 (data, !(SPI1C & (SPICWBO | SPICRBO)));
288
+ }
289
+
290
+ void SPIClass::write32 (uint32_t data, bool msb) {
291
+ while (SPI1CMD & SPIBUSY) {}
292
+ // Set to 32Bits transfer
293
+ setDataBits (32 );
294
+ if (msb) {
295
+ union {
296
+ uint32_t l;
297
+ uint8_t b[4 ];
298
+ } data_;
299
+ data_.l = data;
300
+ // MSBFIRST Byte first
301
+ SPI1W0 = (data_.b [3 ] | (data_.b [2 ] << 8 ) | (data_.b [1 ] << 16 ) | (data_.b [0 ] << 24 ));
302
+ SPI1CMD |= SPIBUSY;
303
+ } else {
304
+ // LSBFIRST Byte first
305
+ SPI1W0 = data;
306
+ SPI1CMD |= SPIBUSY;
307
+ }
308
+ while (SPI1CMD & SPIBUSY) {}
276
309
}
277
310
278
311
void SPIClass::writeBytes (uint8_t * data, uint32_t size) {
@@ -291,7 +324,7 @@ void SPIClass::writeBytes(uint8_t * data, uint32_t size) {
291
324
void SPIClass::writeBytes_ (uint8_t * data, uint8_t size) {
292
325
while (SPI1CMD & SPIBUSY) {}
293
326
// Set Bits to transfer
294
- SPI1U1 = (SPI1U1 & ~((SPIMMOSI << SPILMOSI))) | (( size * 8 - 1 ) << SPILMOSI );
327
+ setDataBits ( size * 8 );
295
328
296
329
volatile uint32_t * fifoPtr = &SPI1W0;
297
330
uint32_t * dataPtr = (uint32_t *) data;
@@ -305,8 +338,6 @@ void SPIClass::writeBytes_(uint8_t * data, uint8_t size) {
305
338
306
339
SPI1CMD |= SPIBUSY;
307
340
while (SPI1CMD & SPIBUSY) {}
308
- // reset to 8Bit mode
309
- SPI1U1 = (SPI1U1 & ~((SPIMMOSI << SPILMOSI))) | ((8 - 1 ) << SPILMOSI);
310
341
}
311
342
312
343
void SPIClass::writePattern (uint8_t * data, uint8_t size, uint32_t repeat) {
@@ -344,3 +375,56 @@ void SPIClass::writePattern_(uint8_t * data, uint8_t size, uint8_t repeat) {
344
375
345
376
writeBytes (&buffer[0 ], bytes);
346
377
}
378
+
379
+ void SPIClass::transferBytes (uint8_t * out, uint8_t * in, uint32_t size) {
380
+ while (size) {
381
+ if (size > 64 ) {
382
+ transferBytes_ (out, in, 64 );
383
+ size -= 64 ;
384
+ if (out) out += 64 ;
385
+ if (in) in += 64 ;
386
+ } else {
387
+ transferBytes_ (out, in, size);
388
+ size = 0 ;
389
+ }
390
+ }
391
+ }
392
+
393
+ void SPIClass::transferBytes_ (uint8_t * out, uint8_t * in, uint8_t size) {
394
+ while (SPI1CMD & SPIBUSY) {}
395
+ // Set in/out Bits to transfer
396
+
397
+ setDataBits (size * 8 );
398
+
399
+ volatile uint32_t * fifoPtr = &SPI1W0;
400
+ uint8_t dataSize = ((size + 3 ) / 4 );
401
+
402
+ if (out) {
403
+ uint32_t * dataPtr = (uint32_t *) out;
404
+ while (dataSize--) {
405
+ *fifoPtr = *dataPtr;
406
+ dataPtr++;
407
+ fifoPtr++;
408
+ }
409
+ } else {
410
+ // no out data only read fill with dummy data!
411
+ while (dataSize--) {
412
+ *fifoPtr = 0xFFFFFFFF ;
413
+ fifoPtr++;
414
+ }
415
+ }
416
+
417
+ SPI1CMD |= SPIBUSY;
418
+ while (SPI1CMD & SPIBUSY) {}
419
+
420
+ if (in) {
421
+ volatile uint8_t * fifoPtr8 = (volatile uint8_t *) &SPI1W0;
422
+ dataSize = size;
423
+ while (dataSize--) {
424
+ *in = *fifoPtr8;
425
+ in++;
426
+ fifoPtr8++;
427
+ }
428
+ }
429
+ }
430
+
0 commit comments