Skip to content
Snippets Groups Projects
Commit 07e782b2 authored by Jonathan BAUDIN's avatar Jonathan BAUDIN
Browse files

Fix UART EDBG and baudrate

parent 82406cd7
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