diff options
author | Marti Bolivar <mbolivar@leaflabs.com> | 2012-06-21 16:29:22 -0400 |
---|---|---|
committer | Marti Bolivar <mbolivar@leaflabs.com> | 2012-06-22 14:06:10 -0400 |
commit | fe34ca70469f1bd88eb38feb2b0b336ef5b07ff8 (patch) | |
tree | ae344d0348ebbbfec2a740f9a9806da3a5480403 /libmaple/stm32f1/i2c.c | |
parent | 4d133982271fd063779174d1695e14c7821c6da6 (diff) | |
download | librambutan-fe34ca70469f1bd88eb38feb2b0b336ef5b07ff8.tar.gz librambutan-fe34ca70469f1bd88eb38feb2b0b336ef5b07ff8.zip |
I2C: Move nonportable CCR/TRISE configuration.
Do this via new private _i2c_set_ccr_trise().
Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>
Diffstat (limited to 'libmaple/stm32f1/i2c.c')
-rw-r--r-- | libmaple/stm32f1/i2c.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/libmaple/stm32f1/i2c.c b/libmaple/stm32f1/i2c.c index 4e918ad..4c9af30 100644 --- a/libmaple/stm32f1/i2c.c +++ b/libmaple/stm32f1/i2c.c @@ -110,3 +110,39 @@ void _i2c_irq_priority_fixup(i2c_dev *dev) { nvic_irq_set_priority(dev->ev_nvic_line, 0); nvic_irq_set_priority(dev->er_nvic_line, 0); } + +void _i2c_set_ccr_trise(i2c_dev *dev, uint32 flags) { +#define I2C_CLK (STM32_PCLK1/1000000) + uint32 ccr = 0; + uint32 trise = 0; + + /* I2C1 and I2C2 are fed from APB1, clocked at 36MHz */ + i2c_set_input_clk(dev, I2C_CLK); + + if (flags & I2C_FAST_MODE) { + ccr |= I2C_CCR_FS; + + if (flags & I2C_DUTY_16_9) { + /* Tlow/Thigh = 16/9 */ + ccr |= I2C_CCR_DUTY; + ccr |= STM32_PCLK1/(400000 * 25); + } else { + /* Tlow/Thigh = 2 */ + ccr |= STM32_PCLK1/(400000 * 3); + } + + trise = (300 * (I2C_CLK)/1000) + 1; + } else { + /* Tlow/Thigh = 1 */ + ccr = STM32_PCLK1/(100000 * 2); + trise = I2C_CLK + 1; + } + + /* Set minimum required value if CCR < 1*/ + if ((ccr & I2C_CCR_CCR) == 0) { + ccr |= 0x1; + } + + i2c_set_clk_control(dev, ccr); + i2c_set_trise(dev, trise); +} |