Skip to content

Commit eebc1ea

Browse files
committed
avoid float division
1 parent d2772f8 commit eebc1ea

2 files changed

Lines changed: 20 additions & 14 deletions

File tree

cores/arduino/SERCOM.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -479,15 +479,16 @@ void SERCOM::initMasterWIRE( uint32_t baudrate )
479479
// sercom->I2CM.INTENSET.reg = SERCOM_I2CM_INTENSET_MB | SERCOM_I2CM_INTENSET_SB | SERCOM_I2CM_INTENSET_ERROR ;
480480

481481
uint8_t speedBit = sercom->I2CM.CTRLA.bit.SPEED;
482-
uint32_t topSpeeds[3] = {400000, 1000000, 3400000}; // {(sm/fm), (fm+), (hs)}
482+
const uint32_t topSpeeds[3] = {400000, 1000000, 3400000}; // {(sm/fm), (fm+), (hs)}
483483
const uint32_t minBaudrate = freqRef / 512; // BAUD = 255: SAMD51 ~195kHz, SAMD21 ~94kHz
484484
const uint32_t maxBaudrate = topSpeeds[speedBit];
485485
baudrate = max(minBaudrate, min(baudrate, maxBaudrate));
486486

487487
if (speedBit == 0x2)
488488
sercom->I2CM.BAUD.bit.HSBAUD = freqRef / (2 * baudrate) - 1;
489489
else
490-
sercom->I2CM.BAUD.bit.BAUD = freqRef / (2 * baudrate) - 5 - freqRef * WIRE_RISE_TIME_NANOSECONDS / (2 * 1e9f);
490+
sercom->I2CM.BAUD.bit.BAUD = freqRef / (2 * baudrate) - 5 -
491+
(freqRef/2000000ul * WIRE_RISE_TIME_NANOSECONDS) / 1000;
491492
}
492493

493494
void SERCOM::prepareNackBitWIRE( void )
@@ -789,10 +790,15 @@ uint32_t SERCOM::getSercomFreqRef(void)
789790
gen = GCLK->PCHCTRL[pch].bit.GEN;
790791
}
791792

793+
// GCLK0 = F_CPU
794+
// GCLK1 = 48 MHz
795+
// GCLK2 = 100 MHz
796+
// GCLK3 = XOSC32K
797+
// GCLK4 = 12 MHz
792798
switch (gen)
793799
{
794800
case 0:
795-
freqRef = 100000000UL;
801+
freqRef = 100000000UL; // F_CPU but limit at 100 Mhz for SERCOM ref clock
796802
break;
797803
case 1:
798804
freqRef = 48000000UL;
@@ -836,7 +842,7 @@ void SERCOM::setClockSource(int8_t idx, SercomClockSource src, bool core) {
836842
if(core) clockSource = src; // Save SercomClockSource value
837843

838844
// From cores/arduino/startup.c:
839-
// GCLK0 = F_CPU (this is 120 MHz and exceeds SERCOM maximum)
845+
// GCLK0 = F_CPU (this is 120 MHz and exceeds SERCOM maximum, limit to 100Mhz)
840846
// GCLK1 = 48 MHz
841847
// GCLK2 = 100 MHz
842848
// GCLK3 = XOSC32K

cores/arduino/SERCOM.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -214,10 +214,10 @@ class SERCOM
214214

215215
void resetWIRE( void ) ;
216216
void enableWIRE( void ) ;
217-
void disableWIRE( void );
218-
void prepareNackBitWIRE( void ) ;
219-
void prepareAckBitWIRE( void ) ;
220-
void prepareCommandBitsWire(uint8_t cmd);
217+
void disableWIRE( void );
218+
void prepareNackBitWIRE( void ) ;
219+
void prepareAckBitWIRE( void ) ;
220+
void prepareCommandBitsWire(uint8_t cmd);
221221
bool startTransmissionWIRE(uint8_t address, SercomWireReadWriteFlag flag) ;
222222
bool sendDataMasterWIRE(uint8_t data) ;
223223
bool sendDataSlaveWIRE(uint8_t data) ;
@@ -233,12 +233,12 @@ class SERCOM
233233
bool isRestartDetectedWIRE( void ) ;
234234
bool isAddressMatch( void ) ;
235235
bool isMasterReadOperationWIRE( void ) ;
236-
bool isRXNackReceivedWIRE( void ) ;
236+
bool isRXNackReceivedWIRE( void ) ;
237237
int availableWIRE( void ) ;
238238
uint8_t readDataWIRE( void ) ;
239239
int8_t getSercomIndex(void);
240-
uint32_t getSercomFreqRef(void);
241-
#if defined(__SAMD51__)
240+
uint32_t getSercomFreqRef(void);
241+
#if defined(__SAMD51__) || defined(__SAME51__) || defined(__SAME53__) || defined(__SAME54__)
242242
// SERCOM clock source override is only available on
243243
// SAMD51 (not 21) ... but these functions are declared
244244
// regardless so user code doesn't need ifdefs or lengthy
@@ -254,9 +254,9 @@ class SERCOM
254254
uint32_t getFreqRef(void) { return F_CPU; };
255255
#endif
256256

257-
private:
258-
Sercom *sercom;
259-
uint32_t freqRef = 48000000; // Frequency corresponding to clockSource
257+
private:
258+
Sercom *sercom;
259+
uint32_t freqRef = 48000000ul; // Frequency corresponding to clockSource
260260
#if defined(__SAMD51__) || defined(__SAME51__) || defined(__SAME53__) || defined(__SAME54__)
261261
SercomClockSource clockSource;
262262
#endif

0 commit comments

Comments
 (0)