Skip to content

Commit a64a694

Browse files
author
WereCatf
committed
Speed up SPI.writePattern()
1 parent 797c78d commit a64a694

File tree

2 files changed

+32
-28
lines changed

2 files changed

+32
-28
lines changed

libraries/SPI/SPI.cpp

+32-27
Original file line numberDiff line numberDiff line change
@@ -350,49 +350,54 @@ void SPIClass::writeBytes_(uint8_t * data, uint8_t size) {
350350
while(SPI1CMD & SPIBUSY) {}
351351
}
352352

353-
354353
/**
355-
* Note:
356-
* data need to be aligned to 32Bit
357-
* or you get an Fatal exception (9)
358354
* @param data uint8_t *
359355
* @param size uint8_t max for size is 64Byte
360356
* @param repeat uint32_t
361357
*/
362358
void SPIClass::writePattern(uint8_t * data, uint8_t size, uint32_t repeat) {
363359
if(size > 64) return; //max Hardware FIFO
364360

365-
uint32_t byte = (size * repeat);
366-
uint8_t r = (64 / size);
361+
while(SPI1CMD & SPIBUSY) {}
367362

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;
378370

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--){
387372
dataPtr = data;
388-
while(dataSize--) {
373+
for(uint8_t i=0; i<size; i++){
389374
*bufferPtr = *dataPtr;
390-
dataPtr++;
391375
bufferPtr++;
376+
dataPtr++;
392377
}
393378
}
394379

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;
396401
}
397402

398403
/**

libraries/SPI/SPI.h

-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ class SPIClass {
7575
private:
7676
bool useHwCs;
7777
void writeBytes_(uint8_t * data, uint8_t size);
78-
void writePattern_(uint8_t * data, uint8_t size, uint8_t repeat);
7978
void transferBytes_(uint8_t * out, uint8_t * in, uint8_t size);
8079
inline void setDataBits(uint16_t bits);
8180
};

0 commit comments

Comments
 (0)