ChibiOS. Методика поиска и устранения неисправностей шины I²C на STM32

Однажды вы захотите использовать данный интерфейс для связи в каких либо своих проектах и может так случиться, что I²C не заработает, вы либо не получите каких-либо данных, либо получите кракозябры(мусор).
Данное руководство подскажет вам как избежать некоторых ошибок, при работе с I²C.

Для начала проверяем:

— Убеждаемся что используем внешние подтягивающие резисторы. Внутренние pullup сопротивления не подойдут для работы с I²C. Также следует обратить внимание на соответсвие номинала резистора скорости шины I²C:

100 кГц резистор не более 10 кОм
400 кГц————————4,7 кОм
1МГц—————————2 кОм

— Убедитесь в правильности подключения линий SDA и SCL.
— Правильно настройте PAL драйвер для линий SDA и SCL, они должны быть настроены на режим альтернативной функции — PAL_MODE_ALTERNATE и режим выхода с открытым стоком OPENDRAIN. Примеры можно посмотреть ниже.
— Убедиться что вы используете правильный идентификатор драйвера I²C. Нельзя использовать I2CD1, если используется I2CD2.
— Можно использовать диагностические функции драйвера I²C, для того, чтобы получить коды ошибок, подробнее смотреть по ссылке.

— Смотрите примеры программ I²C в папке testhal, они гораздо проще для понимания, чем примеры в папке demos.

Примеры настройки PAL драйвера

Для STM32F1xx:

palSetPadMode(GPIOB, 6, PAL_MODE_STM32_ALTERNATE_OPENDRAIN); /* SCL */
palSetPadMode(GPIOB, 7, PAL_MODE_STM32_ALTERNATE_OPENDRAIN); /* SDA */

Для STM32F4xx:

palSetPadMode(GPIOB, 8, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN); /* SCL */
palSetPadMode(GPIOB, 9, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN); /* SDA */

Если не смогли устранить причину неправильной работы I2C, то следует проверить работоспособность вашего оборудования. Можно использовать осциллограф или логический анализатор, чтобы проверить идут ли от Master какие-либо данные. Вы можете заменить чип, если это позволяют ваши возможности.

Если не помогло, то не стесняйтесь задавать вопросы на форуме, пожалуйста, дайте как можно больше деталей касательно вашей неисправности.

Перевод статьи Troubleshooting: I²C on STM32