Сканер шины I2C на Discovery

Разбираясь в ящике стола нашёл интересный модуль, половина телевизора, по старым временам. Модуль состоит из ряда микросхем, выполняющие львиную долю по приёму аналогово ТВ сигнала, его разложение на видео и звук. Управляется все это «чудо» по шине IC. И возникло решение: проверить модуль на пригодность, просканировать его, на каких адресах все завязано.

   

Используя готовую плату «Discovery» с установленным микроконтроллером STM32F303vct6, среду разработки от ST компании — CubeMX,  реализуем следующий функционал:

  1. Аппаратное подключение ТВ модуля по шине I2C.
  2. Реализация в STM32F3DISCOVERY виртуального COM порта (USB VCP Device).
  3. Программная реализация опроса шины I2C и вывод информации на терминальную программу компьютера.

Приступим. Открываем IDE CubeMX, находим наш контроллер и настраиваем периферию:

1. Подключаем программатор SYS -> Serial Wire.

2. Подключаем кнопку Kn1 и светодиоды.

3. Настраиваем тактирование системы

RCC -> BYPASS Clock Source.

4. Подключаем шину I2C1, настраиваем обмен на скорость 100 KHz. Сигнал I2C1_SCL вручную подключаем к PB6.

5. Подключаем шину USB. Ставим галочку USB -> Device (FS).

6. Настраиваем порт USB. USB_DEVICE -> Class For FS IP -> Communication Device Class (Virtual Port om). Настройки оставляем по как есть. VIDPID не меняем для установки штатного драйвера VPC от st.com.

7. Переходим на вкладку Clock Configuration, соглашаемся с автоматической настройкой тактирования ядра и периферии.

8. Переходим на вкладку Project Manager вписываем имя проекта, путь сохранения, выбираем среду IDE. Увеличиваем Minimum Heap Size до 600. Нажимаем на кнопу «GENERATE CODE». Идет создание файлов для проекта и все это открываем в нашей среде программирования.

 

Написание кода

Настройку среды программирования я пропускаю, много статей есть в интернете, да и вы можете использовать другую среду программирования, отличную от моей. Я же, работаю в Keil uVision5.

Открываем файл main.c и в бесконечном цикле пишем функцию переключения светодиода и задержку.

Собираем, прошиваем (С=14390, RO-data=474 RW-data=338 ZI-data=7300), подключаем наше устройство к компьютеру и смотрим порт и драйвер.

Проверяем в диспетчере устройств компьютера появившейся наше устройства CDC,

В ручную прописываем драйвер от ST компании. У меня он получился COM3.

Заполняем в файл usbd_cdc_it.c данными нашего виртуального  интерфейса RS-232. Скорость оставим 115200.

Переходим в файл main.c Подключаем заголовочные файлы #include «usbd_cdc_if.h» и  #include <stdio.h>.

Проверим передачу сообщений в наш терминал. Пишем функцию CDC_Transmit_FS((uint8_t*) «Scanner I2C v.0.1», 17); и HAL_Delay(500);

в бесконечном цикле, для передачи по USB тестового сообщения.

После успешной проверки нашего виртуального порта USB<->RS232 можно приступать к написанию основной части сканера.

Она простая:

Каждые 0,2 секунды проверяем нажатие кнопки и моргаем светодиодом LED1.При нажатии на кнопку «взводим» флаг flagStartScan. Бесконечном цикле проверяем наш флаг и если он работал используя HAL функцию HAL_I2C_IsDeviceReady(), перебирая адреса проводим опрос устройств на линии. При отрицательном ответе моргаем светодиодом LED2, при положительном сообщении – формируем текст с адресом устройства и отправляем его в терминал компьютера. По окончанию проверки всех устройств на линии I2C гасим светодиод LED2 и сбрасываем наш флаг в 0.

Собираем , прошиваем, смотрим результат работы!

На фото видны: LSM303DLHC с адресами 0х19, 0х1Е. Установленный на плате STM32F3DISCOVERY.

И новые: SN761677, TDA9885TS с адресами 0х43, 0х60, 0х61.

В архиве все исходники.