Как понять, что устройство с определенным адресом есть на шине i2c? Конечно же по биту подтверждения ACK (Acknowledge). Этот бит выставляет не мастер, а ведомое устройство. И, если ведомое устройство получило свой адрес, то оно выставит бит подтверждения (прижмет линию к земле). На отличной картинке от DI HALT это наглядно продемонстрировано. В HAL-библиотеке есть специальная функция для проверки доступности устройства: HAL_StatusTypeDef HAL_I2C_IsDeviceReady (I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout); Что у нас тут есть: Для полноценного сканирования всего адресного пространства на линии i2c1 достаточно написать следующий код: HAL_StatusTypeDef ret;
for(int i = 1; i < 128; i++)
{
ret = HAL_I2C_IsDeviceReady(&hi2c1, (uint16_t)(i << 1), 4, 100);
if (ret == HAL_OK)
{
printf("dev_addr: 0x%02X ", i);
}
else if(ret != HAL_OK)
{
printf("-- ");
}
} Мы не обращаемся по адресу 0, т.к. он может, внезапно, и ответить (гуглить: general call address