Skip to content

Commit bf20844

Browse files
committed
Merge branch 'master' of github.com:arduino/ArduinoCore-samd
2 parents 22f47bb + 4b41eec commit bf20844

File tree

8 files changed

+87
-42
lines changed

8 files changed

+87
-42
lines changed

CHANGELOG

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ SAMD CORE 1.6.3
44
* Bugfix: added missing Serial.begin(baud, config) method. Thanks @tuxedo0801
55
* Bootloader: 32Khz external oscillator is now used, improves USB clock. Thanks @aethaniel
66
* Bootloader: Clean up of makefiles and file organization. Thanks @aethaniel
7+
* Added PWM capability to pins A1/A2 of Arduino Zero.
8+
* variant.h/cpp: PWM capability is now determined by PIN_ATTR_PWM combined with
9+
PIN_ATTR_TIMER or PIN_ATTR_TIMER_ALT for timer selection.
710

811
SAMD CORE 1.6.2 2015.11.03
912

cores/arduino/SERCOM.cpp

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -415,14 +415,12 @@ void SERCOM::initSlaveWIRE( uint8_t ucAddress )
415415
// Set slave mode
416416
sercom->I2CS.CTRLA.bit.MODE = I2C_SLAVE_OPERATION ;
417417

418-
// Enable Quick Command
419-
sercom->I2CM.CTRLB.bit.QCEN = 1 ;
420-
421418
sercom->I2CS.ADDR.reg = SERCOM_I2CS_ADDR_ADDR( ucAddress & 0x7Ful ) | // 0x7F, select only 7 bits
422419
SERCOM_I2CS_ADDR_ADDRMASK( 0x3FFul ) ; // 0x3FF all bits set
423420

424421
// Set the interrupt register
425-
sercom->I2CS.INTENSET.reg = SERCOM_I2CS_INTENSET_AMATCH | // Address Match
422+
sercom->I2CS.INTENSET.reg = SERCOM_I2CS_INTENSET_PREC | // Stop
423+
SERCOM_I2CS_INTENSET_AMATCH | // Address Match
426424
SERCOM_I2CS_INTENSET_DRDY ; // Data Ready
427425

428426
while ( sercom->I2CM.SYNCBUSY.bit.SYSOP != 0 )
@@ -455,23 +453,35 @@ void SERCOM::initMasterWIRE( uint32_t baudrate )
455453

456454
void SERCOM::prepareNackBitWIRE( void )
457455
{
458-
// Send a NACK
459-
sercom->I2CM.CTRLB.bit.ACKACT = 1;
456+
if(isMasterWIRE()) {
457+
// Send a NACK
458+
sercom->I2CM.CTRLB.bit.ACKACT = 1;
459+
} else {
460+
sercom->I2CS.CTRLB.bit.ACKACT = 1;
461+
}
460462
}
461463

462464
void SERCOM::prepareAckBitWIRE( void )
463465
{
464-
// Send an ACK
465-
sercom->I2CM.CTRLB.bit.ACKACT = 0;
466+
if(isMasterWIRE()) {
467+
// Send an ACK
468+
sercom->I2CM.CTRLB.bit.ACKACT = 0;
469+
} else {
470+
sercom->I2CS.CTRLB.bit.ACKACT = 0;
471+
}
466472
}
467473

468-
void SERCOM::prepareCommandBitsWire(SercomMasterCommandWire cmd)
474+
void SERCOM::prepareCommandBitsWire(uint8_t cmd)
469475
{
470-
sercom->I2CM.CTRLB.bit.CMD = cmd;
476+
if(isMasterWIRE()) {
477+
sercom->I2CM.CTRLB.bit.CMD = cmd;
471478

472-
while(sercom->I2CM.SYNCBUSY.bit.SYSOP)
473-
{
474-
// Waiting for synchronization
479+
while(sercom->I2CM.SYNCBUSY.bit.SYSOP)
480+
{
481+
// Waiting for synchronization
482+
}
483+
} else {
484+
sercom->I2CS.CTRLB.bit.CMD = cmd;
475485
}
476486
}
477487

cores/arduino/SERCOM.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ class SERCOM
192192
void disableWIRE( void );
193193
void prepareNackBitWIRE( void ) ;
194194
void prepareAckBitWIRE( void ) ;
195-
void prepareCommandBitsWire(SercomMasterCommandWire cmd);
195+
void prepareCommandBitsWire(uint8_t cmd);
196196
bool startTransmissionWIRE(uint8_t address, SercomWireReadWriteFlag flag) ;
197197
bool sendDataMasterWIRE(uint8_t data) ;
198198
bool sendDataSlaveWIRE(uint8_t data) ;

cores/arduino/WVariant.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,8 @@ typedef enum _EPioType
190190
#define PIN_ATTR_DIGITAL (1UL<<2)
191191
#define PIN_ATTR_PWM (1UL<<3)
192192
#define PIN_ATTR_TIMER (1UL<<4)
193-
#define PIN_ATTR_EXTINT (1UL<<5)
193+
#define PIN_ATTR_TIMER_ALT (1UL<<5)
194+
#define PIN_ATTR_EXTINT (1UL<<6)
194195

195196
/* Types used for the table below */
196197
typedef struct _PinDescription

cores/arduino/wiring_analog.c

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ uint32_t analogRead( uint32_t ulPin )
147147
if (ulPin == 6) ulPin = PIN_A6;
148148
if (ulPin == 7) ulPin = PIN_A7;
149149

150-
pinPeripheral(ulPin, g_APinDescription[ulPin].ulPinType);
150+
pinPeripheral(ulPin, PIO_ANALOG);
151151

152152
if (ulPin == A0) // Disable DAC, if analogWrite(A0,dval) used previously the DAC is enabled
153153
{
@@ -225,9 +225,19 @@ void analogWrite( uint32_t ulPin, uint32_t ulValue )
225225

226226
if ( (attr & PIN_ATTR_PWM) == PIN_ATTR_PWM )
227227
{
228-
if ( (g_APinDescription[ulPin].ulPinType == PIO_TIMER) || g_APinDescription[ulPin].ulPinType == PIO_TIMER_ALT )
229-
{
230-
pinPeripheral( ulPin, g_APinDescription[ulPin].ulPinType ) ;
228+
if (attr & PIN_ATTR_TIMER) {
229+
#if !(ARDUINO_SAMD_VARIANT_COMPLIANCE >= 10603)
230+
// Compatibility for cores based on SAMD core <=1.6.2
231+
if (g_APinDescription[ulPin].ulPinType == PIO_TIMER_ALT) {
232+
pinPeripheral(ulPin, PIO_TIMER_ALT);
233+
} else
234+
#endif
235+
{
236+
pinPeripheral(ulPin, PIO_TIMER);
237+
}
238+
} else {
239+
// We suppose that attr has PIN_ATTR_TIMER_ALT bit set...
240+
pinPeripheral(ulPin, PIO_TIMER_ALT);
231241
}
232242

233243
Tc* TCx = 0 ;

libraries/Wire/Wire.cpp

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ void TwoWire::begin(uint8_t address) {
4747
//Slave mode
4848
sercom->initSlaveWIRE(address);
4949
sercom->enableWIRE();
50+
51+
pinPeripheral(_uc_pinSDA, g_APinDescription[_uc_pinSDA].ulPinType);
52+
pinPeripheral(_uc_pinSCL, g_APinDescription[_uc_pinSCL].ulPinType);
5053
}
5154

5255
void TwoWire::setClock(uint32_t baudrate) {
@@ -212,36 +215,51 @@ void TwoWire::onService(void)
212215
{
213216
if ( sercom->isSlaveWIRE() )
214217
{
215-
//Received data
216-
if(sercom->isDataReadyWIRE())
218+
if(sercom->isStopDetectedWIRE() ||
219+
(sercom->isAddressMatch() && sercom->isRestartDetectedWIRE() && !sercom->isMasterReadOperationWIRE())) //Stop or Restart detected
217220
{
218-
//Store data
219-
rxBuffer.store_char(sercom->readDataWIRE());
221+
sercom->prepareAckBitWIRE();
222+
sercom->prepareCommandBitsWire(0x03);
220223

221-
//Stop or Restart detected
222-
if(sercom->isStopDetectedWIRE() || sercom->isRestartDetectedWIRE())
224+
//Calling onReceiveCallback, if exists
225+
if(onReceiveCallback)
223226
{
224-
//Calling onReceiveCallback, if exists
225-
if(onReceiveCallback)
226-
{
227-
onReceiveCallback(available());
228-
}
227+
onReceiveCallback(available());
229228
}
229+
230+
rxBuffer.clear();
230231
}
231-
232-
//Address Match
233-
if(sercom->isAddressMatch())
232+
else if(sercom->isAddressMatch()) //Address Match
234233
{
235-
//Is a request ?
236-
if(sercom->isMasterReadOperationWIRE())
234+
sercom->prepareAckBitWIRE();
235+
sercom->prepareCommandBitsWire(0x03);
236+
237+
if(sercom->isMasterReadOperationWIRE()) //Is a request ?
237238
{
239+
// wait for data ready flag,
240+
// before calling request callback
241+
while(!sercom->isDataReadyWIRE());
242+
238243
//Calling onRequestCallback, if exists
239244
if(onRequestCallback)
240245
{
241246
onRequestCallback();
242247
}
243248
}
244249
}
250+
else if(sercom->isDataReadyWIRE()) //Received data
251+
{
252+
if (rxBuffer.isFull()) {
253+
sercom->prepareNackBitWIRE();
254+
} else {
255+
//Store data
256+
rxBuffer.store_char(sercom->readDataWIRE());
257+
258+
sercom->prepareAckBitWIRE();
259+
}
260+
261+
sercom->prepareCommandBitsWire(0x03);
262+
}
245263
}
246264
}
247265

variants/arduino_zero/variant.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -123,27 +123,27 @@ const PinDescription g_APinDescription[]=
123123
{ PORTA, 9, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM0_CH1, TCC0_CH1, EXTERNAL_INT_9 }, // TCC0/WO[1]
124124
{ PORTA, 8, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM0_CH0, TCC0_CH0, EXTERNAL_INT_NMI }, // TCC0/WO[0]
125125
{ PORTA, 15, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM3_CH1, TC3_CH1, EXTERNAL_INT_15 }, // TC3/WO[1]
126-
{ PORTA, 20, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM0_CH6, TCC0_CH6, EXTERNAL_INT_4 }, // TCC0/WO[6]
126+
{ PORTA, 20, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH6, TCC0_CH6, EXTERNAL_INT_4 }, // TCC0/WO[6]
127127
{ PORTA, 21, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_5 },
128128

129129
// Digital High
130130
{ PORTA, 6, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER|PIN_ATTR_ANALOG), ADC_Channel6, PWM1_CH0, TCC1_CH0, EXTERNAL_INT_6 }, // TCC1/WO[0]
131131
{ PORTA, 7, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER|PIN_ATTR_ANALOG), ADC_Channel7, PWM1_CH1, TCC1_CH1, EXTERNAL_INT_7 }, // TCC1/WO[1]
132132
{ PORTA, 18, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM3_CH0, TC3_CH0, EXTERNAL_INT_2 }, // TC3/WO[0]
133133
{ PORTA, 16, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM2_CH0, TCC2_CH0, EXTERNAL_INT_0 }, // TCC2/WO[0]
134-
{ PORTA, 19, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM0_CH3, TCC0_CH3, EXTERNAL_INT_3 }, // TCC0/WO[3]
134+
{ PORTA, 19, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH3, TCC0_CH3, EXTERNAL_INT_3 }, // TCC0/WO[3]
135135

136136
// 13 (LED)
137137
{ PORTA, 17, PIO_PWM, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM), No_ADC_Channel, PWM2_CH1, NOT_ON_TIMER, EXTERNAL_INT_1 }, // TCC2/WO[1]
138138

139139
// 14..19 - Analog pins
140140
// --------------------
141141
{ PORTA, 2, PIO_ANALOG, PIN_ATTR_ANALOG, ADC_Channel0, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_2 }, // ADC/AIN[0]
142-
{ PORTB, 8, PIO_ANALOG, PIN_ATTR_ANALOG, ADC_Channel2, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_8 }, // ADC/AIN[2]
143-
{ PORTB, 9, PIO_ANALOG, PIN_ATTR_ANALOG, ADC_Channel3, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_9 }, // ADC/AIN[3]
144-
{ PORTA, 4, PIO_ANALOG, PIN_ATTR_ANALOG, ADC_Channel4, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_4 }, // ADC/AIN[4]
145-
{ PORTA, 5, PIO_ANALOG, PIN_ATTR_ANALOG, ADC_Channel5, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_5 }, // ADC/AIN[5]
146-
{ PORTB, 2, PIO_ANALOG, PIN_ATTR_ANALOG, ADC_Channel10, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_2 }, // ADC/AIN[10]
142+
{ PORTB, 8, PIO_ANALOG, (PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel2, PWM4_CH0, TC4_CH0, EXTERNAL_INT_8 }, // ADC/AIN[2]
143+
{ PORTB, 9, PIO_ANALOG, (PIN_ATTR_PWM|PIN_ATTR_TIMER), ADC_Channel3, PWM4_CH1, TC4_CH1, EXTERNAL_INT_9 }, // ADC/AIN[3]
144+
{ PORTA, 4, PIO_ANALOG, 0, ADC_Channel4, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_4 }, // ADC/AIN[4]
145+
{ PORTA, 5, PIO_ANALOG, 0, ADC_Channel5, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_5 }, // ADC/AIN[5]
146+
{ PORTB, 2, PIO_ANALOG, 0, ADC_Channel10, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_2 }, // ADC/AIN[10]
147147

148148
// 20..21 I2C pins (SDA/SCL and also EDBG:SDA/SCL)
149149
// ----------------------

variants/arduino_zero/variant.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
#ifndef _VARIANT_ARDUINO_ZERO_
2020
#define _VARIANT_ARDUINO_ZERO_
2121

22+
// The definitions here needs a SAMD core >=1.6.3
23+
#define ARDUINO_SAMD_VARIANT_COMPLIANCE 10603
24+
2225
/*----------------------------------------------------------------------------
2326
* Definitions
2427
*----------------------------------------------------------------------------*/

0 commit comments

Comments
 (0)