diff --git a/cores/arduino/SERCOM.cpp b/cores/arduino/SERCOM.cpp index 31fc51aa9c55caf52d02c96245c29dee6ea81c11..076526b1c6d7de056ff8e17c629a09985ec3a039 100644 --- a/cores/arduino/SERCOM.cpp +++ b/cores/arduino/SERCOM.cpp @@ -158,14 +158,16 @@ void SERCOM::initSPI(SercomSpiTXPad mosi, SercomRXPad miso, SercomSpiCharSize ch initClockNVIC(); //Setting the CTRLA register - sercom->SPI.CTRLA.reg = SERCOM_SPI_CTRLA_MODE(SPI_MASTER_OPERATION) | - SERCOM_SPI_CTRLA_DOPO(mosi) | - SERCOM_SPI_CTRLA_DIPO(miso) | - dataOrder << SERCOM_SPI_CTRLA_DORD_Pos; + sercom->SPI.CTRLA.reg = SERCOM_SPI_CTRLA_MODE_SPI_MASTER | + SERCOM_SPI_CTRLA_DOPO(mosi) | + SERCOM_SPI_CTRLA_DIPO(miso) | + dataOrder << SERCOM_SPI_CTRLA_DORD_Pos; //Setting the CTRLB register sercom->SPI.CTRLB.reg = SERCOM_SPI_CTRLB_CHSIZE(charSize) | - (0x1ul) << SERCOM_SPI_CTRLB_RXEN_Pos; //Active the SPI receiver. + SERCOM_SPI_CTRLB_RXEN; //Active the SPI receiver. + + } void SERCOM::initSPIClock(SercomSpiClockMode clockMode, uint32_t baudrate) @@ -184,8 +186,8 @@ void SERCOM::initSPIClock(SercomSpiClockMode clockMode, uint32_t baudrate) cpol = 1; //Setting the CTRLA register - sercom->SPI.CTRLA.reg |= cpha << SERCOM_SPI_CTRLA_CPHA_Pos | - cpol << SERCOM_SPI_CTRLA_CPOL_Pos; + sercom->SPI.CTRLA.reg |= ( cpha << SERCOM_SPI_CTRLA_CPHA_Pos ) | + ( cpol << SERCOM_SPI_CTRLA_CPOL_Pos ); //Synchronous arithmetic sercom->SPI.BAUD.reg = calculateBaudrateSynchronous(baudrate); @@ -194,7 +196,7 @@ void SERCOM::initSPIClock(SercomSpiClockMode clockMode, uint32_t baudrate) void SERCOM::resetSPI() { //Setting the Software Reset bit to 1 - sercom->SPI.CTRLA.bit.SWRST = 0x1u; + sercom->SPI.CTRLA.bit.SWRST = 1; //Wait both bits Software Reset from CTRLA and SYNCBUSY are equal to 0 while(sercom->SPI.CTRLA.bit.SWRST || sercom->SPI.SYNCBUSY.bit.SWRST); @@ -203,19 +205,23 @@ void SERCOM::resetSPI() void SERCOM::enableSPI() { //Setting the enable bit to 1 - sercom->SPI.CTRLA.bit.ENABLE = 0x1ul; + sercom->SPI.CTRLA.bit.ENABLE = 1; - //Waiting then enable bit from SYNCBUSY is equal to 0; - while(sercom->SPI.SYNCBUSY.bit.ENABLE); + while(sercom->SPI.SYNCBUSY.bit.ENABLE) + { + //Waiting then enable bit from SYNCBUSY is equal to 0; + } } void SERCOM::disableSPI() { //Setting the enable bit to 0 - sercom->SPI.CTRLA.bit.ENABLE = 0x0ul; + sercom->SPI.CTRLA.bit.ENABLE = 0; - //Waiting then enable bit from SYNCBUSY is equal to 0; - while(sercom->SPI.SYNCBUSY.bit.ENABLE); + while(sercom->SPI.SYNCBUSY.bit.ENABLE) + { + //Waiting then enable bit from SYNCBUSY is equal to 0; + } } void SERCOM::setDataOrderSPI(SercomDataOrder dataOrder) @@ -237,7 +243,7 @@ void SERCOM::setBaudrateSPI(uint8_t divider) //Register enable-protected disableSPI(); - sercom->SPI.BAUD.reg = calculateBaudrateSynchronous(SERCOM_FREQ_REF / divider); + sercom->SPI.BAUD.reg = calculateBaudrateSynchronous( SERCOM_FREQ_REF / divider ); enableSPI(); } @@ -265,12 +271,27 @@ void SERCOM::setClockModeSPI(SercomSpiClockMode clockMode) } void SERCOM::writeDataSPI(uint8_t data) { - sercom->SPI.DATA.bit.DATA = data; + while( sercom->SPI.INTFLAG.bit.DRE == 0 ) + { + // Waiting Data Registry Empty + } + + sercom->SPI.DATA.bit.DATA = data; // Writing data into Data register + + while( sercom->SPI.INTFLAG.bit.TXC == 0 || sercom->SPI.INTFLAG.bit.DRE == 0 ) + { + // Waiting Complete Transmission + } } uint16_t SERCOM::readDataSPI() { - return sercom->SPI.DATA.reg; + while( sercom->SPI.INTFLAG.bit.DRE == 0 || sercom->SPI.INTFLAG.bit.RXC == 0 ) + { + // Waiting Complete Reception + } + + return sercom->SPI.DATA.bit.DATA; // Reading data } bool SERCOM::isBufferOverflowErrorSPI() @@ -284,17 +305,17 @@ bool SERCOM::isDataRegisterEmptySPI() return sercom->SPI.INTFLAG.bit.DRE; } -bool SERCOM::isTransmitCompleteSPI() -{ - //TXC : Transmit complete - return sercom->SPI.INTFLAG.bit.TXC; -} - -bool SERCOM::isReceiveCompleteSPI() -{ - //RXC : Receive complete - return sercom->SPI.INTFLAG.bit.RXC; -} +//bool SERCOM::isTransmitCompleteSPI() +//{ +// //TXC : Transmit complete +// return sercom->SPI.INTFLAG.bit.TXC; +//} +// +//bool SERCOM::isReceiveCompleteSPI() +//{ +// //RXC : Receive complete +// return sercom->SPI.INTFLAG.bit.RXC; +//} uint8_t SERCOM::calculateBaudrateSynchronous(uint32_t baudrate) { @@ -600,14 +621,14 @@ void SERCOM::initClockNVIC( void ) IdNvic = SERCOM5_IRQn; } - //Setting NVIC + // Setting NVIC NVIC_EnableIRQ(IdNvic); NVIC_SetPriority (IdNvic, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority */ //Setting clock GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID( clockId ) | // Generic Clock 0 (SERCOMx) - GCLK_CLKCTRL_GEN_GCLK0 | // Generic Clock Generator 0 is source - GCLK_CLKCTRL_CLKEN ; + GCLK_CLKCTRL_GEN_GCLK0 | // Generic Clock Generator 0 is source + GCLK_CLKCTRL_CLKEN ; while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY ) { diff --git a/cores/arduino/wiring.c b/cores/arduino/wiring.c index d65e159abf8ae282ac8daf06b6d9c12e727a6cdb..2c3723e622c2c60b354d543728b23132661f7a7c 100644 --- a/cores/arduino/wiring.c +++ b/cores/arduino/wiring.c @@ -32,6 +32,7 @@ extern "C" { */ uint32_t SystemCoreClock=1000000ul ; +/* void calibrateADC() { volatile uint32_t valeur = 0; @@ -48,7 +49,7 @@ void calibrateADC() } valeur = valeur/5; -} +}*/ /* * Arduino Zero board initialization diff --git a/libraries/SPI/SPI.cpp b/libraries/SPI/SPI.cpp index 8eb5ac2976e3deb1ade58553c7a296b823cc5a85..4369aba907d9cab47725c46fb112aee4bda3803e 100644 --- a/libraries/SPI/SPI.cpp +++ b/libraries/SPI/SPI.cpp @@ -11,36 +11,43 @@ #include "SPI.h" #include "wiring_digital.h" #include "assert.h" +#include "variant.h" - -SPIClass::SPIClass(SERCOM *s) +SPIClass::SPIClass(SERCOM *p_sercom, uint8_t uc_pinMISO, uint8_t uc_pinSCK, uint8_t uc_pinMOSI) { - assert(s != NULL ); - sercom = s; + assert(p_sercom != NULL ); + _p_sercom = p_sercom; + + _uc_pinMiso = uc_pinMISO; + _uc_pinSCK = uc_pinSCK; + _uc_pinMosi = uc_pinMOSI; } -void SPIClass::begin() { - // PIO init - pinPeripheral(18, g_APinDescription[18].ulPinType); - pinPeripheral(20, g_APinDescription[20].ulPinType); - pinPeripheral(21, g_APinDescription[21].ulPinType); +void SPIClass::begin() +{ + // PIO init + pinPeripheral(_uc_pinMiso, g_APinDescription[_uc_pinMiso].ulPinType); + pinPeripheral(_uc_pinSCK, g_APinDescription[_uc_pinSCK].ulPinType); + pinPeripheral(_uc_pinMosi, g_APinDescription[_uc_pinMosi].ulPinType); + // Default speed set to 4Mhz, SPI mode set to MODE 0 and Bit order set to MSB first. - sercom->initSPI(SPI_PAD_2_SCK_3, SERCOM_RX_PAD_0, SPI_CHAR_SIZE_8_BITS, MSB_FIRST); - sercom->initSPIClock(SERCOM_SPI_MODE_0, 4000000); + _p_sercom->initSPI(SPI_PAD_2_SCK_3, SERCOM_RX_PAD_0, SPI_CHAR_SIZE_8_BITS, MSB_FIRST); + _p_sercom->initSPIClock(SERCOM_SPI_MODE_0, 4000000); - sercom->enableSPI(); + _p_sercom->enableSPI(); } -void SPIClass::end() { - sercom->resetSPI(); +void SPIClass::end() +{ + _p_sercom->resetSPI(); } void SPIClass::setBitOrder(BitOrder order) { if(order == LSBFIRST) - sercom->setDataOrderSPI(LSB_FIRST); + _p_sercom->setDataOrderSPI(LSB_FIRST); else - sercom->setDataOrderSPI(MSB_FIRST); + _p_sercom->setDataOrderSPI(MSB_FIRST); } void SPIClass::setDataMode(uint8_t mode) @@ -48,19 +55,19 @@ void SPIClass::setDataMode(uint8_t mode) switch(mode) { case SPI_MODE0: - sercom->setClockModeSPI(SERCOM_SPI_MODE_0); + _p_sercom->setClockModeSPI(SERCOM_SPI_MODE_0); break; case SPI_MODE1: - sercom->setClockModeSPI(SERCOM_SPI_MODE_1); + _p_sercom->setClockModeSPI(SERCOM_SPI_MODE_1); break; case SPI_MODE2: - sercom->setClockModeSPI(SERCOM_SPI_MODE_2); + _p_sercom->setClockModeSPI(SERCOM_SPI_MODE_2); break; case SPI_MODE3: - sercom->setClockModeSPI(SERCOM_SPI_MODE_3); + _p_sercom->setClockModeSPI(SERCOM_SPI_MODE_3); break; default: @@ -70,22 +77,16 @@ void SPIClass::setDataMode(uint8_t mode) void SPIClass::setClockDivider(uint8_t div) { - sercom->setBaudrateSPI(div); + _p_sercom->setBaudrateSPI(div); } byte SPIClass::transfer(uint8_t data) { - //Can writing new data? - while(!sercom->isDataRegisterEmptySPI()); - //Writing the data - sercom->writeDataSPI(data); - - //Data sent? new data to read? - while(!sercom->isTransmitCompleteSPI() || !sercom->isReceiveCompleteSPI()); + _p_sercom->writeDataSPI(data); //Read data - return sercom->readDataSPI(); + return _p_sercom->readDataSPI(); } void SPIClass::attachInterrupt() { @@ -96,4 +97,4 @@ void SPIClass::detachInterrupt() { // Should be disableInterrupt() } -SPIClass SPI(&sercom4); +SPIClass SPI(&sercom4, 18, 20, 21); diff --git a/libraries/SPI/SPI.h b/libraries/SPI/SPI.h index 1d27bb6e3eaafff25822d483cca83de4eeb296c1..db8a45b00321d44211ceced827c9cf4dcb1a5d0b 100644 --- a/libraries/SPI/SPI.h +++ b/libraries/SPI/SPI.h @@ -12,7 +12,6 @@ #define _SPI_H_INCLUDED #include "variant.h" -#include "SERCOM.h" #include "wiring_constants.h" #define SPI_MODE0 0x02 @@ -22,7 +21,7 @@ class SPIClass { public: - SPIClass(SERCOM *s); + SPIClass(SERCOM *p_sercom, uint8_t uc_pinMISO, uint8_t uc_pinSCK, uint8_t uc_pinMOSI); byte transfer(uint8_t data); @@ -34,15 +33,18 @@ class SPIClass { void end(); void setBitOrder(BitOrder order); - void setDataMode(uint8_t mode); - void setClockDivider(uint8_t div); + void setDataMode(uint8_t uc_mode); + void setClockDivider(uint8_t uc_div); private: - SERCOM *sercom; + SERCOM *_p_sercom; + uint8_t _uc_pinMiso; + uint8_t _uc_pinMosi; + uint8_t _uc_pinSCK; }; #if SPI_INTERFACES_COUNT > 0 -extern SPIClass SPI; + extern SPIClass SPI; #endif #endif