File tree Expand file tree Collapse file tree 4 files changed +26
-12
lines changed
Expand file tree Collapse file tree 4 files changed +26
-12
lines changed Original file line number Diff line number Diff 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 }
Original file line number Diff line number Diff 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 ) ;
Original file line number Diff line number Diff line change @@ -187,7 +187,11 @@ void SPIClass::setClockDivider(uint8_t div)
187187
188188byte 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
193197uint16_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-
216213void SPIClass::attachInterrupt () {
217214 // Should be enableInterrupt()
218215}
Original file line number Diff line number Diff 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
You can’t perform that action at this time.
0 commit comments