상위 수준 애플리케이션에서 I2C 사용
Azure Sphere는 master 모드에서 Inter-Integrated 회로(I2C)를 지원합니다. I2C는 저속 주변 장치를 마이크로 컨트롤러에 연결하는 직렬 버스입니다. I2C는 master 디바이스가 하위 디바이스 집합을 제어하는 다중 master/다중 하위 모델을 사용합니다. I2C는 컨트롤, 전원 스위치 및 센서 설정과 같은 마이크로 컨트롤러와의 간단한 경량 통신만 필요한 주변 장치와 함께 사용되는 경우가 많습니다.
애플리케이션은 Applibs I2C API를 호출하여 I2C master 인터페이스에서 작업을 수행하여 I2C를 통해 주변 장치에 액세스할 수 있습니다. LSM6DS3 I2C 샘플에서는 MT3620 디바이스에서 I2C용 하드웨어를 구성하고 애플리케이션에서 I2C를 사용하는 방법을 설명합니다.
I2C 요구 사항
I2C를 사용하는 애플리케이션은 I2C에 적합한 헤더 파일을 포함하고 애플리케이션 매니페스트에 I2C 설정을 추가해야 합니다.
모든 애플리케이션은 대상 하드웨어를 설정하고 해당 하드웨어 정의 헤더 파일을 포함해야 합니다.
헤더 파일
#define I2C_STRUCTS_VERSION 1
#include <applibs/i2c.h>
#include "path-to-your-target-hardware.h"
I2C_STRUCTS_VERSION
헤더 파일을 포함하기 전에 전처리기 정의를 선언합니다. 애플리케이션에서 사용하는 구조체 버전을 지정합니다.
"path-to-your-target-hardware.h"를 하드웨어의 헤더 파일 경로로 바꿉니다.
애플리케이션 매니페스트 설정
I2C API를 사용하려면 애플리케이션 매니페스트에 I2cMaster
기능을 추가한 다음 각 I2C master 인터페이스를 기능에 추가해야 합니다. 이렇게 하면 애플리케이션이 인터페이스에 액세스할 수 있습니다.
Azure Sphere 애플리케이션 매니페스트에는 애플리케이션 매니페스트 에 대한 자세한 내용이 있습니다.
코드에서 하드웨어에 대해 정의된 상수를 사용하여 I2C 인터페이스를 식별합니다. 컴파일러는 앱을 빌드할 때 이러한 값을 원시 값으로 변환합니다.
예를 들어 MT3620 RDB(참조 개발 보드)를 대상으로 하고 두 개의 I2C master 인터페이스를 구성하는 애플리케이션 매니페스트에서 발췌한 내용은 다음과 같습니다.
"I2cMaster": [ "$MT3620_RDB_HEADER2_ISU0_I2C", "$MT3620_RDB_HEADER4_ISU1_I2C" ],
다음 발췌문에서는 Avnet MT3620 시작 키트를 대상으로 하는 애플리케이션에서 동일한 I2C master 인터페이스를 지정하는 방법을 보여 줍니다.
"I2cMaster": [ "$AVNET_MT3620_SK_ISU0_I2C", "$AVNET_MT3620_SK_ISU1_I2C" ]
I2C master 인터페이스 열기
I2C master 인터페이스에서 작업을 수행하기 전에 I2CMaster_Open 함수를 호출하여 열어야 합니다.
I2C master 인터페이스에 대한 설정 업데이트
master 인터페이스를 연 후 설정을 변경할 수 있습니다.
- master 인터페이스에서 작업의 버스 속도를 변경하려면 I2CMaster_SetBusSpeed
- 작업에 대한 시간 제한을 변경하려면 I2CMaster_SetTimeout
I2C master 인터페이스에서 읽기 및 쓰기 작업 수행
Azure Sphere는 I2C를 사용하여 읽기 및 쓰기 작업을 수행하기 위한 몇 가지 옵션을 지원합니다. 이러한 옵션은 모두 차단, 동기 작업입니다.
단방향 쓰기 또는 읽기 작업의 경우 I2CMaster_Write 또는 I2CMaster_Read 호출할 수 있습니다. 이는 하나의 작업만 지정하고 함수 호출에 하위 디바이스의 주소를 포함하기 때문에 I2C master 인터페이스에서 작업을 수행하는 가장 간단한 방법입니다.
I2CMaster_WriteThenRead 호출하여 다른 트랜잭션의 중단 없이 단일 버스 트랜잭션에서 결합된 쓰기를 수행한 다음 읽기 작업을 수행할 수 있습니다.
일부 POSIX 인터페이스와의 상호 운용성을 위해 POSIX read(2) 및 write(2) 함수를 호출하여 단방향 트랜잭션을 수행할 수 있습니다. read(2) 또는 write(2)를 호출하기 전에 I2CMaster_SetDefaultTargetAddress 호출하여 하위 디바이스의 주소를 설정해야 합니다.
이러한 함수를 호출하여 하위 디바이스가 있는지 확인하기 위해 0 바이트 쓰기 작업을 수행할 수 있습니다. 읽기 또는 쓰기 작업이 실패하면 애플리케이션에서 요청 재발행을 처리해야 합니다.
I2C 인터페이스 닫기
인터페이스를 닫려면 표준 POSIX 함수 close()를 호출해야 합니다.
MT3620 지원
이 섹션에서는 MT3620에서 Azure Sphere를 실행할 때만 적용되는 I2C 옵션에 대해 설명합니다.
MT3620 칩에 대한 I2C 사양은 MT3620 지원 상태에 나열됩니다. MT3620 개발 보드 사용자 가이드에서는 배선에 대한 핀 레이아웃 및 기능을 설명합니다.
Microsoft Azure Sphere SDK 설치 디렉터리의 HardwareDefinitions 폴더에는 일반적인 Azure Sphere 개발 보드, 모듈 및 칩에 대한 정의가 포함되어 있습니다. 여기에는 다른 MT3620 하드웨어와 함께 MT3620, MT3620 RDB에 대한 master 인터페이스를 정의하는 헤더 및 JSON 파일이 포함되어 있습니다. HardwareDefinitions 폴더의 기본 위치는 C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions
Windows 및 /opt/azurespheresdk/HardwareDefinitions
Linux에 있습니다.
- MT3620 개발 보드를 구성할 때 모든 ISU 포트를 I2C master 인터페이스로 사용할 수 있습니다. ISU 포트를 I2C master 인터페이스로 사용하는 경우 SPI 또는 UART 인터페이스와 동일한 포트를 사용할 수 없습니다.
- MT3620에서는 10비트 하위 디바이스 주소가 지원되지 않습니다. 7비트 주소만 지원됩니다.
- MT3620은 100KHz, 400KHz 및 1MHz 버스 속도를 지원하지만 3.4Mhz는 지원하지 않습니다.
- MT3620에서는 0 바이트 I2C 읽기가 지원되지 않습니다.
- 상위 수준 애플리케이션에서 I2C를 사용하는 경우 ISU 주변 장치 블록의 SCL 및 SDA 핀만 I2C 주변 장치에서 사용되며 다른 핀은 동일한 상위 수준 애플리케이션에서 GPIO로 사용할 수 있습니다. GPIO에 재사용할 수 있는 사용되지 않는 ISU 핀 목록은 I/O 주변 장치를 참조하세요.