Skip to content

Commit 8ffe1aa

Browse files
author
WereCatf
committed
Speed up writePattern() a bit more
1 parent 43d0989 commit 8ffe1aa

File tree

1 file changed

+51
-25
lines changed

1 file changed

+51
-25
lines changed

Diff for: libraries/SPI/SPI.cpp

+51-25
Original file line numberDiff line numberDiff line change
@@ -364,36 +364,62 @@ void SPIClass::writePattern(uint8_t * data, uint8_t size, uint32_t repeat) {
364364
uint8_t *bufferPtr=(uint8_t *)&buffer;
365365
uint8_t *dataPtr = data;
366366
volatile uint32_t * fifoPtr = &SPI1W0;
367-
uint8_t r = 64 / size;
368-
uint32_t repeatRem = repeat % r;
369-
repeat = repeat / r;
370-
371-
while(r--){
372-
dataPtr = data;
373-
for(uint8_t i=0; i<size; i++){
374-
*bufferPtr = *dataPtr;
375-
bufferPtr++;
376-
dataPtr++;
367+
uint8_t r;
368+
uint32_t repeatRem;
369+
uint8_t i;
370+
371+
if((repeat * size) <= 64){
372+
repeatRem = repeat * size;
373+
r = repeat;
374+
while(r--){
375+
dataPtr = data;
376+
for(i=0; i<size; i++){
377+
*bufferPtr = *dataPtr;
378+
bufferPtr++;
379+
dataPtr++;
380+
}
377381
}
378-
}
379382

380-
fifoPtr = &SPI1W0;
381-
for(uint8_t i=0; i<16; i++){
382-
*fifoPtr = buffer[i];
383-
fifoPtr++;
384-
}
383+
r = repeatRem;
384+
if(r & 3) r = r / 4 + 1;
385+
else r = r / 4;
386+
for(i=0; i<r; i++){
387+
*fifoPtr = buffer[i];
388+
fifoPtr++;
389+
}
390+
SPI1U = SPIUMOSI | SPIUSSE;
391+
} else {
392+
//Orig
393+
r = 64 / size;
394+
repeatRem = repeat % r * size;
395+
repeat = repeat / r;
396+
397+
while(r--){
398+
dataPtr = data;
399+
for(i=0; i<size; i++){
400+
*bufferPtr = *dataPtr;
401+
bufferPtr++;
402+
dataPtr++;
403+
}
404+
}
405+
406+
//Fill fifo with data
407+
for(i=0; i<16; i++){
408+
*fifoPtr = buffer[i];
409+
fifoPtr++;
410+
}
385411

386-
r = 64 / size;
412+
r = 64 / size;
387413

388-
SPI1U = SPIUMOSI | SPIUSSE;
389-
//Fill fifo with data
390-
setDataBits(r * size * 8);
391-
while(repeat--){
392-
SPI1CMD |= SPIBUSY;
393-
while(SPI1CMD & SPIBUSY) {}
414+
SPI1U = SPIUMOSI | SPIUSSE;
415+
setDataBits(r * size * 8);
416+
while(repeat--){
417+
SPI1CMD |= SPIBUSY;
418+
while(SPI1CMD & SPIBUSY) {}
419+
}
394420
}
395-
396-
setDataBits(repeatRem * size * 8);
421+
//End orig
422+
setDataBits(repeatRem * 8);
397423
SPI1CMD |= SPIBUSY;
398424
while(SPI1CMD & SPIBUSY) {}
399425

0 commit comments

Comments
 (0)