Skip to content

Commit e42ab7b

Browse files
committed
DM: fixed SERCOM baud rates
1 parent cfa521c commit e42ab7b

File tree

2 files changed

+10
-1
lines changed

2 files changed

+10
-1
lines changed

cores/arduino/SERCOM.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,11 @@ void SERCOM::initUART(SercomUartMode mode, SercomUartSampleRate sampleRate, uint
5555
// Asynchronous fractional mode (Table 24-2 in datasheet)
5656
// BAUD = fref / (sampleRateValue * fbaud)
5757
// (multiply by 8, to calculate fractional piece)
58+
#if defined(__SAMD51__)
59+
uint32_t baudTimes8 = (SERCOM_FREQ_REF * 8) / (sampleRateValue * baudrate);
60+
#else
5861
uint32_t baudTimes8 = (SystemCoreClock * 8) / (sampleRateValue * baudrate);
62+
#endif
5963

6064
sercom->USART.BAUD.FRAC.FP = (baudTimes8 % 8);
6165
sercom->USART.BAUD.FRAC.BAUD = (baudTimes8 / 8);
@@ -441,7 +445,11 @@ void SERCOM::initMasterWIRE( uint32_t baudrate )
441445
// sercom->I2CM.INTENSET.reg = SERCOM_I2CM_INTENSET_MB | SERCOM_I2CM_INTENSET_SB | SERCOM_I2CM_INTENSET_ERROR ;
442446

443447
// Synchronous arithmetic baudrate
448+
#if defined(__SAMD51__)
449+
sercom->I2CM.BAUD.bit.BAUD = SERCOM_FREQ_REF / ( 2 * baudrate) - 1 ;
450+
#else
444451
sercom->I2CM.BAUD.bit.BAUD = SystemCoreClock / ( 2 * baudrate) - 1 ;
452+
#endif
445453
}
446454

447455
void SERCOM::prepareNackBitWIRE( void )
@@ -733,7 +741,7 @@ void SERCOM::initClockNVIC( void )
733741
NVIC_EnableIRQ(IdNvic);
734742

735743
#if defined(__SAMD51__)
736-
GCLK->PCHCTRL[clk_core].reg = GCLK_PCHCTRL_GEN_GCLK2_Val | (1 << GCLK_PCHCTRL_CHEN_Pos);
744+
GCLK->PCHCTRL[clk_core].reg = GCLK_PCHCTRL_GEN_GCLK1_Val | (1 << GCLK_PCHCTRL_CHEN_Pos); //TODO: use 48mhz for now although this should work up to 100mhz
737745
GCLK->PCHCTRL[clk_slow].reg = GCLK_PCHCTRL_GEN_GCLK3_Val | (1 << GCLK_PCHCTRL_CHEN_Pos);
738746

739747
#else

cores/arduino/SERCOM.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
#include "sam.h"
2323

24+
//TODO: sercom should really work up to 100Mhz...
2425
#define SERCOM_FREQ_REF 48000000
2526

2627
typedef enum

0 commit comments

Comments
 (0)