Revision b4885314 boards/LightRing/board.c
boards/LightRing/board.c | ||
---|---|---|
64 | 64 |
|
65 | 65 |
} |
66 | 66 |
|
67 |
inline void boardClearI2CBus(const uint8_t scl_pad) { |
|
67 |
inline void boardClearI2CBus(const uint8_t scl_pad, const uint8_t sda_pad) {
|
|
68 | 68 |
|
69 | 69 |
uint8_t i; |
70 | 70 |
|
71 |
// configure I²C SCL open drain |
|
71 |
// configure I²C SCL and SDA open drain
|
|
72 | 72 |
palSetPadMode(GPIOB, scl_pad, PAL_MODE_OUTPUT_OPENDRAIN); |
73 |
palSetPadMode(GPIOB, sda_pad, PAL_MODE_OUTPUT_OPENDRAIN); |
|
73 | 74 |
|
74 |
// perform bus clear as per I²C Specification v5 3.1.16 |
|
75 |
for (i = 0x00u; i < 0x09u; i++) { |
|
75 |
// perform a 2-wire software reset for the eeprom (see AT24C01BN-SH-B datasheet, chapter 3) |
|
76 |
// note: clock is ~50kHz (20us per cycle) |
|
77 |
palSetPad(GPIOB, sda_pad); |
|
78 |
palClearPad(GPIOB, scl_pad); |
|
79 |
chThdSleepMicroseconds(10); |
|
80 |
palSetPad(GPIOB, scl_pad); |
|
81 |
chThdSleepMicroseconds(5); |
|
82 |
palClearPad(GPIOB, sda_pad); |
|
83 |
chThdSleepMicroseconds(5); |
|
84 |
palClearPad(GPIOB, scl_pad); |
|
85 |
chThdSleepMicroseconds(5); |
|
86 |
palSetPad(GPIOB, sda_pad); |
|
87 |
chThdSleepMicroseconds(5); |
|
88 |
for (i = 0; i < 9; ++i) { |
|
89 |
palSetPad(GPIOB, scl_pad); |
|
90 |
chThdSleepMicroseconds(10); |
|
91 |
palClearPad(GPIOB, scl_pad); |
|
92 |
chThdSleepMicroseconds(10); |
|
93 |
} |
|
94 |
palSetPad(GPIOB, scl_pad); |
|
95 |
chThdSleepMicroseconds(5); |
|
96 |
palClearPad(GPIOB, sda_pad); |
|
97 |
chThdSleepMicroseconds(5); |
|
98 |
palClearPad(GPIOB, scl_pad); |
|
99 |
chThdSleepMicroseconds(10); |
|
100 |
palSetPad(GPIOB, scl_pad); |
|
101 |
chThdSleepMicroseconds(5); |
|
102 |
palSetPad(GPIOB, sda_pad); |
|
103 |
chThdSleepMicroseconds(5); |
|
104 |
palClearPad(GPIOB, scl_pad); |
|
105 |
chThdSleepMicroseconds(10); |
|
106 |
|
|
107 |
// perform bus clear as per I²C Specification v6 3.1.16 |
|
108 |
// note: clock is 100kHz (10us per cycle) |
|
109 |
for (i = 0; i < 10; i++) { |
|
76 | 110 |
palClearPad(GPIOB, scl_pad); |
77 | 111 |
chThdSleepMicroseconds(5); |
78 | 112 |
palSetPad(GPIOB, scl_pad); |
... | ... | |
81 | 115 |
|
82 | 116 |
// reconfigure I²C SCL |
83 | 117 |
palSetPadMode(GPIOB, scl_pad, PAL_MODE_STM32_ALTERNATE_OPENDRAIN); |
118 |
palSetPadMode(GPIOB, sda_pad, PAL_MODE_STM32_ALTERNATE_OPENDRAIN); |
|
84 | 119 |
|
120 |
return; |
|
85 | 121 |
} |
Also available in: Unified diff