class I2C – 2선식 직렬 프로토콜

I2C는 장치 간 통신을 위한 2선식 프로토콜입니다. 물리 계층에서는 SCL(클록)과 SDA(데이터)의 두 라인으로 구성됩니다. OpenMV Cam은 두 라인 어느 쪽에도 온보드 풀업을 제공하지 않습니다 – 버스가 작동하려면 SCLSDA 모두에 외부 풀업이 필요합니다.

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)에서 동일한 헤더 핀에 연결되어 있습니다:

신호

헤더 핀

비고

SCL

P4

SDA

P5

I2C(4)는 OpenMV Cam M7, H7, H7 Plus, Pure Thermal에서 SCL이 헤더 핀 P7에, SDA가 헤더 핀 P8에 있는 형태로 추가로 사용할 수 있습니다.

OpenMV Cam N6는 pyb.I2C를 제공하지 않습니다. 대신 machine.I2C를 사용하십시오.

메서드

deinit() None

I2C 버스를 끕니다.

init(mode: int, *, addr: int = 0x12, baudrate: int = 400000, gencall: bool = False, dma: bool = False) None

주어진 매개변수로 I2C 버스를 초기화합니다:

  • modeI2C.CONTROLLER 또는 I2C.PERIPHERAL 중 하나여야 합니다.

  • addr은 7비트 주소입니다(주변장치에만 의미가 있음).

  • baudrate는 SCL 클록 속도입니다(컨트롤러에만 의미가 있음).

  • gencall은 일반 호출(general-call) 모드 지원 여부입니다.

  • dma는 I2C 전송에 DMA 사용을 허용할지 여부입니다(DMA 전송은 더 정밀한 타이밍을 가지지만 현재 버스 오류를 제대로 처리하지 못한다는 점에 유의하십시오).

실제 클록 주파수는 요청된 주파수보다 낮을 수 있습니다. 이는 플랫폼 하드웨어에 따라 다릅니다. 실제 속도는 I2C 객체를 출력하여 확인할 수 있습니다.

is_ready(addr: int) bool

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_sizememaddr의 폭을 선택합니다: 8비트 또는 16비트.

컨트롤러 모드에서만 유효합니다.

recv(recv: int | bytearray, addr: int = 0x00, *, timeout: int = 5000) bytes

버스에서 데이터를 수신합니다:

  • recv는 수신할 바이트 수인 정수이거나, 수신된 바이트로 채워질 가변 버퍼일 수 있습니다

  • addr은 수신할 주소입니다(컨트롤러 모드에서만 필요)

  • timeout은 수신을 기다리는 밀리초 단위의 타임아웃입니다

반환 값: recv가 정수이면 수신된 바이트의 새 버퍼이고, 그렇지 않으면 recv에 전달된 동일한 버퍼입니다.

send(send: int | bytes | bytearray, addr: int = 0x00, *, timeout: int = 5000) None

버스에서 데이터를 전송합니다:

  • send는 전송할 데이터입니다(전송할 정수, 또는 버퍼 객체).

  • addr은 전송할 주소입니다(컨트롤러 모드에서만 필요).

  • timeout은 전송을 기다리는 밀리초 단위의 타임아웃입니다.

scan() List[int]

0x01부터 0x7f까지의 모든 I2C 주소를 스캔하고 응답하는 주소의 목록을 반환합니다. 컨트롤러 모드에서만 유효합니다.

상수

CONTROLLER: int

버스를 마스터(컨트롤러)로 초기화합니다 – SCL을 구동하고 트랜잭션을 시작합니다.

PERIPHERAL: int

버스를 init()에서 설정한 addr을 수신 대기하고 동일한 버스의 컨트롤러가 시작한 트랜잭션에 응답하는 슬레이브(주변장치)로 초기화합니다.