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

arduino API's SPI::transfer(void*, size) (optimized) (#4925)

* SPI::transfer(void*, size) (optimized)

* spi: transfer(): fix checking size

* spi: transferBytes_: 32bits miso transfer

* spi: transferBytes_: fix declaration

* spi: transferBytes: add comments, reduce diff
This commit is contained in:
david gauchard 2018-07-27 16:44:02 +02:00 committed by Develo
parent 9c846bd52e
commit 3cc12b1e08
2 changed files with 34 additions and 5 deletions

View File

@ -323,6 +323,25 @@ uint16_t SPIClass::transfer16(uint16_t data) {
return out.val; return out.val;
} }
void SPIClass::transfer(void *buf, uint16_t count) {
uint8_t *cbuf = reinterpret_cast<uint8_t*>(buf);
// cbuf may not be 32bits-aligned
for (; (((unsigned long)cbuf) & 3) && count; cbuf++, count--)
*cbuf = transfer(*cbuf);
// cbuf is now aligned
// count may not be a multiple of 4
uint16_t count4 = count & ~3;
transferBytes(cbuf, cbuf, count4);
// finish the last <4 bytes
cbuf += count4;
count -= count4;
for (; count; cbuf++, count--)
*cbuf = transfer(*cbuf);
}
void SPIClass::write(uint8_t data) { void SPIClass::write(uint8_t data) {
while(SPI1CMD & SPIBUSY) {} while(SPI1CMD & SPIBUSY) {}
// reset to 8Bit mode // reset to 8Bit mode
@ -511,6 +530,14 @@ void SPIClass::transferBytes(const uint8_t * out, uint8_t * in, uint32_t size) {
} }
} }
/**
* Note:
* in and out need to be aligned to 32Bit
* or you get an Fatal exception (9)
* @param out uint8_t *
* @param in uint8_t *
* @param size uint8_t (max 64)
*/
void SPIClass::transferBytes_(const uint8_t * out, uint8_t * in, uint8_t size) { void SPIClass::transferBytes_(const uint8_t * out, uint8_t * in, uint8_t size) {
while(SPI1CMD & SPIBUSY) {} while(SPI1CMD & SPIBUSY) {}
// Set in/out Bits to transfer // Set in/out Bits to transfer
@ -539,12 +566,13 @@ void SPIClass::transferBytes_(const uint8_t * out, uint8_t * in, uint8_t size) {
while(SPI1CMD & SPIBUSY) {} while(SPI1CMD & SPIBUSY) {}
if(in) { if(in) {
volatile uint8_t * fifoPtr8 = (volatile uint8_t *) &SPI1W0; uint32_t * dataPtr = (uint32_t*) in;
dataSize = size; fifoPtr = &SPI1W0;
dataSize = ((size + 3) / 4);
while(dataSize--) { while(dataSize--) {
*in = *fifoPtr8; *dataPtr = *fifoPtr;
in++; dataPtr++;
fifoPtr8++; fifoPtr++;
} }
} }
} }

View File

@ -64,6 +64,7 @@ public:
void beginTransaction(SPISettings settings); void beginTransaction(SPISettings settings);
uint8_t transfer(uint8_t data); uint8_t transfer(uint8_t data);
uint16_t transfer16(uint16_t data); uint16_t transfer16(uint16_t data);
void transfer(void *buf, uint16_t count);
void write(uint8_t data); void write(uint8_t data);
void write16(uint16_t data); void write16(uint16_t data);
void write16(uint16_t data, bool msb); void write16(uint16_t data, bool msb);