avr i2c 통신 예제

ATmega TWI 하드웨어는 마스터 및 슬레이브 작업을 모두 지원합니다. 이 예제에서는 AVR 마이크로 컨트롤러를 TWI 마스터로 사용하는 방법만 보여 줍니다. TWI 슬레이브와 대화하는 데 필요한 단계에 집중하기 위해 구현이 간단하게 유지되므로 모든 처리가 폴링 모드에서 수행되므로 다음 처리 단계가 예정되어 있음을 나타내기 위해 TWI 인터페이스가 대기합니다(TWINT 인터럽트 비트를 설정). 전체 TWI 통신이 «백그라운드»에서 발생하도록 하려면 이 모든 것을 인터럽트 제어 방식으로 구현할 수 있으며, 여기서 시작 조건만 인터럽트 루틴 외부에서 트리거되어야 합니다. 이제 I2C 통신의 기본 을 거의 다 수했습니다. 글쎄, 물론 그것은 않습니다 – 당신이 사용하고있는 예는 메모리 장치와 이야기하기위한 것이기 때문에 – 특히 EEPROM!! 마스터는 직렬 통신(SCL)을 위한 클럭을 생성합니다. 데이터 비트(B1에서 BN)의 스트림은 시작 비트와 중지 비트 간에 전송됩니다. I²C는 통신을 위해 두 개의 전선만 있으면 됩니다. 하나는 직렬 데이터(SDA)라고 하고 다른 하나는 그림과 같이 직렬 시계(SCL)입니다.

EEDEVADR은 I2C 라인의 EEPROM 칩 주소입니다. 이 예에서 #define EEDEVADR 0b1010000 메모리에 바이트를 작성하기 전에 먼저 I2C 통신을 시작한 다음 세 개의 높은 메모리 주소 비트와 결합된 장치 주소를 작성합니다. 쓰기의 가장 낮은 장치 비트는 «0»입니다. 느린 클럭의 경우 2 x U[S]ART 클럭 배율을 활성화하여 baud 속도 오류를 개선합니다. 이를 통해 표준 1MHz 보정 RC 발진기를 사용하여 9600 Bd 통신이 가능합니다. 데이터시트의 Baud 속도 표도 참조하십시오. 장치는 버스의 마스터 역할을 하거나(예: 전송을 시작함) 슬레이브(마스터가 호출할 때만 작동)로 작동할 수 있습니다. 버스는 멀티 마스터가 가능하며 특정 장치 구현은 서로 다른 시간에 마스터 또는 슬레이브 역할을 할 수 있습니다. 장치는 소위 시작 조건 이후에 첫 번째 바이트로 전송되는 7비트 주소(필립스에서 조정)를 사용하여 처리됩니다. 해당 바이트의 LSB는 R/~W, 즉 슬레이브에 대한 요청이 다음 주기 동안 데이터를 읽거나 쓰는지 여부를 결정합니다. (10비트 주소를 사용하는 장치를 사용하는 옵션도 있지만 이 예제에서는 다루지 않습니다.) 우리는 TWSR 레지스터에서 상위 5 비트를 읽을 필요가, 그래서 우리는 세 개의 낮은 비트를 마스크. 우리가 볼 수 있듯이, 상태 메시지를 읽는 것은 I2C 통신에서 오류를 감지하는 데 필수적인 부분입니다.

배워야 할 주요 교훈은 : «앱 노트 또는 라이브러리 예제를 사용하는 방법»어떻게 TWSR의 비트에서 상태를 알 수 있습니까?? 예를 들어 0x08 상태를 얻는 경우 이것이 무엇을 의미합니까?! 24Cxx EEPROM에 할당된 주소는 상위 4비트에서 1010으로 구성됩니다. 다음 세 비트는 일반적으로 슬레이브 하위 주소로 사용할 수 있으므로 단일 버스에서 동일한 유형의 장치를 둘 이상 작동할 수 있으며, 각 장치에 사용되는 실제 하위 주소는 하드웨어 스트래핑으로 구성됩니다. 그러나 장치 선택 다음의 다음 데이터 패킷은 EEPROM 주소로 사용되는 8비트만 허용하기 때문에 8개 이상의 주소 비트(24C04 이상)가 필요한 장치는 하위 주소 비트를 «훔쳐» EEPROM 셀 주소 비트 9에서 11까지 req로 사용합니다. 의자.