Skip to content
Snippets Groups Projects
Commit 66048be4 authored by Thibaut VIARD's avatar Thibaut VIARD
Browse files

Merge branch 'zero' of github.com:arduino/ArduinoZero into zero

parents 04be8889 a87d16a3
No related branches found
No related tags found
No related merge requests found
......@@ -17,12 +17,11 @@ SERCOM::SERCOM(Sercom* s)
* ===== Sercom UART
* =========================
*/
void SERCOM::initUART(SercomUartMode mode, SercomUartSampleRate sampleRate, uint32_t baudrate)
{
resetUART();
initClock();
initNVIC();
//Setting the CTRLA register
sercom->USART.CTRLA.reg = SERCOM_USART_CTRLA_MODE(mode) |
......@@ -32,12 +31,10 @@ void SERCOM::initUART(SercomUartMode mode, SercomUartSampleRate sampleRate, uint
sercom->USART.INTENSET.reg = SERCOM_USART_INTENSET_RXC | //Received complete
SERCOM_USART_INTENSET_ERROR; //All others errors
NVIC_EnableIRQ(SERCOM0_IRQn);
NVIC_SetPriority (SERCOM0_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */
if(mode == UART_INT_CLOCK)
{
uint32_t sampleRateValue;
uint16_t sampleRateValue;
if(sampleRate == SAMPLE_RATE_x16)
sampleRateValue = 16;
......@@ -47,13 +44,9 @@ void SERCOM::initUART(SercomUartMode mode, SercomUartSampleRate sampleRate, uint
sampleRateValue = 3;
//Asynchronous arithmetic mode
//sercom->USART.BAUD.reg = 65535 * ( 1 - sampleRateValue * division(baudrate,SERCOM_FREQ_REF));
uint16_t tmpBaud = (baudrate / SERCOM_FREQ_REF);
tmpBaud = ( 1 - sampleRateValue * tmpBaud);
tmpBaud = (65535ul) * tmpBaud;
//65535 * ( 1 - sampleRateValue * baudrate / SERCOM_FREQ_REF);
sercom->USART.BAUD.reg = 65535.0 * ( 1.0 - (float)(sampleRateValue) * (float)(baudrate) / (float)(SERCOM_FREQ_REF));
tmpBaud = 63019;
sercom->USART.BAUD.reg = tmpBaud;
}
}
void SERCOM::initFrame(SercomUartCharSize charSize, SercomDataOrder dataOrder, SercomParityMode parityMode, SercomNumberStopBit nbStopBits)
......@@ -303,42 +296,7 @@ bool SERCOM::isReceiveCompleteSPI()
uint8_t SERCOM::calculateBaudrateSynchronous(uint32_t baudrate)
{
return division(SERCOM_FREQ_REF, (2 * baudrate)) - 1;
}
uint32_t SERCOM::division(uint32_t dividend, uint32_t divisor)
{
//// division WITHOUT division operator
//
//uint32_t denom = divisor;
//uint32_t current = 1;
//uint32_t answer = 0;
//
//if ( denom > dividend)
//return 0;
//
//if ( denom == dividend)
//return 1;
//
//while (denom <= dividend) {
//denom <<= 1;
//current <<= 1;
//}
//
//denom >>= 1;
//current >>= 1;
//
//while (current!=0) {
//if ( dividend >= denom) {
//dividend -= denom;
//answer |= current;
//}
//current >>= 1;
//denom >>= 1;
//}
//
//return answer;
return SERCOM_FREQ_REF / (2 * baudrate) - 1;
}
......@@ -537,7 +495,7 @@ uint8_t SERCOM::readDataWIRE()
void SERCOM::initClock()
{
uint8_t clockId;
uint8_t clockId = 0;
if(sercom == SERCOM0)
{
......@@ -576,6 +534,39 @@ void SERCOM::initClock()
}
}
void SERCOM::initNVIC()
{
IRQn_Type nvicID;
if(sercom == SERCOM0)
{
nvicID = SERCOM0_IRQn;
}
else if(sercom == SERCOM1)
{
nvicID = SERCOM1_IRQn;
}
else if(sercom == SERCOM2)
{
nvicID = SERCOM2_IRQn;
}
else if(sercom == SERCOM3)
{
nvicID = SERCOM3_IRQn;
}
else if(sercom == SERCOM4)
{
nvicID = SERCOM4_IRQn;
}
else if(sercom == SERCOM5)
{
nvicID = SERCOM5_IRQn;
}
NVIC_EnableIRQ(nvicID);
NVIC_SetPriority (nvicID, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */
}
/* =========================
* ===== SERCOM DEFINITION
* =========================
......
......@@ -199,6 +199,7 @@ class SERCOM
uint8_t calculateBaudrateSynchronous(uint32_t baudrate);
uint32_t division(uint32_t dividend, uint32_t divisor);
void initClock();
void initNVIC();
};
#endif
#include "Uart.h"
Uart::Uart(SERCOM *sercom)
Uart::Uart(SERCOM *s, uint8_t pinRX, uint8_t pinTX)
{
this->sercom = sercom;
pinPeripheral(0, PIO_SERCOM);
pinPeripheral(1, PIO_SERCOM);
sercom = s;
if(sercom == SERCOM::sercom0)
{
pinPeripheral(pinRX, g_APinDescription[pinRX].ulPinType);
pinPeripheral(pinTX, g_APinDescription[pinTX].ulPinType);
}
else if(sercom == SERCOM::sercom5)
{
pinPeripheral(pinRX, g_APinDescription[pinRX].ulPinType);
pinPeripheral(pinTX, g_APinDescription[pinTX].ulPinType);
}
}
void Uart::begin(unsigned long baudrate)
{
begin(baudrate, SERIAL_8N1);
begin(baudrate, (uint8_t)SERIAL_8N1);
}
void Uart::begin(unsigned long baudrate, uint8_t config)
......@@ -132,7 +140,8 @@ SercomParityMode Uart::extractParity(uint8_t config)
}
}
Uart Serial = Uart(SERCOM::sercom0);
Uart Serial = Uart(SERCOM::sercom0, 0, 1);
Uart Serial5 = Uart(SERCOM::sercom5, 36, 35);
void SERCOM0_Handler()
{
......@@ -140,5 +149,5 @@ void SERCOM0_Handler()
}
void SERCOM5_Handler()
{
Serial.IrqHandler();
Serial5.IrqHandler();
}
......@@ -13,7 +13,7 @@
class Uart : public HardwareSerial
{
public:
Uart(SERCOM *sercom);
Uart(SERCOM *s, uint8_t pinRX, uint8_t pinTX);
void begin(unsigned long baudRate);
void begin(unsigned long baudrate, uint8_t config);
void end();
......@@ -37,6 +37,7 @@ class Uart : public HardwareSerial
SercomParityMode extractParity(uint8_t config);
};
extern Uart Serial;
extern Uart Serial5;
#endif
......@@ -18,7 +18,7 @@ SPIClass::SPIClass(SERCOM *s)
void SPIClass::begin() {
// 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->initClock(SERCOM_SPI_MODE_0, 4000000);
sercom->initSPIClock(SERCOM_SPI_MODE_0, 4000000);
}
void SPIClass::end() {
......@@ -86,6 +86,4 @@ void SPIClass::detachInterrupt() {
// Should be disableInterrupt()
}
#if SPI_INTERFACES_COUNT > 0
SPIClass SPI(SERCOM::sercom4);
#endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment