2014-10-11 3 views
2

NACK 허용 마스터로 전송할 때 I2C 슬레이브가 있습니까?I2C 슬레이브 송신기 NACK (일명 가변 길이 응답)

스펙 (2.1)에서 보면 슬레이브가 전송 중, 즉 슬레이브에서 마스터로 데이터를 전송하는 동안 NACK를 마스터에 사실적으로 전송할 방법이없는 것 같습니다. 그물을 샅샅이 뒤졌으며 여기에서 어떤 도움도 찾을 수 없습니다.

왜? AVR Atmega8에서 I2C 마스터 디바이스를 구현 중입니다. 모든 유스 케이스를 다루고 싶습니다. SLA + R 모드에서 I2C 슬레이브 디바이스가 NACK을 전송할 때 마스터가이를 무시한다고 언급 한 사용자가 있습니다.

알고있는 한, SLA + R을 시작한 마스터 장치는 패킷을 NACK 할 수있는 유일한 장치입니다. 슬레이브는 마스터 클럭에서 패킷을 계속 보내야합니다. 그러나 Arduino 와이어 라이브러리에있는 스 니펫은 슬레이브가 마스터에 NACK을 보낼 수 있음을 의미합니다. https://github.com/arduino/Arduino/blob/master/libraries/Wire/utility/twi.c#L503

  1. 은 무엇 슬레이브가 슬레이브가 슬레이브 송신 모드에서 NACK를 보낼 수 3
  2. 2 개 패킷하지만 마스터 클럭을 보내려고하면 어떻게해야합니까?
  3. 더 이상 데이터가 없다는 것을 마스터에게 알려주는 다른 방법이 있습니까?

답변

4

당신이 맞으면, 노예가 NACK을 보낼 방법이 없습니다. I2C는 값싼 슬레이브 장치를 만들고 많은 논리를 마스터에 넣는 것을 의미합니다. 따라서 대부분의 경우 마스터는 패킷의 길이를 알아야합니다. 데이터가 실제로 가변적 인 경우 상위 수준의 프로토콜을 만들고 헤더의 일부로 패킷 길이를 전송해야합니다. 예 : DDC는 3 바이트에서 패킷 크기를 전송하고 마스터는이 정보를 사용해야합니다.

  1. 구현에 의존하고 대부분 결정되지 않음. 후속 바이트는 마지막 유효 바이트, 상수 값의 복사본 일 수 있습니다. FF 또는 다른 어떤 것.

  2. 번호

  3. 나는 더 높은 수준의 프로토콜, 앞서 말했듯이. 예 : a) 단순한 단일 크기 메시지, 최대 256 페이로드 : 시작 주소 - 크기 - 바이트 ... - 중지 b) 다중 서브 패킷, 무제한 페이로드 : 시작 주소 - 크기 - 바이트 - 크기 - 바이트. .. - 중지

상위 수준 프로토콜 중 하나를 사용하려면 메시지 길이를 결정하는 논리가 마스터 I2C 기능에 포함되어야합니다. 즉, read (adr, buffer, size)와 같이 가장 많이 제공되는 루틴 (start, read, stop)은 정확히 "크기"바이트 수를 읽으므로 사용할 수 없습니다.

+1

나는 그다지 의심 스럽습니다. 슈퍼 스타! 이 사실을 기록 할 시간을 갖게되어 정말 고맙습니다. – ginge