Перейти к содержанию

Поиск устройств на шине I2C STM32

Шина I2C (Inter-Integrated Circuit) является одной из наиболее распространенных шин, используемых для связи между микроконтроллерами и другими устройствами. Она позволяет передавать данные между устройствами, используя всего две линии – SDA (Serial Data) и SCL (Serial Clock). Шина I2C поддерживает подключение до 127 устройств, что делает ее идеальным выбором для систем, где необходимо подключить множество датчиков и других периферийных устройств.

В данной статье мы рассмотрим, как искать устройства на шине I2C с помощью микроконтроллера STM32. Рассмотрим примеры кода на языке С, которые помогут вам найти и подключить устройства к вашей системе.

Как понять, что устройство с определенным адресом есть на шине i2c? Конечно же по биту подтверждения ACK (Acknowledge). Этот бит выставляет не мастер, а ведомое устройство. И, если ведомое устройство получило свой адрес, то оно выставит бит подтверждения (прижмет линию к земле). На отличной картинке от DI HALT это наглядно продемонстрировано.

Картинка взята с сайта easyelectronics (http://easyelectronics.ru/interface-bus-iic-i2c.html)

В HAL-библиотеке есть специальная функция для проверки доступности устройства:

HAL_StatusTypeDef HAL_I2C_IsDeviceReady (I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout);

Что у нас тут есть:

  • *hi2c – собственно, указатель на объект того i2c, который будет подопытным
  • DevAddress – адрес устройства
  • Trials – количество попыток установить соединение и получить желаемый ACK
  • 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 in i2c).

Вывод данной программы будет достаточно простым. Не забываем сделать ретаргет для printf

Список годной литературы по i2c, расположился ниже

http://easyelectronics.ru/interface-bus-iic-i2c.html

Статья об i2c на easyelectronics

https://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/

Пошагово и с картиночками – как я люблю

http://www.gaw.ru/html.cgi/txt/interface/iic/index.htm

Один из “алмазов” интернета снова в деле

Comment

programel