diff options
author | Wulfsta <wulfstawulfsta@gmail.com> | 2024-10-18 19:00:49 -0400 |
---|---|---|
committer | KevinOConnor <kevin@koconnor.net> | 2024-11-12 19:50:48 -0500 |
commit | 6631275ab6fd4b0a71d8b906368a6d1e7e309293 (patch) | |
tree | de37e33050bc869fa53a0fd7045783991be2b79a | |
parent | 9d36f31615c7063439c5c986e3bfc1ade5c20236 (diff) | |
download | kutter-6631275ab6fd4b0a71d8b906368a6d1e7e309293.tar.gz kutter-6631275ab6fd4b0a71d8b906368a6d1e7e309293.tar.xz kutter-6631275ab6fd4b0a71d8b906368a6d1e7e309293.zip |
atsamd: allow i2c rate to be 400kHz
Signed-off-by: Luke Vuksta <wulfstawulfsta@gmail.com>
-rw-r--r-- | src/atsamd/i2c.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/src/atsamd/i2c.c b/src/atsamd/i2c.c index 18506a27..5897a776 100644 --- a/src/atsamd/i2c.c +++ b/src/atsamd/i2c.c @@ -12,10 +12,11 @@ #include "i2ccmds.h" // I2C_BUS_SUCCESS #define TIME_RISE 125ULL // 125 nanoseconds -#define I2C_FREQ 100000 +#define I2C_FREQ 100000 +#define I2C_FREQ_FAST 400000 static void -i2c_init(uint32_t bus, SercomI2cm *si) +i2c_init(uint32_t bus, uint32_t rate, SercomI2cm *si) { static uint8_t have_run_init; if (have_run_init & (1<<bus)) @@ -29,7 +30,12 @@ i2c_init(uint32_t bus, SercomI2cm *si) | SERCOM_I2CM_CTRLA_MODE(5)); si->CTRLA.reg = areg; uint32_t freq = sercom_get_pclock_frequency(bus); - uint32_t baud = (freq/I2C_FREQ - 10 - freq*TIME_RISE/1000000000) / 2; + uint32_t baud = 0; + if (rate < I2C_FREQ_FAST) { + baud = (freq/I2C_FREQ - 10 - freq*TIME_RISE/1000000000) / 2; + } else { + baud = (freq/I2C_FREQ_FAST - 10 - freq*TIME_RISE/1000000000) / 2; + } si->BAUD.reg = baud; si->CTRLA.reg = areg | SERCOM_I2CM_CTRLA_ENABLE; while (si->SYNCBUSY.reg & SERCOM_I2CM_SYNCBUSY_ENABLE) @@ -47,7 +53,7 @@ i2c_setup(uint32_t bus, uint32_t rate, uint8_t addr) Sercom *sercom = sercom_enable_pclock(bus); sercom_i2c_pins(bus); SercomI2cm *si = &sercom->I2CM; - i2c_init(bus, si); + i2c_init(bus, rate, si); return (struct i2c_config){ .si=si, .addr=addr<<1 }; } |