Skip to content

Commit 2127525

Browse files
Brent WilkinsBrent Wilkins
Brent Wilkins
authored and
Brent Wilkins
committed
2 parents 75570d5 + ff9bd86 commit 2127525

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+713
-281
lines changed

IDE_Board_Manager/package_sparkfun_index.json

+21-2
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
},
6060
"platforms":[
6161
{
62-
"name":"SparkFun SAMD Boards (dependency: Arduino SAMD Boards 1.6.2)",
62+
"name":"SparkFun SAMD Boards (dependency: Arduino SAMD Boards 1.6.5)",
6363
"architecture":"samd",
6464
"version":"1.0.0",
6565
"category":"Contributed",
@@ -78,7 +78,7 @@
7878
]
7979
},
8080
{
81-
"name":"SparkFun SAMD Boards (dependency: Arduino SAMD Boards 1.6.2)",
81+
"name":"SparkFun SAMD Boards (dependency: Arduino SAMD Boards 1.6.5)",
8282
"architecture":"samd",
8383
"version":"1.1.0",
8484
"category":"Contributed",
@@ -95,6 +95,25 @@
9595
],
9696
"toolsDependencies":[
9797
]
98+
},
99+
{
100+
"name":"SparkFun SAMD Boards (dependency: Arduino SAMD Boards 1.6.5)",
101+
"architecture":"samd",
102+
"version":"1.2.0",
103+
"category":"Contributed",
104+
"url":"https://github.com/sparkfun/Arduino_Boards/raw/master/IDE_Board_Manager/sparkfun-samd-1.2.0.tar.bz2",
105+
"archiveFileName":"sparkfun-samd-1.2.0.tar.bz2",
106+
"checksum":"SHA-256:50e055f311e07ba4d154bf00aa10579648024bef680bb3eb267401c496f791e6",
107+
"size":"281932",
108+
"help":{
109+
"online":"https://forums.sparkfun.com"
110+
},
111+
"boards":[
112+
{ "name":"SparkFun SAMD21 Mini Breakout" },
113+
{ "name":"SparkFun SAMD21 Dev Breakout" }
114+
],
115+
"toolsDependencies":[
116+
]
98117
}
99118
],
100119
"tools":[
275 KB
Binary file not shown.

sparkfun/samd/cores/arduino/HardwareSerial.h

+1
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ class HardwareSerial : public Stream
6868
{
6969
public:
7070
virtual void begin(unsigned long);
71+
virtual void begin(unsigned long baudrate, uint16_t config);
7172
virtual void end();
7273
virtual int available(void) = 0;
7374
virtual int peek(void) = 0;

sparkfun/samd/cores/arduino/Print.cpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,8 @@ size_t Print::println(const Printable& x)
188188

189189
// Private Methods /////////////////////////////////////////////////////////////
190190

191-
size_t Print::printNumber(unsigned long n, uint8_t base) {
191+
size_t Print::printNumber(unsigned long n, uint8_t base)
192+
{
192193
char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
193194
char *str = &buf[sizeof(buf) - 1];
194195

@@ -198,9 +199,9 @@ size_t Print::printNumber(unsigned long n, uint8_t base) {
198199
if (base < 2) base = 10;
199200

200201
do {
201-
unsigned long m = n;
202+
char c = n % base;
202203
n /= base;
203-
char c = m - base * n;
204+
204205
*--str = c < 10 ? c + '0' : c + 'A' - 10;
205206
} while(n);
206207

sparkfun/samd/cores/arduino/SERCOM.cpp

+51-38
Original file line numberDiff line numberDiff line change
@@ -43,28 +43,21 @@ void SERCOM::initUART(SercomUartMode mode, SercomUartSampleRate sampleRate, uint
4343

4444
if ( mode == UART_INT_CLOCK )
4545
{
46-
uint16_t sampleRateValue ;
46+
uint16_t sampleRateValue;
4747

48-
if ( sampleRate == SAMPLE_RATE_x16 )
49-
{
50-
sampleRateValue = 16 ;
51-
}
52-
else
53-
{
54-
if ( sampleRate == SAMPLE_RATE_x8 )
55-
{
56-
sampleRateValue = 8 ;
57-
}
58-
else
59-
{
60-
sampleRateValue = 3 ;
61-
}
48+
if (sampleRate == SAMPLE_RATE_x16) {
49+
sampleRateValue = 16;
50+
} else {
51+
sampleRateValue = 8;
6252
}
6353

64-
// Asynchronous arithmetic mode
65-
// 65535 * ( 1 - sampleRateValue * baudrate / SystemCoreClock);
66-
// 65535 - 65535 * (sampleRateValue * baudrate / SystemCoreClock));
67-
sercom->USART.BAUD.reg = 65535.0f * ( 1.0f - (float)(sampleRateValue) * (float)(baudrate) / (float)(SystemCoreClock));
54+
// Asynchronous fractional mode (Table 24-2 in datasheet)
55+
// BAUD = fref / (sampleRateValue * fbaud)
56+
// (multiply by 8, to calculate fractional piece)
57+
uint32_t baudTimes8 = (SystemCoreClock * 8) / (sampleRateValue * baudrate);
58+
59+
sercom->USART.BAUD.FRAC.FP = (baudTimes8 % 8);
60+
sercom->USART.BAUD.FRAC.BAUD = (baudTimes8 / 8);
6861
}
6962
}
7063
void SERCOM::initFrame(SercomUartCharSize charSize, SercomDataOrder dataOrder, SercomParityMode parityMode, SercomNumberStopBit nbStopBits)
@@ -112,7 +105,7 @@ void SERCOM::enableUART()
112105
void SERCOM::flushUART()
113106
{
114107
// Wait for transmission to complete
115-
while(sercom->USART.INTFLAG.bit.DRE != SERCOM_USART_INTFLAG_DRE);
108+
while(!sercom->USART.INTFLAG.bit.TXC);
116109
}
117110

118111
void SERCOM::clearStatusUART()
@@ -168,8 +161,8 @@ uint8_t SERCOM::readDataUART()
168161

169162
int SERCOM::writeDataUART(uint8_t data)
170163
{
171-
//Flush UART buffer
172-
flushUART();
164+
// Wait for data register to be empty
165+
while(!isDataRegisterEmptyUART());
173166

174167
//Put data into DATA register
175168
sercom->USART.DATA.reg = (uint16_t)data;
@@ -262,6 +255,11 @@ void SERCOM::setDataOrderSPI(SercomDataOrder dataOrder)
262255
enableSPI();
263256
}
264257

258+
SercomDataOrder SERCOM::getDataOrderSPI()
259+
{
260+
return (sercom->SPI.CTRLA.bit.DORD ? LSB_FIRST : MSB_FIRST);
261+
}
262+
265263
void SERCOM::setBaudrateSPI(uint8_t divider)
266264
{
267265
//Can't divide by 0
@@ -410,14 +408,12 @@ void SERCOM::initSlaveWIRE( uint8_t ucAddress )
410408
// Set slave mode
411409
sercom->I2CS.CTRLA.bit.MODE = I2C_SLAVE_OPERATION ;
412410

413-
// Enable Quick Command
414-
sercom->I2CM.CTRLB.bit.QCEN = 1 ;
415-
416411
sercom->I2CS.ADDR.reg = SERCOM_I2CS_ADDR_ADDR( ucAddress & 0x7Ful ) | // 0x7F, select only 7 bits
417-
SERCOM_I2CS_ADDR_ADDRMASK( 0x3FFul ) ; // 0x3FF all bits set
412+
SERCOM_I2CS_ADDR_ADDRMASK( 0x00ul ) ; // 0x00, only match exact address
418413

419414
// Set the interrupt register
420-
sercom->I2CS.INTENSET.reg = SERCOM_I2CS_INTENSET_AMATCH | // Address Match
415+
sercom->I2CS.INTENSET.reg = SERCOM_I2CS_INTENSET_PREC | // Stop
416+
SERCOM_I2CS_INTENSET_AMATCH | // Address Match
421417
SERCOM_I2CS_INTENSET_DRDY ; // Data Ready
422418

423419
while ( sercom->I2CM.SYNCBUSY.bit.SYSOP != 0 )
@@ -450,23 +446,35 @@ void SERCOM::initMasterWIRE( uint32_t baudrate )
450446

451447
void SERCOM::prepareNackBitWIRE( void )
452448
{
453-
// Send a NACK
454-
sercom->I2CM.CTRLB.bit.ACKACT = 1;
449+
if(isMasterWIRE()) {
450+
// Send a NACK
451+
sercom->I2CM.CTRLB.bit.ACKACT = 1;
452+
} else {
453+
sercom->I2CS.CTRLB.bit.ACKACT = 1;
454+
}
455455
}
456456

457457
void SERCOM::prepareAckBitWIRE( void )
458458
{
459-
// Send an ACK
460-
sercom->I2CM.CTRLB.bit.ACKACT = 0;
459+
if(isMasterWIRE()) {
460+
// Send an ACK
461+
sercom->I2CM.CTRLB.bit.ACKACT = 0;
462+
} else {
463+
sercom->I2CS.CTRLB.bit.ACKACT = 0;
464+
}
461465
}
462466

463-
void SERCOM::prepareCommandBitsWire(SercomMasterCommandWire cmd)
467+
void SERCOM::prepareCommandBitsWire(uint8_t cmd)
464468
{
465-
sercom->I2CM.CTRLB.bit.CMD = cmd;
469+
if(isMasterWIRE()) {
470+
sercom->I2CM.CTRLB.bit.CMD = cmd;
466471

467-
while(sercom->I2CM.SYNCBUSY.bit.SYSOP)
468-
{
469-
// Waiting for synchronization
472+
while(sercom->I2CM.SYNCBUSY.bit.SYSOP)
473+
{
474+
// Waiting for synchronization
475+
}
476+
} else {
477+
sercom->I2CS.CTRLB.bit.CMD = cmd;
470478
}
471479
}
472480

@@ -475,8 +483,8 @@ bool SERCOM::startTransmissionWIRE(uint8_t address, SercomWireReadWriteFlag flag
475483
// 7-bits address + 1-bits R/W
476484
address = (address << 0x1ul) | flag;
477485

478-
// Wait idle bus mode
479-
while ( !isBusIdleWIRE() );
486+
// Wait idle or owner bus mode
487+
while ( !isBusIdleWIRE() && !isBusOwnerWIRE() );
480488

481489
// Send start and address
482490
sercom->I2CM.ADDR.bit.ADDR = address;
@@ -570,6 +578,11 @@ bool SERCOM::isBusIdleWIRE( void )
570578
return sercom->I2CM.STATUS.bit.BUSSTATE == WIRE_IDLE_STATE;
571579
}
572580

581+
bool SERCOM::isBusOwnerWIRE( void )
582+
{
583+
return sercom->I2CM.STATUS.bit.BUSSTATE == WIRE_OWNER_STATE;
584+
}
585+
573586
bool SERCOM::isDataReadyWIRE( void )
574587
{
575588
return sercom->I2CS.INTFLAG.bit.DRDY;

sparkfun/samd/cores/arduino/SERCOM.h

+5-4
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,8 @@ typedef enum
8686

8787
typedef enum
8888
{
89-
SAMPLE_RATE_x16 = 0, //Arithmetic
90-
SAMPLE_RATE_x8 = 0x2, //Arithmetic
91-
SAMPLE_RATE_x3 = 0x3 //Arithmetic
89+
SAMPLE_RATE_x16 = 0x1, //Fractional
90+
SAMPLE_RATE_x8 = 0x3, //Fractional
9291
} SercomUartSampleRate;
9392

9493
typedef enum
@@ -173,6 +172,7 @@ class SERCOM
173172
void enableSPI( void ) ;
174173
void disableSPI( void ) ;
175174
void setDataOrderSPI(SercomDataOrder dataOrder) ;
175+
SercomDataOrder getDataOrderSPI( void ) ;
176176
void setBaudrateSPI(uint8_t divider) ;
177177
void setClockModeSPI(SercomSpiClockMode clockMode) ;
178178
void writeDataSPI(uint8_t data) ;
@@ -191,13 +191,14 @@ class SERCOM
191191
void disableWIRE( void );
192192
void prepareNackBitWIRE( void ) ;
193193
void prepareAckBitWIRE( void ) ;
194-
void prepareCommandBitsWire(SercomMasterCommandWire cmd);
194+
void prepareCommandBitsWire(uint8_t cmd);
195195
bool startTransmissionWIRE(uint8_t address, SercomWireReadWriteFlag flag) ;
196196
bool sendDataMasterWIRE(uint8_t data) ;
197197
bool sendDataSlaveWIRE(uint8_t data) ;
198198
bool isMasterWIRE( void ) ;
199199
bool isSlaveWIRE( void ) ;
200200
bool isBusIdleWIRE( void ) ;
201+
bool isBusOwnerWIRE( void ) ;
201202
bool isDataReadyWIRE( void ) ;
202203
bool isStopDetectedWIRE( void ) ;
203204
bool isRestartDetectedWIRE( void ) ;

0 commit comments

Comments
 (0)