i2c 통신 예제

잠시 기다려그것은 간단한 I2C 통신에 대한 거의,하지만 하나 더 합병증이있다. 마스터가 슬레이브에서 읽을 때 SDA 줄에 데이터를 배치하는 슬레이브이지만 시계를 제어하는 마스터입니다. 슬레이브가 데이터를 보낼 준비가 되지 않았다면 어떨까요? EEPROMs와 같은 장치의 경우 문제가 되지 않지만 슬레이브 장치가 실제로 다른 작업을 수행하는 마이크로 프로세서일 때 문제가 될 수 있습니다. 슬레이브 장치의 마이크로프로세서는 인터럽트 루틴으로 이동하여 작업 레지스터를 저장하고 마스터가 읽고 싶은 주소를 찾아 데이터를 얻고 전송 레지스터에 배치해야합니다. 이것은 많은 uS가 일어날 수 있습니다, 한편 마스터는 행복하게 슬레이브에 응답 할 수없는 SCL 라인에 시계 펄스를 보내는. I2C 프로토콜은 이에 대한 해결책을 제공합니다: 슬레이브는 SCL 라인을 낮게 유지할 수 있습니다! 이를 시계 스트레칭이라고 합니다. 슬레이브가 마스터로부터 읽기 명령을 받으면 클럭 라인이 낮게 유지됩니다. 그런 다음 마이크로프로세서는 요청된 데이터를 가져와 전송 레지스터에 배치하고 클럭 라인을 해제하여 풀업 저항자가 마침내 높은 높이로 끌어당깁니다. 마스터 관점에서, 그것은 SCL 높은 하 여 읽기의 첫 번째 클럭 펄스를 발행 하 고 정말 높은 갔다 있는지 확인 합니다. 그것의 여전히 낮은 경우 그것은 그것을 낮은 잡고 슬레이브이며 마스터는 계속하기 전에 높은 갈 때까지 기다려야한다. 다행히 대부분의 마이크로 프로세서의 하드웨어 I2C 포트가 자동으로 이를 처리합니다.

아래 예제에서는 I2C 라이브러리에 펌웨어에 내장된 기능을 활용합니다. 자세한 내용(ModBus 레지스터 수준)은 I2C 유틸리티에서 볼 수 있으며, 여기서 라이브러리는 기능이 있는 Lua 객체로 노출됩니다. 설명이 있는 이러한 함수 목록은 여기에서 찾을 수 있습니다. 두 시스템 간의 전압 차이가 너무 크면(예: 5V 및 2.5V) SparkFun은 간단한 I2C 레벨 시프터 보드를 제공합니다. 보드에는 활성화 회선도 포함되어 있으므로 선택한 장치에 대한 통신을 비활성화하는 데 사용할 수 있습니다. 이 기능은 주소가 같은 둘 이상의 장치가 단일 마스터에 연결되는 경우에 유용합니다. 간단하고 이해하기 쉽습니다. 나는 우리가 또한 그들로부터 데이터를 읽기 위해 자신의 내부 레지스터의 주소를 찾을 필요가 장치의 주소를 발견 한 후 연습에 넣어 몇 가지 예를 제안한다. 예를 들어 GY-80 브레이크아웃 보드의 3축 가속도계 센서에서 X축에 대한 데이터를 읽으려면 X축의 데이터가 저장되는 내부 레지스터 주소를 찾아야 합니다. 센서의 데이터 시트에서 X축에 대한 데이터가 실제로 헥사데피알 주소 0x32와 DATAX1의 두 레지스터인 DATAX0에 저장되는 것을 볼 수 있습니다.