예전 글 복구 재게시.
I2C 는 State 조건임을 상기하라.
타이밍 조건은 너무 초고속인 경우와, 자체적으로 설정한 타임아웃 조건만 발생한다.
따라서 공급클럭 SCL의 간격정보등에 현혹되지 말 것. 자꾸 저거 아닐까~ 하다가 괜한 시간낭비만...
장비를 쓸 것. 로직 어날 붙이라고.. 귀찮아서 최후까지 찍어보지 않는 것이 시간낭비를 부채질 한다 ㅠ.ㅠ
스코프보다는 로직어날라이저를 사용한다.
스코프상에서는 타이밍과 레벨의 움직임에 현혹당하기 쉽다.
I2C에서는 "상태조건", 즉 "SDA가 먼저냐 SCL이 먼저냐" 같은 "조건"이 유효정보이다.
풀업레지스터에 주의한다. 여기서 말하는 풀업레지스터는 칩안에 내장되어 있는 풀업레지스터이며, 이를 컨틀롤하는 풀업레지스터이기도 하다. 요즘 칩에는 많이들 내장되어 있다.
풀업레지스터는 SCL이 다운되면, 또는 SDA 입력 대기일때 disable 되야 한다. SCL이 업되면 풀업은 켜준다.
#define TKEY_SDA_OUT_EN() { rPCONF = 0x2025; rPUPF = 0x0; } // 출력방향, 풀업레지스터 사용
#define TKEY_SDA_HIZ() { rPUPF = 0x2; } // 풀업 금지
SDA를 읽어올때는 포트값을 한 번 읽어서는 슬레이브쪽에서 보내오지도 않았는데 그냥 빠져나갈 가능성이 있다. 따라서 일정 타임 아웃시간을 두고 포트값을 보고 있다가 변하는지 검사해야 한다.
사실 풀업 문제만 아니었다면 헤멜 문제가 아니였고. 리눅스 I2C 드라이버 같은 것을 보면 별 고민없이 심플하게 되어 있다.
하지만 I2C 라는것이 칩마다 조금씩 다르고 하여. 널리 알려진 칩이 아닌 이상 타이밍 노가다는 한 번씩 거쳐야 할 것으로 보인다.