Skip to content

Commit dab0842

Browse files
committed
Revert "Optimize SPI transfers"
This reverts commit bb5b7c0.
1 parent 82968f6 commit dab0842

File tree

4 files changed

+26
-12
lines changed

4 files changed

+26
-12
lines changed

cores/arduino/SERCOM.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ void SERCOM::setClockModeSPI(SercomSpiClockMode clockMode)
300300
enableSPI();
301301
}
302302

303-
uint8_t SERCOM::transferDataSPI(uint8_t data)
303+
void SERCOM::writeDataSPI(uint8_t data)
304304
{
305305
while( sercom->SPI.INTFLAG.bit.DRE == 0 )
306306
{
@@ -309,7 +309,15 @@ uint8_t SERCOM::transferDataSPI(uint8_t data)
309309

310310
sercom->SPI.DATA.bit.DATA = data; // Writing data into Data register
311311

312-
while( sercom->SPI.INTFLAG.bit.RXC == 0 )
312+
while( sercom->SPI.INTFLAG.bit.TXC == 0 || sercom->SPI.INTFLAG.bit.DRE == 0 )
313+
{
314+
// Waiting Complete Transmission
315+
}
316+
}
317+
318+
uint16_t SERCOM::readDataSPI()
319+
{
320+
while( sercom->SPI.INTFLAG.bit.DRE == 0 || sercom->SPI.INTFLAG.bit.RXC == 0 )
313321
{
314322
// Waiting Complete Reception
315323
}

cores/arduino/SERCOM.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,8 @@ class SERCOM
175175
SercomDataOrder getDataOrderSPI( void ) ;
176176
void setBaudrateSPI(uint8_t divider) ;
177177
void setClockModeSPI(SercomSpiClockMode clockMode) ;
178-
uint8_t transferDataSPI(uint8_t data) ;
178+
void writeDataSPI(uint8_t data) ;
179+
uint16_t readDataSPI( void ) ;
179180
bool isBufferOverflowErrorSPI( void ) ;
180181
bool isDataRegisterEmptySPI( void ) ;
181182
bool isTransmitCompleteSPI( void ) ;

libraries/SPI/SPI.cpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,11 @@ void SPIClass::setClockDivider(uint8_t div)
187187

188188
byte SPIClass::transfer(uint8_t data)
189189
{
190-
return _p_sercom->transferDataSPI(data);
190+
// Writing the data
191+
_p_sercom->writeDataSPI(data);
192+
193+
// Read data
194+
return _p_sercom->readDataSPI() & 0xFF;
191195
}
192196

193197
uint16_t SPIClass::transfer16(uint16_t data) {
@@ -206,13 +210,6 @@ uint16_t SPIClass::transfer16(uint16_t data) {
206210
return t.val;
207211
}
208212

209-
void SPIClass::transfer(void *buf, size_t count)
210-
{
211-
uint8_t *buffer = reinterpret_cast<uint8_t *>(buf);
212-
for (size_t i=0; i<count; i++)
213-
*buffer++ = transfer(*buffer);
214-
}
215-
216213
void SPIClass::attachInterrupt() {
217214
// Should be enableInterrupt()
218215
}

libraries/SPI/SPI.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ class SPIClass {
9696

9797
byte transfer(uint8_t data);
9898
uint16_t transfer16(uint16_t data);
99-
void transfer(void *buf, size_t count);
99+
inline void transfer(void *buf, size_t count);
100100

101101
// Transaction Functions
102102
void usingInterrupt(int interruptNumber);
@@ -132,6 +132,14 @@ class SPIClass {
132132
uint32_t interruptMask;
133133
};
134134

135+
void SPIClass::transfer(void *buf, size_t count)
136+
{
137+
// TODO: Optimize for faster block-transfer
138+
uint8_t *buffer = reinterpret_cast<uint8_t *>(buf);
139+
for (size_t i=0; i<count; i++)
140+
buffer[i] = transfer(buffer[i]);
141+
}
142+
135143
#if SPI_INTERFACES_COUNT > 0
136144
extern SPIClass SPI;
137145
#endif

0 commit comments

Comments
 (0)