Skip to content

Commit 6693685

Browse files
committed
Merge pull request #38 from LeGeek/zero
Implements ADC and DAC functions, Interrupt and Wifi Shield validation
2 parents cf274ff + 20a3539 commit 6693685

File tree

31 files changed

+2909
-207
lines changed

31 files changed

+2909
-207
lines changed

Diff for: cores/arduino/RingBuffer.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ int RingBuffer::read_char()
5151
if(_iTail == _iHead)
5252
return -1;
5353

54-
int value = _aucBuffer[_iTail];
54+
uint8_t value = _aucBuffer[_iTail];
5555
_iTail = nextIndex(_iTail);
5656

5757
return value;

Diff for: cores/arduino/SERCOM.cpp

+55-34
Original file line numberDiff line numberDiff line change
@@ -158,14 +158,16 @@ void SERCOM::initSPI(SercomSpiTXPad mosi, SercomRXPad miso, SercomSpiCharSize ch
158158
initClockNVIC();
159159

160160
//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;
165165

166166
//Setting the CTRLB register
167167
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+
169171
}
170172

171173
void SERCOM::initSPIClock(SercomSpiClockMode clockMode, uint32_t baudrate)
@@ -184,8 +186,8 @@ void SERCOM::initSPIClock(SercomSpiClockMode clockMode, uint32_t baudrate)
184186
cpol = 1;
185187

186188
//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 );
189191

190192
//Synchronous arithmetic
191193
sercom->SPI.BAUD.reg = calculateBaudrateSynchronous(baudrate);
@@ -194,7 +196,7 @@ void SERCOM::initSPIClock(SercomSpiClockMode clockMode, uint32_t baudrate)
194196
void SERCOM::resetSPI()
195197
{
196198
//Setting the Software Reset bit to 1
197-
sercom->SPI.CTRLA.bit.SWRST = 0x1u;
199+
sercom->SPI.CTRLA.bit.SWRST = 1;
198200

199201
//Wait both bits Software Reset from CTRLA and SYNCBUSY are equal to 0
200202
while(sercom->SPI.CTRLA.bit.SWRST || sercom->SPI.SYNCBUSY.bit.SWRST);
@@ -203,19 +205,23 @@ void SERCOM::resetSPI()
203205
void SERCOM::enableSPI()
204206
{
205207
//Setting the enable bit to 1
206-
sercom->SPI.CTRLA.bit.ENABLE = 0x1ul;
208+
sercom->SPI.CTRLA.bit.ENABLE = 1;
207209

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+
}
210214
}
211215

212216
void SERCOM::disableSPI()
213217
{
214218
//Setting the enable bit to 0
215-
sercom->SPI.CTRLA.bit.ENABLE = 0x0ul;
219+
sercom->SPI.CTRLA.bit.ENABLE = 0;
216220

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+
}
219225
}
220226

221227
void SERCOM::setDataOrderSPI(SercomDataOrder dataOrder)
@@ -237,7 +243,7 @@ void SERCOM::setBaudrateSPI(uint8_t divider)
237243
//Register enable-protected
238244
disableSPI();
239245

240-
sercom->SPI.BAUD.reg = calculateBaudrateSynchronous(SERCOM_FREQ_REF / divider);
246+
sercom->SPI.BAUD.reg = calculateBaudrateSynchronous( SERCOM_FREQ_REF / divider );
241247

242248
enableSPI();
243249
}
@@ -265,12 +271,27 @@ void SERCOM::setClockModeSPI(SercomSpiClockMode clockMode)
265271
}
266272
void SERCOM::writeDataSPI(uint8_t data)
267273
{
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+
}
269285
}
270286

271287
uint16_t SERCOM::readDataSPI()
272288
{
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
274295
}
275296

276297
bool SERCOM::isBufferOverflowErrorSPI()
@@ -284,17 +305,17 @@ bool SERCOM::isDataRegisterEmptySPI()
284305
return sercom->SPI.INTFLAG.bit.DRE;
285306
}
286307

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+
//}
298319

299320
uint8_t SERCOM::calculateBaudrateSynchronous(uint32_t baudrate)
300321
{
@@ -448,7 +469,7 @@ bool SERCOM::startTransmissionWIRE(uint8_t address, SercomWireReadWriteFlag flag
448469
}
449470

450471
// Clean the 'Slave on Bus' flag, for further usage.
451-
sercom->I2CM.INTFLAG.bit.SB = 0x1ul;
472+
//sercom->I2CM.INTFLAG.bit.SB = 0x1ul;
452473
}
453474

454475

@@ -550,9 +571,9 @@ uint8_t SERCOM::readDataWIRE( void )
550571
{
551572
if(isMasterWIRE())
552573
{
553-
while( sercom->I2CM.INTFLAG.bit.SB == 0 || sercom->I2CM.STATUS.bit.CLKHOLD == 0 )
574+
while( sercom->I2CM.INTFLAG.bit.SB == 0 )
554575
{
555-
// Waiting complete receive, Clock holding & synchronization finished
576+
// Waiting complete receive
556577
}
557578

558579
return sercom->I2CM.DATA.bit.DATA ;
@@ -600,14 +621,14 @@ void SERCOM::initClockNVIC( void )
600621
IdNvic = SERCOM5_IRQn;
601622
}
602623

603-
//Setting NVIC
624+
// Setting NVIC
604625
NVIC_EnableIRQ(IdNvic);
605626
NVIC_SetPriority (IdNvic, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority */
606627

607628
//Setting clock
608629
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 ;
611632

612633
while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY )
613634
{

Diff for: cores/arduino/Uart.cpp

+7-4
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22
#include "WVariant.h"
33
#include "wiring_digital.h"
44

5-
Uart::Uart(SERCOM *s, uint8_t pinRX, uint8_t pinTX)
5+
Uart::Uart(SERCOM *_s, uint8_t _pinRX, uint8_t _pinTX)
66
{
7-
sercom = s;
8-
pinPeripheral(pinRX, g_APinDescription[pinRX].ulPinType);
9-
pinPeripheral(pinTX, g_APinDescription[pinTX].ulPinType);
7+
sercom = _s;
8+
uc_pinRX = _pinRX;
9+
uc_pinTX = _pinTX;
1010
}
1111

1212
void Uart::begin(unsigned long baudrate)
@@ -16,6 +16,9 @@ void Uart::begin(unsigned long baudrate)
1616

1717
void Uart::begin(unsigned long baudrate, uint8_t config)
1818
{
19+
pinPeripheral(uc_pinRX, g_APinDescription[uc_pinRX].ulPinType);
20+
pinPeripheral(uc_pinTX, g_APinDescription[uc_pinTX].ulPinType);
21+
1922
sercom->initUART(UART_INT_CLOCK, SAMPLE_RATE_x16, baudrate);
2023
sercom->initFrame(extractCharSize(config), LSB_FIRST, extractParity(config), extractNbStopBit(config));
2124
sercom->initPads(UART_TX_PAD_2, SERCOM_RX_PAD_3);

Diff for: cores/arduino/Uart.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
class Uart : public HardwareSerial
1212
{
1313
public:
14-
Uart(SERCOM *s, uint8_t pinRX, uint8_t pinTX);
14+
Uart(SERCOM *_s, uint8_t _pinRX, uint8_t _pinTX);
1515
void begin(unsigned long baudRate);
1616
void begin(unsigned long baudrate, uint8_t config);
1717
void end();
@@ -29,6 +29,9 @@ class Uart : public HardwareSerial
2929
private:
3030
SERCOM *sercom;
3131
RingBuffer rxBuffer;
32+
33+
uint8_t uc_pinRX;
34+
uint8_t uc_pinTX;
3235

3336
SercomNumberStopBit extractNbStopBit(uint8_t config);
3437
SercomUartCharSize extractCharSize(uint8_t config);

Diff for: cores/arduino/WInterrupts.c

+24-9
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ static void __initialize()
5151
NVIC_SetPriority( EIC_IRQn, 0 ) ;
5252
NVIC_EnableIRQ( EIC_IRQn ) ;
5353

54+
55+
5456
// Enable GCLK for IEC (External Interrupt Controller)
5557
GCLK->CLKCTRL.reg = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID( GCM_EIC )) ;
5658

@@ -60,9 +62,18 @@ static void __initialize()
6062
6163
while ( (EIC->CTRL.SWRST.bit == 1) && (EIC->STATUS.SYNCBUSY.bit == 1) )
6264
{
63-
// Wait for synchronisation
65+
// Waiting for synchronisation
6466
}
6567
*/
68+
69+
// Enable EIC
70+
EIC->CTRL.bit.ENABLE = 1 ;
71+
72+
while ( EIC->STATUS.bit.SYNCBUSY == 1 )
73+
{
74+
// Waiting for synchronisation
75+
}
76+
6677
}
6778

6879
/*
@@ -109,27 +120,31 @@ void attachInterrupt( uint32_t ulPin, voidFuncPtr callback, uint32_t ulMode )
109120
}
110121

111122
// Configure the interrupt mode
112-
ulPos = ((digitalPinToInterrupt( ulPin ) >> ulConfig ) << 2) ;
123+
ulPos = ((digitalPinToInterrupt( ulPin ) - (8*ulConfig) ) << 2) ;
113124
switch ( ulMode )
114125
{
115126
case LOW:
116-
EIC->CONFIG[ulConfig].reg = EIC_CONFIG_SENSE0_LOW_Val << ulPos ;
127+
EIC->CONFIG[ulConfig].reg |= EIC_CONFIG_SENSE0_LOW_Val << ulPos ;
117128
break ;
118129

119130
case HIGH:
120-
EIC->CONFIG[ulConfig].reg = EIC_CONFIG_SENSE0_HIGH_Val << ((digitalPinToInterrupt( ulPin ) >> ulConfig ) << 2) ;
131+
// EIC->CONFIG[ulConfig].reg = EIC_CONFIG_SENSE0_HIGH_Val << ((digitalPinToInterrupt( ulPin ) >> ulConfig ) << ulPos) ;
132+
EIC->CONFIG[ulConfig].reg |= EIC_CONFIG_SENSE0_HIGH_Val << ulPos ;
121133
break ;
122134

123135
case CHANGE:
124-
EIC->CONFIG[ulConfig].reg = EIC_CONFIG_SENSE0_BOTH_Val << ((digitalPinToInterrupt( ulPin ) >> ulConfig ) << 2) ;
136+
// EIC->CONFIG[ulConfig].reg = EIC_CONFIG_SENSE0_BOTH_Val << ((digitalPinToInterrupt( ulPin ) >> ulConfig ) << ulPos) ;
137+
EIC->CONFIG[ulConfig].reg |= EIC_CONFIG_SENSE0_BOTH_Val << ulPos ;
125138
break ;
126139

127140
case FALLING:
128-
EIC->CONFIG[ulConfig].reg = EIC_CONFIG_SENSE0_FALL_Val << ((digitalPinToInterrupt( ulPin ) >> ulConfig ) << 2) ;
141+
// EIC->CONFIG[ulConfig].reg = EIC_CONFIG_SENSE0_FALL_Val << ((digitalPinToInterrupt( ulPin ) >> ulConfig ) << ulPos) ;
142+
EIC->CONFIG[ulConfig].reg |= EIC_CONFIG_SENSE0_FALL_Val << ulPos ;
129143
break ;
130144

131145
case RISING:
132-
EIC->CONFIG[ulConfig].reg = EIC_CONFIG_SENSE0_RISE_Val << ((digitalPinToInterrupt( ulPin ) >> ulConfig ) << 2) ;
146+
// EIC->CONFIG[ulConfig].reg = EIC_CONFIG_SENSE0_RISE_Val << ((digitalPinToInterrupt( ulPin ) >> ulConfig ) << ulPos) ;
147+
EIC->CONFIG[ulConfig].reg |= EIC_CONFIG_SENSE0_RISE_Val << ulPos ;
133148
break ;
134149
}
135150

@@ -209,9 +224,9 @@ void EIC_Handler( void )
209224
}
210225

211226
// Test the 16 normal interrupts
212-
for ( ul = EXTERNAL_INT_0 ; ul < EXTERNAL_INT_15 ; ul++ )
227+
for ( ul = EXTERNAL_INT_0 ; ul < EXTERNAL_INT_NMI ; ul++ )
213228
{
214-
if ( (EIC->INTFLAG.reg & 1 << ul) != 0 )
229+
if ( (EIC->INTFLAG.reg & ( 1 << ul ) ) != 0 )
215230
{
216231
// Call the callback function if assigned
217232
if ( callbacksInt[ul]._callback != NULL )

Diff for: cores/arduino/delay.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ void delay( uint32_t ms )
5555
do
5656
{
5757
yield() ;
58-
} while ( _ulTickCount - start < ms ) ;
58+
} while ( _ulTickCount - start <= ms ) ;
5959
}
6060

6161
void SysTick_Handler( void )

Diff for: cores/arduino/delay.h

+7-2
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,18 @@ static inline void delayMicroseconds(uint32_t) __attribute__((always_inline, unu
6464
static inline void delayMicroseconds(uint32_t usec){
6565
if (usec == 0) return;
6666
uint32_t n = usec * (VARIANT_MCK / 3000000);
67-
67+
#if 0
6868
__asm__ volatile(
6969
"L_%=_delayMicroseconds:" "\n\t"
70-
"subs %0, #1" "\n\t"
70+
"subs %0, %0, #1" "\n\t"
7171
"bne L_%=_delayMicroseconds" "\n"
7272
: "+r" (n) :
7373
);
74+
#else
75+
for ( ; n != 0 ; n-- )
76+
{
77+
}
78+
#endif
7479
}
7580

7681
/*

0 commit comments

Comments
 (0)