1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-04-19 23:22:16 +03:00

Speed up SPI.writePattern()

This commit is contained in:
WereCatf 2016-04-16 20:02:06 +03:00
parent 797c78ddad
commit a64a694f6d
2 changed files with 32 additions and 28 deletions

View File

@ -350,11 +350,7 @@ void SPIClass::writeBytes_(uint8_t * data, uint8_t size) {
while(SPI1CMD & SPIBUSY) {} while(SPI1CMD & SPIBUSY) {}
} }
/** /**
* Note:
* data need to be aligned to 32Bit
* or you get an Fatal exception (9)
* @param data uint8_t * * @param data uint8_t *
* @param size uint8_t max for size is 64Byte * @param size uint8_t max for size is 64Byte
* @param repeat uint32_t * @param repeat uint32_t
@ -362,37 +358,46 @@ void SPIClass::writeBytes_(uint8_t * data, uint8_t size) {
void SPIClass::writePattern(uint8_t * data, uint8_t size, uint32_t repeat) { void SPIClass::writePattern(uint8_t * data, uint8_t size, uint32_t repeat) {
if(size > 64) return; //max Hardware FIFO if(size > 64) return; //max Hardware FIFO
uint32_t byte = (size * repeat); while(SPI1CMD & SPIBUSY) {}
uint8_t r = (64 / size);
while(byte) { uint32_t buffer[16];
if(byte > 64) { uint8_t *bufferPtr=(uint8_t *)&buffer;
writePattern_(data, size, r); uint8_t *dataPtr = data;
byte -= 64; volatile uint32_t * fifoPtr = &SPI1W0;
} else { uint8_t r = 64 / size;
writePattern_(data, size, (byte / size)); uint32_t repeatRem = repeat % r;
byte = 0; repeat = repeat / r;
}
}
}
void SPIClass::writePattern_(uint8_t * data, uint8_t size, uint8_t repeat) { while(r--){
uint8_t bytes = (size * repeat);
uint8_t buffer[64];
uint8_t * bufferPtr = &buffer[0];
uint8_t * dataPtr;
uint8_t dataSize = bytes;
for(uint8_t i = 0; i < repeat; i++) {
dataSize = size;
dataPtr = data; dataPtr = data;
while(dataSize--) { for(uint8_t i=0; i<size; i++){
*bufferPtr = *dataPtr; *bufferPtr = *dataPtr;
dataPtr++;
bufferPtr++; bufferPtr++;
dataPtr++;
} }
} }
writeBytes(&buffer[0], bytes); fifoPtr = &SPI1W0;
for(uint8_t i=0; i<16; i++){
*fifoPtr = buffer[i];
fifoPtr++;
}
r = 64 / size;
SPI1U = SPIUMOSI | SPIUSSE;
//Fill fifo with data
setDataBits(r * size * 8);
while(repeat--){
SPI1CMD |= SPIBUSY;
while(SPI1CMD & SPIBUSY) {}
}
setDataBits(repeatRem * size * 8);
SPI1CMD |= SPIBUSY;
while(SPI1CMD & SPIBUSY) {}
SPI1U = SPIUMOSI | SPIUDUPLEX | SPIUSSE;
} }
/** /**

View File

@ -75,7 +75,6 @@ public:
private: private:
bool useHwCs; bool useHwCs;
void writeBytes_(uint8_t * data, uint8_t size); void writeBytes_(uint8_t * data, uint8_t size);
void writePattern_(uint8_t * data, uint8_t size, uint8_t repeat);
void transferBytes_(uint8_t * out, uint8_t * in, uint8_t size); void transferBytes_(uint8_t * out, uint8_t * in, uint8_t size);
inline void setDataBits(uint16_t bits); inline void setDataBits(uint16_t bits);
}; };