2009-12-31 3 views
5

내가 일하고있는 프로젝트의 경우 I2C를 통해 다기능 칩과 통신해야합니다. Linux 사용자 공간에서 I2C/dev/i2c-1 인터페이스를 통해이 작업을 수행 할 수 있습니다.I2C 통신을 안전하게합니까?

그러나 운전자가 같은 칩에 동시에 말하고있는 것처럼 보입니다. 결과적으로 I2C_SLAVE 액세스가 EBUSY의 errno 값으로 실패합니다. 음, ioctl I2C_SLAVE_FORCE를 통해이를 무시할 수 있습니다. 나는 그것을 시도하고 그것을 작동합니다. 내 명령이 칩에 도달한다.

질문 : 안전하게 할 수 있습니까? 필자가 작성한 주소 범위에는 커널 드라이버가 액세스하지 않는다는 것을 알고 있습니다. 그러나 I2C 통신을 강제하면 일부 내부 상태 머신을 혼동시킬 수 있는지 확실하지 않습니다. (저는 이 아니고 I2C에가 사용됩니다 ...)

참고로 하드웨어 사실 :

 
OS:   Linux 
Architecture: TI OMAP3 3530 
I2C-Chip:  TWL4030 (does power, audio, usb and lots of other things..) 
+0

http://chiphacker.com에서이 질문을 해보시겠습니까? 그것은 SO와 같은 사이트지만 전자 제품입니다 (SO만큼이나 활발하지는 않지만). – Wim

답변

6

나는 특정 칩 모르겠지만, 자주 당신은 당신이 읽거나 다른 주소 쓰기, 특정 모드를 설정 한 주소로 첫째, 쓰기의 순서를 요구하는 명령이 - 어디 두 번째 주소의 기능은 첫 번째 주소에 쓴 내용에 따라 변경됩니다. 따라서 드라이버가 이러한 작업 중 하나의 중간에 있고 그 작업을 중단하면 (또는 그 반대로) 디버그하기 어려운 경쟁 조건이 발생합니다. 신뢰할 수있는 솔루션을 얻으려면 칩 드라이버를 통해 더 잘 의사 소통을하십시오.

+0

칩 드라이버를 작성하는 경우 어떻게이 문제를 처리해야합니까? 내 이해에서, 나는 내 칩의 드라이버 코드에서 I2C_SLAVE와 I2C_SLAVE_FORCE를 사용하고있다. 칩의 드라이버 코드에서 I2C_SLAVE_FORCE를 사용하는 것이 좋습니다. –

2

나는 대부분 @Wim에 동의합니다. 그러나 이것은 장치에 따라 돌이킬 수없는 문제 또는 파괴를 일으킬 수 있다고 덧붙이고 싶습니다.

저는 특정 위치에 쓰지 않아도되는 자이로 스코프 (L3GD20)를 알고 있습니다. 칩이 설치되는 방식으로,이 위치는 장치의 기능 및 수행 방법을 결정하는 제조업체의 설정을 포함합니다.

이것은 쉬운 문제인 것처럼 보일 수 있지만 I2C가 작동하는 방식을 생각하면 모든 바이트가 한 번에 한 비트 씩 전달됩니다. 다른 바이트를 전송하는 도중에 중단하면 결과가 실제로 예측할 수 없을뿐만 아니라 영구적 인 손상의 위험도가 기하 급수적으로 증가 할 수 있습니다. 이것은 물론 문제를 처리하는 방법에 대해 전적으로 칩에 달려 있습니다.

마이크로 컨트롤러는 I2C에서 허용되는 버스 속도보다 훨씬 빠른 속도로 작동하기 때문에 버스 속도 자체가 장치가 정보를 처리하는 속도에 따라 동적이기 때문에 일시 중지 또는 루프를 삽입하는 것이 가장 좋습니다 전송이 완료 될 때까지 기다립니다. 그래야만 시간 초과를 삽입 할 수도 있습니다. 이러한 일시 중지가 작동하지 않으면 구현에 문제가있는 것입니다.

관련 문제