Raspberry Pi: проблема со связью через I2C

Я пытаюсь создать простой проект с интерфейсом I2C. Для этого я создал скетч в Arduino, который всегда отправляет один байт:

#include <Wire.h>

void setup() {
  Wire.begin(8);
  Wire.onRequest(requestEvent);
}

void loop() {
  delay(100);
}

void requestEvent() {
  Wire.write(0x11);
}

На Raspberry Pi есть скрипт Python:

#!/usr/bin/env python3

import smbus
import time

bus = smbus.SMBus(1)

while True:
    try:
        data = bus.read_byte_data(0x8, 0)
        print(data)
    except Exception as e:
        print(e)
    time.sleep(1)

И вот его вывод:

17
17
17
17
17
17
17
[Errno 5] Input/output error
[Errno 5] Input/output error
[Errno 5] Input/output error
[Errno 5] Input/output error
[Errno 5] Input/output error
[Errno 5] Input/output error
[Errno 5] Input/output error
[Errno 5] Input/output error
[Errno 5] Input/output error
[Errno 5] Input/output error
17
17
17
17
17
[Errno 5] Input/output error
[Errno 5] Input/output error
17
17

Я пытаюсь понять, почему в некоторые случайные моменты времени I2C возвращает ошибку вместо возврата данных? Никаких аппаратных изменений, на RPi больше ничего не работает, буквально ничего не меняется, но I2C перестает работать.

Любые идеи?


person Daniel    schedule 26.03.2017    source источник
comment
I2C обычно имеет один мастер, а устройства, к которым обращаются, являются ведомыми - обычно то, что вы программируете, является ведущим. Ведомые никогда не отправляют, пока мастер не отправит им команду, на которую мастер ожидает ответа. Если Arduino отправляет, Pi должен работать как ведомый, не уверен, что это по умолчанию.   -  person barny    schedule 28.03.2017


Ответы (1)


Вы решили проблему?

У меня была такая же проблема и при настройке Raspberry в качестве мастера. Я думаю, что они из-за отсутствия синхронизации между операциями записи и чтения. т.е. может случиться так, что чтение может быть предпринято во время письма. К сожалению, малина всегда что-то делает, даже если вы думаете об обратном. это связано с тем, что малина является многопоточной платформой и доступна только одна шина (насколько мне известно).

Я решил проблему, добавив синхронизацию между малиной и пикаксом, используя контакт GPIO на малине и один на пикаксе. Таким образом, чтение (как и запись) происходит только при наличии сигнала ok от другой системы.

Я надеюсь, что эта задержка может быть полезна и с такой задержкой.

person tempidoro    schedule 11.06.2017