@@ -158,14 +158,16 @@ void SERCOM::initSPI(SercomSpiTXPad mosi, SercomRXPad miso, SercomSpiCharSize ch
158
158
initClockNVIC ();
159
159
160
160
// Setting the CTRLA register
161
- sercom->SPI .CTRLA .reg = SERCOM_SPI_CTRLA_MODE (SPI_MASTER_OPERATION) |
162
- SERCOM_SPI_CTRLA_DOPO (mosi) |
163
- SERCOM_SPI_CTRLA_DIPO (miso) |
164
- dataOrder << SERCOM_SPI_CTRLA_DORD_Pos;
161
+ sercom->SPI .CTRLA .reg = SERCOM_SPI_CTRLA_MODE_SPI_MASTER |
162
+ SERCOM_SPI_CTRLA_DOPO (mosi) |
163
+ SERCOM_SPI_CTRLA_DIPO (miso) |
164
+ dataOrder << SERCOM_SPI_CTRLA_DORD_Pos;
165
165
166
166
// Setting the CTRLB register
167
167
sercom->SPI .CTRLB .reg = SERCOM_SPI_CTRLB_CHSIZE (charSize) |
168
- (0x1ul ) << SERCOM_SPI_CTRLB_RXEN_Pos; // Active the SPI receiver.
168
+ SERCOM_SPI_CTRLB_RXEN; // Active the SPI receiver.
169
+
170
+
169
171
}
170
172
171
173
void SERCOM::initSPIClock (SercomSpiClockMode clockMode, uint32_t baudrate)
@@ -184,8 +186,8 @@ void SERCOM::initSPIClock(SercomSpiClockMode clockMode, uint32_t baudrate)
184
186
cpol = 1 ;
185
187
186
188
// Setting the CTRLA register
187
- sercom->SPI .CTRLA .reg |= cpha << SERCOM_SPI_CTRLA_CPHA_Pos |
188
- cpol << SERCOM_SPI_CTRLA_CPOL_Pos;
189
+ sercom->SPI .CTRLA .reg |= ( cpha << SERCOM_SPI_CTRLA_CPHA_Pos ) |
190
+ ( cpol << SERCOM_SPI_CTRLA_CPOL_Pos ) ;
189
191
190
192
// Synchronous arithmetic
191
193
sercom->SPI .BAUD .reg = calculateBaudrateSynchronous (baudrate);
@@ -194,7 +196,7 @@ void SERCOM::initSPIClock(SercomSpiClockMode clockMode, uint32_t baudrate)
194
196
void SERCOM::resetSPI ()
195
197
{
196
198
// Setting the Software Reset bit to 1
197
- sercom->SPI .CTRLA .bit .SWRST = 0x1u ;
199
+ sercom->SPI .CTRLA .bit .SWRST = 1 ;
198
200
199
201
// Wait both bits Software Reset from CTRLA and SYNCBUSY are equal to 0
200
202
while (sercom->SPI .CTRLA .bit .SWRST || sercom->SPI .SYNCBUSY .bit .SWRST );
@@ -203,19 +205,23 @@ void SERCOM::resetSPI()
203
205
void SERCOM::enableSPI ()
204
206
{
205
207
// Setting the enable bit to 1
206
- sercom->SPI .CTRLA .bit .ENABLE = 0x1ul ;
208
+ sercom->SPI .CTRLA .bit .ENABLE = 1 ;
207
209
208
- // Waiting then enable bit from SYNCBUSY is equal to 0;
209
- while (sercom->SPI .SYNCBUSY .bit .ENABLE );
210
+ while (sercom->SPI .SYNCBUSY .bit .ENABLE )
211
+ {
212
+ // Waiting then enable bit from SYNCBUSY is equal to 0;
213
+ }
210
214
}
211
215
212
216
void SERCOM::disableSPI ()
213
217
{
214
218
// Setting the enable bit to 0
215
- sercom->SPI .CTRLA .bit .ENABLE = 0x0ul ;
219
+ sercom->SPI .CTRLA .bit .ENABLE = 0 ;
216
220
217
- // Waiting then enable bit from SYNCBUSY is equal to 0;
218
- while (sercom->SPI .SYNCBUSY .bit .ENABLE );
221
+ while (sercom->SPI .SYNCBUSY .bit .ENABLE )
222
+ {
223
+ // Waiting then enable bit from SYNCBUSY is equal to 0;
224
+ }
219
225
}
220
226
221
227
void SERCOM::setDataOrderSPI (SercomDataOrder dataOrder)
@@ -237,7 +243,7 @@ void SERCOM::setBaudrateSPI(uint8_t divider)
237
243
// Register enable-protected
238
244
disableSPI ();
239
245
240
- sercom->SPI .BAUD .reg = calculateBaudrateSynchronous (SERCOM_FREQ_REF / divider);
246
+ sercom->SPI .BAUD .reg = calculateBaudrateSynchronous ( SERCOM_FREQ_REF / divider );
241
247
242
248
enableSPI ();
243
249
}
@@ -265,12 +271,27 @@ void SERCOM::setClockModeSPI(SercomSpiClockMode clockMode)
265
271
}
266
272
void SERCOM::writeDataSPI (uint8_t data)
267
273
{
268
- sercom->SPI .DATA .bit .DATA = data;
274
+ while ( sercom->SPI .INTFLAG .bit .DRE == 0 )
275
+ {
276
+ // Waiting Data Registry Empty
277
+ }
278
+
279
+ sercom->SPI .DATA .bit .DATA = data; // Writing data into Data register
280
+
281
+ while ( sercom->SPI .INTFLAG .bit .TXC == 0 || sercom->SPI .INTFLAG .bit .DRE == 0 )
282
+ {
283
+ // Waiting Complete Transmission
284
+ }
269
285
}
270
286
271
287
uint16_t SERCOM::readDataSPI ()
272
288
{
273
- return sercom->SPI .DATA .reg ;
289
+ while ( sercom->SPI .INTFLAG .bit .DRE == 0 || sercom->SPI .INTFLAG .bit .RXC == 0 )
290
+ {
291
+ // Waiting Complete Reception
292
+ }
293
+
294
+ return sercom->SPI .DATA .bit .DATA ; // Reading data
274
295
}
275
296
276
297
bool SERCOM::isBufferOverflowErrorSPI ()
@@ -284,17 +305,17 @@ bool SERCOM::isDataRegisterEmptySPI()
284
305
return sercom->SPI .INTFLAG .bit .DRE ;
285
306
}
286
307
287
- bool SERCOM::isTransmitCompleteSPI ()
288
- {
289
- // TXC : Transmit complete
290
- return sercom->SPI .INTFLAG .bit .TXC ;
291
- }
292
-
293
- bool SERCOM::isReceiveCompleteSPI ()
294
- {
295
- // RXC : Receive complete
296
- return sercom->SPI .INTFLAG .bit .RXC ;
297
- }
308
+ // bool SERCOM::isTransmitCompleteSPI()
309
+ // {
310
+ // //TXC : Transmit complete
311
+ // return sercom->SPI.INTFLAG.bit.TXC;
312
+ // }
313
+ //
314
+ // bool SERCOM::isReceiveCompleteSPI()
315
+ // {
316
+ // //RXC : Receive complete
317
+ // return sercom->SPI.INTFLAG.bit.RXC;
318
+ // }
298
319
299
320
uint8_t SERCOM::calculateBaudrateSynchronous (uint32_t baudrate)
300
321
{
@@ -448,7 +469,7 @@ bool SERCOM::startTransmissionWIRE(uint8_t address, SercomWireReadWriteFlag flag
448
469
}
449
470
450
471
// Clean the 'Slave on Bus' flag, for further usage.
451
- sercom->I2CM .INTFLAG .bit .SB = 0x1ul ;
472
+ // sercom->I2CM.INTFLAG.bit.SB = 0x1ul;
452
473
}
453
474
454
475
@@ -550,9 +571,9 @@ uint8_t SERCOM::readDataWIRE( void )
550
571
{
551
572
if (isMasterWIRE ())
552
573
{
553
- while ( sercom->I2CM .INTFLAG .bit .SB == 0 || sercom-> I2CM . STATUS . bit . CLKHOLD == 0 )
574
+ while ( sercom->I2CM .INTFLAG .bit .SB == 0 )
554
575
{
555
- // Waiting complete receive, Clock holding & synchronization finished
576
+ // Waiting complete receive
556
577
}
557
578
558
579
return sercom->I2CM .DATA .bit .DATA ;
@@ -600,14 +621,14 @@ void SERCOM::initClockNVIC( void )
600
621
IdNvic = SERCOM5_IRQn;
601
622
}
602
623
603
- // Setting NVIC
624
+ // Setting NVIC
604
625
NVIC_EnableIRQ (IdNvic);
605
626
NVIC_SetPriority (IdNvic, (1 <<__NVIC_PRIO_BITS) - 1 ); /* set Priority */
606
627
607
628
// Setting clock
608
629
GCLK->CLKCTRL .reg = GCLK_CLKCTRL_ID ( clockId ) | // Generic Clock 0 (SERCOMx)
609
- GCLK_CLKCTRL_GEN_GCLK0 | // Generic Clock Generator 0 is source
610
- GCLK_CLKCTRL_CLKEN ;
630
+ GCLK_CLKCTRL_GEN_GCLK0 | // Generic Clock Generator 0 is source
631
+ GCLK_CLKCTRL_CLKEN ;
611
632
612
633
while ( GCLK->STATUS .reg & GCLK_STATUS_SYNCBUSY )
613
634
{
0 commit comments