@@ -350,49 +350,54 @@ void SPIClass::writeBytes_(uint8_t * data, uint8_t size) {
350
350
while (SPI1CMD & SPIBUSY) {}
351
351
}
352
352
353
-
354
353
/* *
355
- * Note:
356
- * data need to be aligned to 32Bit
357
- * or you get an Fatal exception (9)
358
354
* @param data uint8_t *
359
355
* @param size uint8_t max for size is 64Byte
360
356
* @param repeat uint32_t
361
357
*/
362
358
void SPIClass::writePattern (uint8_t * data, uint8_t size, uint32_t repeat) {
363
359
if (size > 64 ) return ; // max Hardware FIFO
364
360
365
- uint32_t byte = (size * repeat);
366
- uint8_t r = (64 / size);
361
+ while (SPI1CMD & SPIBUSY) {}
367
362
368
- while (byte) {
369
- if (byte > 64 ) {
370
- writePattern_ (data, size, r);
371
- byte -= 64 ;
372
- } else {
373
- writePattern_ (data, size, (byte / size));
374
- byte = 0 ;
375
- }
376
- }
377
- }
363
+ uint32_t buffer[16 ];
364
+ uint8_t *bufferPtr=(uint8_t *)&buffer;
365
+ uint8_t *dataPtr = data;
366
+ volatile uint32_t * fifoPtr = &SPI1W0;
367
+ uint8_t r = 64 / size;
368
+ uint32_t repeatRem = repeat % r;
369
+ repeat = repeat / r;
378
370
379
- void SPIClass::writePattern_ (uint8_t * data, uint8_t size, uint8_t repeat) {
380
- uint8_t bytes = (size * repeat);
381
- uint8_t buffer[64 ];
382
- uint8_t * bufferPtr = &buffer[0 ];
383
- uint8_t * dataPtr;
384
- uint8_t dataSize = bytes;
385
- for (uint8_t i = 0 ; i < repeat; i++) {
386
- dataSize = size;
371
+ while (r--){
387
372
dataPtr = data;
388
- while (dataSize--) {
373
+ for ( uint8_t i= 0 ; i<size; i++) {
389
374
*bufferPtr = *dataPtr;
390
- dataPtr++;
391
375
bufferPtr++;
376
+ dataPtr++;
392
377
}
393
378
}
394
379
395
- writeBytes (&buffer[0 ], bytes);
380
+ fifoPtr = &SPI1W0;
381
+ for (uint8_t i=0 ; i<16 ; i++){
382
+ *fifoPtr = buffer[i];
383
+ fifoPtr++;
384
+ }
385
+
386
+ r = 64 / size;
387
+
388
+ SPI1U = SPIUMOSI | SPIUSSE;
389
+ // Fill fifo with data
390
+ setDataBits (r * size * 8 );
391
+ while (repeat--){
392
+ SPI1CMD |= SPIBUSY;
393
+ while (SPI1CMD & SPIBUSY) {}
394
+ }
395
+
396
+ setDataBits (repeatRem * size * 8 );
397
+ SPI1CMD |= SPIBUSY;
398
+ while (SPI1CMD & SPIBUSY) {}
399
+
400
+ SPI1U = SPIUMOSI | SPIUDUPLEX | SPIUSSE;
396
401
}
397
402
398
403
/* *
0 commit comments