Диагностика работоспособности шины I2C
- Войдите на сайт для отправки комментариев
Пт, 24/04/2020 - 22:13
Коллеги, как определить, работоспособна шина I2C или нет?
В какой-то момент значения всех регистров становятся равными reg = 0xFF и gpioState = 0xFFFF:
#include <Adafruit_MCP23017.h> Adafruit_MCP23017 mcp_1; void setup() { mcp_1.begin(0); } void loop() { unsigned long t = millis(); mcp_1.writeRegister(0x05, 0x0); mcp_1.writeRegister(0x15, 0x0); mcp_1.writeRegister(MCP23017_IOCONA, 0x0); mcp_1.writeRegister(MCP23017_IOCONB, 0x0); mcp_1.writeRegister(MCP23017_IPOLA, 0x0); mcp_1.writeRegister(MCP23017_IPOLB, 0x0); mcp_1.writeRegister(MCP23017_GPINTENA, 0x0); mcp_1.writeRegister(MCP23017_GPINTENB, 0x0); unsigned long dt = millis() - t; uint8_t reg = mcp_1.readRegister(MCP23017_IOCONA); reg = mcp_1.readRegister(MCP23017_IPOLA); reg = mcp_1.readRegister(MCP23017_IPOLB); reg = mcp_1.readRegister(MCP23017_IODIRA); reg = mcp_1.readRegister(MCP23017_IODIRB); uint16_t gpioState = mcp_1.readGPIOAB(); }
При этом вызов Wire.endTransmission(), который используется в каждой операции чтения возвращает 0, т.е. отсутствие ошибки. Другой косвенный признак, что обмена с микросхемой не происходит - изменение времени выполнения операции записи dt с 3-4 мс до 0.
Такая ситуация была зафиксирована один раз и вылечилась повторной инициализацией шины (в тексте не показано) оператором mcp_1.begin(0).
Подскажите, есть какой-либо способ быстрой проверки работоспособности шины?
Каковы критерии "работоспособности"?
I2C - шина внутрисистемная, непомехозащищённая.
Мне и нужен этот критерий. А пока я вижу, что обмена нет (время записи нулевое), любое чтение возвращает FF и все "починяется" вызовом mcp_1.begin(0), а это - подключение к шине (Wire.begin()). Ну, может быть, неточно выразился - не шина "неработоспособна", а подключение к шине отсутствует. Тогда, как это диагностировать? Не по перечисленным же признакам?
Я проверяю фрагментом из скетча I2C scanner. Если откликнулся сенсор, то уже неплохо.
А данные от помех без защитных механизмов наврядли достоверно отличишь.
осцилом посмотреть, единственный быстрый