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:
parent
797c78ddad
commit
a64a694f6d
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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);
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user