aboutsummaryrefslogtreecommitdiff
path: root/drivers/arm
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/arm')
-rw-r--r--drivers/arm/i2c_master.c16
-rw-r--r--drivers/arm/i2c_master.h40
2 files changed, 45 insertions, 11 deletions
diff --git a/drivers/arm/i2c_master.c b/drivers/arm/i2c_master.c
index 7369398cc..5814375f3 100644
--- a/drivers/arm/i2c_master.c
+++ b/drivers/arm/i2c_master.c
@@ -32,12 +32,10 @@
32 32
33static uint8_t i2c_address; 33static uint8_t i2c_address;
34 34
35// This configures the I2C clock to 400khz assuming a 72Mhz clock
36// For more info : https://www.st.com/en/embedded-software/stsw-stm32126.html
37static const I2CConfig i2cconfig = { 35static const I2CConfig i2cconfig = {
38 STM32_TIMINGR_PRESC(15U) | 36 STM32_TIMINGR_PRESC(I2C1_TIMINGR_PRESC) |
39 STM32_TIMINGR_SCLDEL(4U) | STM32_TIMINGR_SDADEL(2U) | 37 STM32_TIMINGR_SCLDEL(I2C1_TIMINGR_SCLDEL) | STM32_TIMINGR_SDADEL(I2C1_TIMINGR_SDADEL) |
40 STM32_TIMINGR_SCLH(15U) | STM32_TIMINGR_SCLL(21U), 38 STM32_TIMINGR_SCLH(I2C1_TIMINGR_SCLH) | STM32_TIMINGR_SCLL(I2C1_TIMINGR_SCLL),
41 0, 39 0,
42 0 40 0
43}; 41};
@@ -58,13 +56,13 @@ __attribute__ ((weak))
58void i2c_init(void) 56void i2c_init(void)
59{ 57{
60 // Try releasing special pins for a short time 58 // Try releasing special pins for a short time
61 palSetPadMode(I2C1_BANK, I2C1_SCL, PAL_MODE_INPUT); 59 palSetPadMode(I2C1_SCL_BANK, I2C1_SCL, PAL_MODE_INPUT);
62 palSetPadMode(I2C1_BANK, I2C1_SDA, PAL_MODE_INPUT); 60 palSetPadMode(I2C1_SDA_BANK, I2C1_SDA, PAL_MODE_INPUT);
63 61
64 chThdSleepMilliseconds(10); 62 chThdSleepMilliseconds(10);
65 63
66 palSetPadMode(I2C1_BANK, I2C1_SCL, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN); 64 palSetPadMode(I2C1_SCL_BANK, I2C1_SCL, PAL_MODE_ALTERNATE(I2C1_SCL_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN);
67 palSetPadMode(I2C1_BANK, I2C1_SDA, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN); 65 palSetPadMode(I2C1_SDA_BANK, I2C1_SDA, PAL_MODE_ALTERNATE(I2C1_SDA_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN);
68 66
69 //i2cInit(); //This is invoked by halInit() so no need to redo it. 67 //i2cInit(); //This is invoked by halInit() so no need to redo it.
70} 68}
diff --git a/drivers/arm/i2c_master.h b/drivers/arm/i2c_master.h
index a15f1702d..1bb74c800 100644
--- a/drivers/arm/i2c_master.h
+++ b/drivers/arm/i2c_master.h
@@ -26,9 +26,19 @@
26#include "ch.h" 26#include "ch.h"
27#include <hal.h> 27#include <hal.h>
28 28
29#ifndef I2C1_BANK 29#ifdef I2C1_BANK
30 #define I2C1_BANK GPIOB 30 #define I2C1_SCL_BANK I2C1_BANK
31 #define I2C1_SDA_BANK I2C1_BANK
31#endif 32#endif
33
34#ifndef I2C1_SCL_BANK
35 #define I2C1_SCL_BANK GPIOB
36#endif
37
38#ifndef I2C1_SDA_BANK
39 #define I2C1_SDA_BANK GPIOB
40#endif
41
32#ifndef I2C1_SCL 42#ifndef I2C1_SCL
33 #define I2C1_SCL 6 43 #define I2C1_SCL 6
34#endif 44#endif
@@ -36,6 +46,32 @@
36 #define I2C1_SDA 7 46 #define I2C1_SDA 7
37#endif 47#endif
38 48
49// The default PAL alternate modes are used to signal that the pins are used for I2C
50#ifndef I2C1_SCL_PAL_MODE
51 #define I2C1_SCL_PAL_MODE 4
52#endif
53#ifndef I2C1_SDA_PAL_MODE
54 #define I2C1_SDA_PAL_MODE 4
55#endif
56
57// The default timing values below configures the I2C clock to 400khz assuming a 72Mhz clock
58// For more info : https://www.st.com/en/embedded-software/stsw-stm32126.html
59#ifndef I2C1_TIMINGR_PRESC
60 #define I2C1_TIMINGR_PRESC 15U
61#endif
62#ifndef I2C1_TIMINGR_SCLDEL
63 #define I2C1_TIMINGR_SCLDEL 4U
64#endif
65#ifndef I2C1_TIMINGR_SDADEL
66 #define I2C1_TIMINGR_SDADEL 2U
67#endif
68#ifndef I2C1_TIMINGR_SCLH
69 #define I2C1_TIMINGR_SCLH 15U
70#endif
71#ifndef I2C1_TIMINGR_SCLL
72 #define I2C1_TIMINGR_SCLL 21U
73#endif
74
39#ifndef I2C_DRIVER 75#ifndef I2C_DRIVER
40 #define I2C_DRIVER I2CD1 76 #define I2C_DRIVER I2CD1
41#endif 77#endif