2017-03-26 1 views
0

I2C 인터페이스를 사용하여 간단한 프로젝트를 만들려고합니다.Raspberry Pi : I2C를 통한 통신 문제

라즈베리 파이에
#include <Wire.h> 

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

void loop() { 
    delay(100); 
} 

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

이 파이썬 스크립트입니다 :

#!/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는 작동을 멈 춥니 다.

아이디어가 있으십니까?

+0

I2C에는 일반적으로 단일 마스터가 있으며 주소 지정된 장치는 슬레이브입니다. 보통 프로그램하는 것은 마스터입니다. 노예들은 주인이 응답을 기대하는 명령을 주 (主)가 보내 줄 때까지 절대 보내지 않습니다. Arduino가 전송하는 경우 Pi는 기본값이 아닌지 노예로 작동해야합니다. – barny

답변

0

문제를 해결 했습니까?

라즈베리를 마스터로 구성 할 때도 같은 문제가있었습니다. 필자는 쓰기 작업과 읽기 작업 간의 동기화가 누락 된 것이 원인이라고 생각합니다. 나는. 쓰기가 끝나면 독서를 시도 할 수 있습니다. 불행히도 라스베리는 당신이 반대로 생각하면 항상 뭔가를합니다. 이것은 라즈베리가 멀티 쓰레드 플랫폼이고 오직 하나의 버스 만이 (내 지식으로) 이용 가능하기 때문입니다.

라즈베리와 피카소의 GPIO 핀을 사용하여 나무 딸기와 피캔스 간의 동기화를 추가하는 문제를 해결했습니다. 이런 방식으로 다른 시스템의 ok 신호가있을 때에 만 나의 일이 일어납니다.

이 지연이 이러한 지연에도 유용 할 수 있기를 바랍니다.