Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
while (!(I2C1->SR1 & I2C_SR1_SB)){}
while (!(I2C1->SR1 & I2C_SR1_ADDR)){}
и т.д.
не самое хорошее решение.Bit 1 BUSY: Bus busy
0: No communication on the bus
1: Communication ongoing on the bus
– Set by hardware on detection of SDA or SCL low
– cleared by hardware on detection of a Stop condition.
It indicates a communication in progress on the bus. This information is still updated when
the interface is disabled (PE=0).
Пока вы не отправите данные в шину бизя выставится не сможет.Да почему? Более того, в документации сказано, что флаг занятости шины работает даже при неактивном интерфейсе:
This information is still updated when the interface is disabled (PE=0).Если же Вы хотите сказать, что в данном месте документация не соответствует действительности, то так и напишите прямым текстом — эта информация может многим быть весьма полезна.
Т е вы все равно даже его проверяя не можете на начальном этапе выявить проблемы на шине.Ну так для выявления этих ситуаций служат флаги ошибок, в частности ARLO в регистре SR1, которые тоже надо контролировать.
/* Wait until BUSY flag is reset */
if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET,
I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
{
return HAL_BUSY;
}
Конкретно этот фрагмент я взял из функции HAL_I2C_Master_Transmit(), но в других тоже присутствует нечто подобное. Я вовсе не считаю HAL безспорным образцом для подражания, но все же.Если сначала сконфигурировать регистр на альтернативную функцию, а потом настроить на выход, то I2C работать не будет.
Был бы признателен, если бы Вы подсказали как таймауты правильно организовать.Ну хотя бы в исходниках того же HAL посмотрите, как реализованы функции работы с I2C в простейшем варианте (без прерываний и DMA): HAL_I2C_Master_Transmit(), HAL_I2C_Master_Receive() и т.д. Я не призываю Вас обязательно использовать HAL, но заглянуть в его реализацию иногда полезно.
Преобразование адреса датчика из А5 в В4 описано в спецификации интерфейса. См. на сайте www.nxp.com
STM32 и бесконтактный датчик температуры MLX90614. Подключение по I2C