Как правильно отправлять байты между RPI и Arduino по I2C при использовании ISR без ошибок ввода-вывода?

У меня есть соединение I2C между RPI 3B+ и Arduino Nano. Я хочу отправить ключ и соответствующий байт значения, и arduino что-то делает с этим внутри синхронизированного ISR. Что работает. Но я получаю ошибки ввода-вывода на стороне RPI, вероятно, потому, что ISR занят. Поэтому я провел небольшой тест. Каждые 10000 сообщений отправляйте:

  • 245 ошибок ввода-вывода при частоте 51 281 Гц ISR
  • 104 Ошибки ввода-вывода при 25 600 Гц ISR
  • 28 Ошибок ввода-вывода при частоте 6400 Гц ISR

Есть ли какой-нибудь способ уменьшить количество ошибок ввода-вывода или вообще их не иметь? Мне нужно около 25 600 кГц для моего ISR.

Сторона RPI:

bus.write_i2c_block_data(0x60, 0x00, [key, val])

Обработчик сообщений на стороне Arduino, называемый Wire.onReceive(msg_handler);:

void msg_handler(int bitstream) {
     Wire.read();
     int pin = Wire.read();
     int val = Wire.read();
     Serial.println(pin);
     Wire.begin(0x60);

Я каждый раз начинаю провод, потому что в противном случае, как только у него возникнет ошибка ввода-вывода, он перестанет печатать на серийном. Моя проводка составляет 18 AWG и около 20 см. Ошибка:

[Errno 121] Remote I/O error

, 👍1


1 ответ


1

Какую тактовую частоту i2c вы используете?

Даже при более высокой "довольно стандартной" скорости 400 кГц это составляет 2,5 мкс за бит. Для двухбайтовой передачи это 4u только для данных, что составляет 25000 передач в секунду. Добавьте стартовый и стоп-биты, а также время обработки, и вы увидите, что ваша целевая скорость передачи данных невозможна.

i2c просто не так быстр, как в стандартной комплектации, хотя существуют гораздо более быстрые "нестандартные" режимы.

,