diff options
Diffstat (limited to 'drivers/arm')
| -rw-r--r-- | drivers/arm/i2c_master.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/arm/i2c_master.c b/drivers/arm/i2c_master.c index 18068d3a6..fcfe85b56 100644 --- a/drivers/arm/i2c_master.c +++ b/drivers/arm/i2c_master.c | |||
| @@ -32,6 +32,17 @@ | |||
| 32 | 32 | ||
| 33 | static uint8_t i2c_address; | 33 | static uint8_t i2c_address; |
| 34 | 34 | ||
| 35 | // ChibiOS uses two initialization structure for v1 and v2/v3 i2c APIs. | ||
| 36 | // The F1 series uses the v1 api, which have to initialized this way. | ||
| 37 | #ifdef STM32F103xB | ||
| 38 | static const I2CConfig i2cconfig = { | ||
| 39 | OPMODE_I2C, | ||
| 40 | 400000, | ||
| 41 | FAST_DUTY_CYCLE_2, | ||
| 42 | }; | ||
| 43 | #else | ||
| 44 | // This configures the I2C clock to 400khz assuming a 72Mhz clock | ||
| 45 | // For more info : https://www.st.com/en/embedded-software/stsw-stm32126.html | ||
| 35 | static const I2CConfig i2cconfig = { | 46 | static const I2CConfig i2cconfig = { |
| 36 | #ifdef USE_I2CV1 | 47 | #ifdef USE_I2CV1 |
| 37 | I2C1_OPMODE, | 48 | I2C1_OPMODE, |
| @@ -41,6 +52,7 @@ static const I2CConfig i2cconfig = { | |||
| 41 | STM32_TIMINGR_PRESC(I2C1_TIMINGR_PRESC) | STM32_TIMINGR_SCLDEL(I2C1_TIMINGR_SCLDEL) | STM32_TIMINGR_SDADEL(I2C1_TIMINGR_SDADEL) | STM32_TIMINGR_SCLH(I2C1_TIMINGR_SCLH) | STM32_TIMINGR_SCLL(I2C1_TIMINGR_SCLL), 0, 0 | 52 | STM32_TIMINGR_PRESC(I2C1_TIMINGR_PRESC) | STM32_TIMINGR_SCLDEL(I2C1_TIMINGR_SCLDEL) | STM32_TIMINGR_SDADEL(I2C1_TIMINGR_SDADEL) | STM32_TIMINGR_SCLH(I2C1_TIMINGR_SCLH) | STM32_TIMINGR_SCLL(I2C1_TIMINGR_SCLL), 0, 0 |
| 42 | #endif | 53 | #endif |
| 43 | }; | 54 | }; |
| 55 | #endif | ||
| 44 | 56 | ||
| 45 | static i2c_status_t chibios_to_qmk(const msg_t* status) { | 57 | static i2c_status_t chibios_to_qmk(const msg_t* status) { |
| 46 | switch (*status) { | 58 | switch (*status) { |
| @@ -60,7 +72,6 @@ __attribute__((weak)) void i2c_init(void) { | |||
| 60 | palSetPadMode(I2C1_SDA_BANK, I2C1_SDA, PAL_MODE_INPUT); | 72 | palSetPadMode(I2C1_SDA_BANK, I2C1_SDA, PAL_MODE_INPUT); |
| 61 | 73 | ||
| 62 | chThdSleepMilliseconds(10); | 74 | chThdSleepMilliseconds(10); |
| 63 | |||
| 64 | #ifdef USE_I2CV1 | 75 | #ifdef USE_I2CV1 |
| 65 | palSetPadMode(I2C1_SCL_BANK, I2C1_SCL, PAL_MODE_STM32_ALTERNATE_OPENDRAIN); | 76 | palSetPadMode(I2C1_SCL_BANK, I2C1_SCL, PAL_MODE_STM32_ALTERNATE_OPENDRAIN); |
| 66 | palSetPadMode(I2C1_SDA_BANK, I2C1_SDA, PAL_MODE_STM32_ALTERNATE_OPENDRAIN); | 77 | palSetPadMode(I2C1_SDA_BANK, I2C1_SDA, PAL_MODE_STM32_ALTERNATE_OPENDRAIN); |
| @@ -68,8 +79,6 @@ __attribute__((weak)) void i2c_init(void) { | |||
| 68 | palSetPadMode(I2C1_SCL_BANK, I2C1_SCL, PAL_MODE_ALTERNATE(I2C1_SCL_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN); | 79 | palSetPadMode(I2C1_SCL_BANK, I2C1_SCL, PAL_MODE_ALTERNATE(I2C1_SCL_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN); |
| 69 | palSetPadMode(I2C1_SDA_BANK, I2C1_SDA, PAL_MODE_ALTERNATE(I2C1_SDA_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN); | 80 | palSetPadMode(I2C1_SDA_BANK, I2C1_SDA, PAL_MODE_ALTERNATE(I2C1_SDA_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN); |
| 70 | #endif | 81 | #endif |
| 71 | |||
| 72 | // i2cInit(); //This is invoked by halInit() so no need to redo it. | ||
| 73 | } | 82 | } |
| 74 | 83 | ||
| 75 | i2c_status_t i2c_start(uint8_t address) { | 84 | i2c_status_t i2c_start(uint8_t address) { |
