implement I²C bus clear

This commit is contained in:
King Kévin 2022-08-05 15:15:59 +02:00
parent af416909d1
commit 87fda7e878
1 changed files with 10 additions and 0 deletions

10
main.c
View File

@ -336,6 +336,16 @@ we will only be able to provide 1 extension block since we can only respond to o
SCL_SNK_PU_PORT->ODR.reg |= SCL_SNK_PU_PIN; // pull up SCL line
SCL_SNK_PU_PORT->CR1.reg |= SCL_SNK_PU_PIN; // switch pin to push pull
SCL_SNK_PU_PORT->DDR.reg |= SCL_SNK_PU_PIN; // switch pin to output
if (0 == (SDA_SNK_PORT->IDR.reg & SDA_SNK_PIN)) { // SDA line is stuck
puts ("bus clear ");
// perform bus clear
for (uint8_t i = 0; i < 9; i++) {
SCL_SNK_PORT->ODR.reg &= ~SCL_SNK_PIN;
wait_10us(1);
SCL_SNK_PORT->ODR.reg |= SCL_SNK_PIN;
wait_10us(1);
}
}
uint8_t i2c_rc = 1; // if the complete read succeeded
if (!softi2c_master_setup(400)) { // start the I²C master to talk to sink
i2c_rc = 2;