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)
300
300
enableSPI ();
301
301
}
302
302
303
- uint8_t SERCOM::transferDataSPI (uint8_t data)
303
+ void SERCOM::writeDataSPI (uint8_t data)
304
304
{
305
305
while ( sercom->SPI .INTFLAG .bit .DRE == 0 )
306
306
{
@@ -309,7 +309,15 @@ uint8_t SERCOM::transferDataSPI(uint8_t data)
309
309
310
310
sercom->SPI .DATA .bit .DATA = data; // Writing data into Data register
311
311
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 )
313
321
{
314
322
// Waiting Complete Reception
315
323
}
Original file line number Diff line number Diff line change @@ -175,7 +175,8 @@ class SERCOM
175
175
SercomDataOrder getDataOrderSPI ( void ) ;
176
176
void setBaudrateSPI (uint8_t divider) ;
177
177
void setClockModeSPI (SercomSpiClockMode clockMode) ;
178
- uint8_t transferDataSPI (uint8_t data) ;
178
+ void writeDataSPI (uint8_t data) ;
179
+ uint16_t readDataSPI ( void ) ;
179
180
bool isBufferOverflowErrorSPI ( void ) ;
180
181
bool isDataRegisterEmptySPI ( void ) ;
181
182
bool isTransmitCompleteSPI ( void ) ;
Original file line number Diff line number Diff line change @@ -187,7 +187,11 @@ void SPIClass::setClockDivider(uint8_t div)
187
187
188
188
byte SPIClass::transfer (uint8_t data)
189
189
{
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 ;
191
195
}
192
196
193
197
uint16_t SPIClass::transfer16 (uint16_t data) {
@@ -206,13 +210,6 @@ uint16_t SPIClass::transfer16(uint16_t data) {
206
210
return t.val ;
207
211
}
208
212
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
-
216
213
void SPIClass::attachInterrupt () {
217
214
// Should be enableInterrupt()
218
215
}
Original file line number Diff line number Diff line change @@ -96,7 +96,7 @@ class SPIClass {
96
96
97
97
byte transfer (uint8_t data);
98
98
uint16_t transfer16 (uint16_t data);
99
- void transfer (void *buf, size_t count);
99
+ inline void transfer (void *buf, size_t count);
100
100
101
101
// Transaction Functions
102
102
void usingInterrupt (int interruptNumber);
@@ -132,6 +132,14 @@ class SPIClass {
132
132
uint32_t interruptMask;
133
133
};
134
134
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
+
135
143
#if SPI_INTERFACES_COUNT > 0
136
144
extern SPIClass SPI;
137
145
#endif
You can’t perform that action at this time.
0 commit comments