Диагностика работоспособности шины I2C

sergek
sergek аватар
Offline
Зарегистрирован: 05.04.2020

Коллеги, как определить, работоспособна шина 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).

Подскажите, есть какой-либо способ быстрой проверки работоспособности шины?

sadman41
Offline
Зарегистрирован: 19.10.2016

Каковы критерии "работоспособности"?

I2C - шина внутрисистемная, непомехозащищённая.

sergek
sergek аватар
Offline
Зарегистрирован: 05.04.2020

Мне и нужен этот критерий. А пока я вижу, что обмена нет (время записи нулевое), любое чтение возвращает FF и все "починяется" вызовом mcp_1.begin(0), а это - подключение к шине (Wire.begin()). Ну, может быть, неточно выразился - не шина "неработоспособна", а подключение к шине отсутствует. Тогда, как это диагностировать? Не по перечисленным же признакам?

sadman41
Offline
Зарегистрирован: 19.10.2016

Я проверяю фрагментом из скетча I2C scanner. Если откликнулся сенсор, то уже неплохо.

А данные от помех без защитных механизмов наврядли достоверно отличишь.

ВН
Offline
Зарегистрирован: 25.02.2016

sergek пишет:
Подскажите, есть какой-либо способ быстрой проверки работоспособности шины?

осцилом посмотреть, единственный быстрый