class I2C – 2선식 직렬 프로토콜¶
I2C는 장치 간 통신을 위한 2선식 프로토콜입니다. 물리 계층에서는 SCL(클록)과 SDA(데이터)의 두 라인으로 구성됩니다. OpenMV Cam은 두 라인 어느 쪽에도 온보드 풀업을 제공하지 않습니다 – 버스가 작동하려면 SCL과 SDA 모두에 외부 풀업이 필요합니다.
I2C 객체는 특정 버스에 연결되며 생성 시점에 초기화하거나 나중에 init()을 통해 초기화할 수 있습니다.
예시:
from pyb import I2C
i2c = I2C(2) # create on bus 2 (uninitialised)
i2c = I2C(2, I2C.CONTROLLER) # create and init as a controller
i2c.init(I2C.CONTROLLER, baudrate=20000) # init as a controller
i2c.init(I2C.PERIPHERAL, addr=0x42) # init as a peripheral with the given address
i2c.deinit() # turn off the peripheral
I2C 객체를 출력하면 그 구성이 표시됩니다.
기본 메서드는 send()와 recv()입니다:
i2c.send("abc") # send 3 bytes
i2c.send(0x42) # send a single byte, given by the number
data = i2c.recv(3) # receive 3 bytes
제자리에서 수신하려면 먼저 bytearray를 생성하십시오:
data = bytearray(3) # create a buffer
i2c.recv(data) # receive 3 bytes, writing them into data
타임아웃을 지정할 수 있습니다(ms 단위):
i2c.send(b"123", timeout=2000) # timeout after 2 seconds
컨트롤러는 수신자의 주소를 지정해야 합니다:
i2c.init(I2C.CONTROLLER)
i2c.send("123", 0x42) # send 3 bytes to peripheral with address 0x42
i2c.send(b"456", addr=0x42) # keyword for address
컨트롤러에는 다음 메서드도 있습니다:
# Check if peripheral 0x42 is ready.
i2c.is_ready(0x42)
# Scan the bus and return a list of responding addresses.
i2c.scan()
# Read 3 bytes from peripheral 0x42 starting at memaddr 2.
i2c.mem_read(3, 0x42, 2)
# Write 3 bytes to peripheral 0x42 at memaddr 2.
i2c.mem_write("abc", 0x42, 2, timeout=1000)
생성자¶
- class pyb.I2C(bus: int | str, *args, **kwargs)¶
주어진
bus(정수 주변장치 인덱스, 예:I2C2의 경우2)에 I2C 객체를 생성합니다. 추가 매개변수 없이 객체가 생성되지만 초기화되지는 않습니다(이전 버스 설정이 있으면 유지됨). 추가 인수가 주어지면 버스가 초기화됩니다. 사용 가능한 매개변수는init()을 참조하십시오.I2C(2)는pyb.I2C를 제공하는 모든 OpenMV Cam(M4 / M7 / H7 / H7 Plus / Pure Thermal)에서 동일한 헤더 핀에 연결되어 있습니다:신호
헤더 핀
비고
SCLP4SDAP5I2C(4)는 OpenMV Cam M7, H7, H7 Plus, Pure Thermal에서SCL이 헤더 핀P7에,SDA가 헤더 핀P8에 있는 형태로 추가로 사용할 수 있습니다.OpenMV Cam N6는
pyb.I2C를 제공하지 않습니다. 대신machine.I2C를 사용하십시오.메서드¶
- init(mode: int, *, addr: int = 0x12, baudrate: int = 400000, gencall: bool = False, dma: bool = False) None¶
주어진 매개변수로 I2C 버스를 초기화합니다:
mode는I2C.CONTROLLER또는I2C.PERIPHERAL중 하나여야 합니다.addr은 7비트 주소입니다(주변장치에만 의미가 있음).baudrate는 SCL 클록 속도입니다(컨트롤러에만 의미가 있음).gencall은 일반 호출(general-call) 모드 지원 여부입니다.dma는 I2C 전송에 DMA 사용을 허용할지 여부입니다(DMA 전송은 더 정밀한 타이밍을 가지지만 현재 버스 오류를 제대로 처리하지 못한다는 점에 유의하십시오).
실제 클록 주파수는 요청된 주파수보다 낮을 수 있습니다. 이는 플랫폼 하드웨어에 따라 다릅니다. 실제 속도는 I2C 객체를 출력하여 확인할 수 있습니다.
- mem_read(data: int | bytearray, addr: int, memaddr: int, *, timeout: int = 5000, addr_size: int = 8) bytes¶
I2C 장치의 메모리에서 읽습니다:
data는 정수(읽을 바이트 수)이거나 읽어들일 버퍼일 수 있습니다addr은 I2C 장치 주소입니다memaddr은 I2C 장치 내의 메모리 위치입니다timeout은 읽기를 기다리는 밀리초 단위의 타임아웃입니다addr_size는 memaddr의 폭을 선택합니다: 8비트 또는 16비트
읽은 데이터를 반환합니다. 이는 컨트롤러 모드에서만 유효합니다.
- mem_write(data: int | bytes | bytearray, addr: int, memaddr: int, *, timeout: int = 5000, addr_size: int = 8) None¶
I2C 장치의 메모리에 씁니다:
data는 정수이거나 기록할 버퍼일 수 있습니다.addr은 I2C 장치 주소입니다.memaddr은 I2C 장치 내의 메모리 위치입니다.timeout은 쓰기를 기다리는 밀리초 단위의 타임아웃입니다.addr_size는memaddr의 폭을 선택합니다: 8비트 또는 16비트.
컨트롤러 모드에서만 유효합니다.
- recv(recv: int | bytearray, addr: int = 0x00, *, timeout: int = 5000) bytes¶
버스에서 데이터를 수신합니다:
recv는 수신할 바이트 수인 정수이거나, 수신된 바이트로 채워질 가변 버퍼일 수 있습니다addr은 수신할 주소입니다(컨트롤러 모드에서만 필요)timeout은 수신을 기다리는 밀리초 단위의 타임아웃입니다
반환 값:
recv가 정수이면 수신된 바이트의 새 버퍼이고, 그렇지 않으면recv에 전달된 동일한 버퍼입니다.
상수¶