i2c 통신할때 write read 동작 방식 질문, 감을 못 잡겠습니다.
글쓴이: raphael4 / 작성시간: 월, 2014/06/09 - 3:24오후
A라는 모듈을 타겟 보드에 연결하여 i2c로 통신 하게 구성되어 있는데
순서는
1. A에서 어떤 값을 읽어서 타겟 보드로 전송하고
2. 타겟 보드에서 i2c 인터럽트가 발생되어
3. 타겟 보드에서 사이즈가 얼마나 되는지 읽고
4. 읽은 사이즈에서 1바이트씩 버퍼에서 값을 읽어 옵니다.
이때 값을 읽어 올때는
먼저 사이즈 주소 write read하고
그다음 실 data 주소 write read하는데
이 과정을 1byte 씩 사이즈가 0이 될때까지 반복합니다.
문제는 가끔 data가 안들어 올때가 있다는 것인데
A모듈에서 값을 읽고 타겟보드에 전송해서 인터럽트가 발생되는 것까지는 정상인데
data를 읽어 오면 문자열 시작인 0x02만 읽고 실 data는 아무것도 없습니다.
왜 이런 문제가 발생되는지 도통 감을 못 잡겠습니다.
A모듈에서 값을 제대로 못 전달하는 것인지
아니면 i2c device driver가 이상한 것인지
i2c 지식이 부족해서 방향조차 못 잡고 있습니다.
조언 부탁드립니다.
Forums:
일단 오실로양에게 도움을.
> 문제는 가끔 data가 안들어 올때가 있다는 것인데
타켓 모듈의 데이타 시트에 나오는 I2C 패턴과 실제 데이타 패턴을 오실로스코프로 이용하여 비교를 먼저 해야할것 같습니다.
H/W 엔지니어 에게 부탁하여
오실로양을 동원하여 같이 봤는데 이상이 없다는 의견입니다.
제가 H/W 지식이 부족해서 죄송하지만 질문 좀 드리자면
데이타시트 패턴과 데이타 패턴을 비교해서 이상이 없는데
code에서 버퍼 내용을 보면 size는 분명 1이고 data도 0x02말곤 아무것도 없는데
이럴 수가 있는걸까요?
추가
사실은 저는 너무 여러가지 경우를 겪어 봐서 그럴 수도 있다고 봅니다.
저는 I2C 사용하는 리눅스 드라이버를 일할 경우에 항상 오실로양을 옆에 대동합니다.
가령 다음과 같은 경우도 체크 되었는지요?
- 7 bit address format
- 10 bit address format
- 그 외..
또한 커맨드 라인 app (http://www.lm-sensors.org/wiki/I2CTools) 을 수정하여
여러가지 command 날려서 상태를 체크해봅니다.
혹은 I2C 핀과 GPIO 핀이 먹싱되었으면 커널 I2C 드라이버를 무시하고
간단하게 GPIO로 I2C 드라이버를 만들어 연결해 봅니다.(저는 이 것까지 한적이 있습니다.)
이 때는 커널 I2C 드라이버로 정확하게 타임을 맞추지 못해서 그랬던 것으로 기억합니다.
댓글 달기