Wednesday, June 6, 2018

Software I2C Emulation Test

최근 회사일 때문에 I2C에 대해 자세히 볼 기회가 생겼다.

아두이노 우노에는 I2C pin 이 A4, A5이다. I2C는 하나의 버스에 여러개의 device가 물려도 주소만 다르면 동작하므로 괜찮기는 하나, 다른 pin에서도 I2C를 사용할 수 있으면 좋을 것이다.

I2C 프로토콜은 비교적 구현이 간단하고 타이밍에 대한 정교함이 떨어져도 사용 가능한 구조라 직접 구현해볼 계획이었다. 그러나 역시 그것을 구현해놓은 코드가 있더라.

SoftI2CMaster라는 오픈소스프로젝트가 존재한다.

https://github.com/todbot/SoftI2CMaster


그래서 분석도 할 겸 코드를 테스트 해 보았다. 테스트는 MPU6050에 물려서 해보기로 했다.

20160910_171414.jpg

그런데, 동작하지 않더라.  또 무슨 문제일까.  그래서 I2C 프로토콜을 다시 살펴보고, Logic Analyzer로 신호를 분석하고나니 뭔가 보였다.

바로 I2C Stop 신호가 비정상이었던 것이다.

20160910_175842.jpg

ACK 가 끝나고 다음 녹색점(I2C Start) 바로 앞 Rising Edge가 I2C Stop이어야 한다. 그러나, 그렇게 되지 못한건 밑에 SCL이 High가 되기 전에 이미 SDA가 High이기 때문이다.

I2C Stop이 되기 위해서는 SCL이 High인 상태에서 SDA가 High가 되어야 한다. 그렇게 바꾸고 나니 신호가 정상적으로 잘 들어왔다. 해당 버그는 수정하여 최초 개발자에게 이슈를 오픈한 상태이다.

그리고 SW로 구현된 I2C 속도를 측정해보니, HW I2C의 기본속도인 100Khz에 한참 못미치는 약 6Khz로 구동되더라...   아마도 SW이기 때문에 그러려니 했다가, delay가 50uS로 되어있는것을 보고 그냥 1로 바꾸어 보았다.    최초 개발자는 펄스의 안정성 때문에 그렇게 한것 같지만, 1uS로 바꾸고 테스트 해보니 아주 잘 동작하였다!

우노에서는 큰 문제가 없나보다.  그래서 결국 HW의 기본 동작속도인 100Khz에 근접하게 되었다.

20160910_173906.jpg

No comments:

Post a Comment