class I2CTarget – I2C 타깃 장치

I2C 타깃은 I2C 버스에 연결되어 I2C 컨트롤러에 의해 제어되는 장치입니다. I2C 타깃은 여러 형태를 취할 수 있습니다. machine.I2CTarget 클래스는 메모리/레지스터 장치로 구성하거나, (포트가 지원하는 경우) 콜백을 사용하여 임의의 I2C 장치로 구성할 수 있는 I2C 타깃을 구현합니다.

OpenMV Cam M4 / M7 / H7 / H7 Plus / Pure Thermal / RT1062 / AE3에서 사용할 수 있습니다.

메모리 장치의 경우 사용 예시:

from machine import I2CTarget

# Create the backing memory for the I2C target.
mem = bytearray(8)

# Create an I2C target.  Depending on the port, extra parameters
# may be required to select the peripheral and/or pins to use.
i2c = I2CTarget(addr=67, mem=mem)

# At this point an I2C controller can read and write `mem`.
...

# Deinitialise the I2C target.
i2c.deinit()

일부 포트에서는 연결할 하드웨어 I2C 인스턴스와 핀을 선택하기 위해 I2CTarget 생성자에 id, 그리고 경우에 따라 sclsda 핀을 전달해야 합니다.

메모리 장치로 구성된 경우, 이벤트를 수신하도록 등록할 수도 있습니다. 예를 들어 메모리가 읽히거나 쓰일 때 알림을 받으려면:

from machine import I2CTarget

# Define an IRQ handler, for I2C events.
def irq_handler(i2c_target):
    flags = i2c_target.irq().flags()
    if flags & I2CTarget.IRQ_END_READ:
        print("controller read target at addr", i2c_target.memaddr)
    if flags & I2CTarget.IRQ_END_WRITE:
        print("controller wrote target at addr", i2c_target.memaddr)

# Create the I2C target and register to receive default events.
mem = bytearray(8)
i2c = I2CTarget(addr=67, mem=mem)
i2c.irq(irq_handler)

더 복잡한 I2C 장치는 전체 이벤트 집합을 사용하여 구현할 수 있습니다. 예를 들어 이벤트가 발생할 때 원시 이벤트를 확인하려면:

from machine import I2CTarget

# Define an IRQ handler that prints the event id and responds to reads/writes.
def irq_handler(i2c_target, buf=bytearray(1)):
    flags = i2c_target.irq().flags()
    print(flags)
    if flags & I2CTarget.IRQ_READ_REQ:
        i2c_target.write(buf)
    if flags & I2CTarget.IRQ_WRITE_REQ:
        i2c_target.readinto(buf)

# Create the I2C target and register to receive all events.
i2c = I2CTarget(addr=67)
all_triggers = (
    I2CTarget.IRQ_ADDR_MATCH_READ
    | I2CTarget.IRQ_ADDR_MATCH_WRITE
    | I2CTarget.IRQ_READ_REQ
    | I2CTarget.IRQ_WRITE_REQ
    | I2CTarget.IRQ_END_READ
    | I2CTarget.IRQ_END_WRITE
)
i2c.irq(irq_handler, trigger=all_triggers, hard=True)

생성자

class machine.I2CTarget(id: int, addr: int, *, addrsize: int = 7, mem: bytearray | None = None, mem_addrsize: int = 8, scl: Pin | None = None, sda: Pin | None = None)

다음 매개변수를 사용하여 새 I2CTarget 객체를 생성하고 반환합니다:

  • id 는 특정 I2C 주변장치를 식별합니다. 허용되는 값은 특정 포트/보드에 따라 다릅니다. 일부 포트에는 기본값이 있어 이 매개변수를 생략할 수 있습니다.

  • addr 은 타깃의 I2C 주소입니다.

  • addrsize 는 I2C 타깃 주소의 비트 수입니다. 유효한 값은 7과 10입니다.

  • mem 은 쓰기가 가능한 버퍼 프로토콜을 가진 객체입니다. 지정하지 않으면 백업 메모리가 없으며, I2CTarget.readinto()I2CTarget.write() 메서드를 사용하여 데이터를 읽고 써야 합니다.

  • mem_addrsize 는 메모리 주소의 비트 수입니다. 유효한 값은 0, 8, 16, 24, 32입니다.

  • scl 은 SCL에 사용할 핀을 지정하는 핀 객체입니다.

  • sda 는 SDA에 사용할 핀을 지정하는 핀 객체입니다.

일부 포트/보드에는 sclsda 의 기본값이 있으며 이 생성자에서 변경할 수 있습니다. 다른 포트/보드에는 변경할 수 없는 고정된 sclsda 값이 있습니다.

일반 메서드

deinit() None

I2C 타깃을 해제합니다. 이 메서드를 호출한 후에는 하드웨어가 더 이상 I2C 버스의 요청에 응답하지 않으며, 다른 메서드를 호출할 수 없습니다.

readinto(buf: bytearray) int

I2C 컨트롤러가 쓴 대기 중인 바이트를 주어진 버퍼로 읽어 들입니다. 읽은 바이트 수를 반환합니다.

write(buf: bytes) int

I2C 컨트롤러가 읽기 요청을 보낸 후 전달될, 주어진 버퍼의 바이트를 씁니다. 쓴 바이트 수를 반환합니다. 대부분의 포트는 이 메서드에 한 번에 한 바이트만 허용합니다.

irq(handler: Callable[[I2CTarget], None] | None = None, trigger: int = IRQ_END_READ | IRQ_END_WRITE, hard: bool = False) None

trigger 로 선택된 이벤트 중 하나가 발생할 때 호출되는 IRQ handler 를 설치합니다. trigger 는 OR로 결합된 IRQ_* 상수의 비트마스크입니다. 기본값은 컨트롤러 측의 모든 읽기 또는 쓰기가 끝날 때 발생합니다.

hard=True 는 하드 인터럽트 핸들러(콜백에서 힙 할당 없음)를 등록합니다. 기본값은 스케줄된 콜백입니다. 인터럽트를 비활성화하려면 handler=None 을 전달하세요.

참고

IRQ_ADDR_MATCH_READ, IRQ_ADDR_MATCH_WRITE, IRQ_READ_REQ, IRQ_WRITE_REQ 는 이벤트가 하드웨어와 동기적으로 확인되어야 하므로 하드 IRQ 콜백(hard=True)으로 처리해야 합니다. IRQ_END_READIRQ_END_WRITE 는 소프트 또는 하드 콜백 중 어느 것으로도 처리할 수 있습니다. 모든 이벤트가 하나의 핸들러를 공유하므로, 어느 한 이벤트가 하드 콜백을 필요로 하면 모든 이벤트가 하드 콜백을 필요로 합니다.

메모리 버퍼가 생성자에 제공되면 드라이버는 메모리 주소만 쓰는 트랜잭션에 대해 IRQ_END_WRITE 를 억제합니다. 이렇게 하면 소프트 IRQ 스케줄러가 콜백을 지연시키더라도 트랜잭션 종료 이벤트가 의미 있게 유지됩니다.

memaddr

I2C 컨트롤러가 선택한 가장 최근 메모리 주소의 정수 값입니다(생성자에서 mem 이 지정된 경우에만 유효).

상수

IRQ_* 상수는 플래그 비트입니다. 이들을 OR로 결합하여 irq() 를 위한 trigger 마스크를 만듭니다. 핸들러 내부에서는 self.irq().flags() 를 각 상수와 AND 연산하여 발생한 이벤트 집합을 복구할 수 있습니다.

IRQ_ADDR_MATCH_READ: int

컨트롤러가 읽기 트랜잭션을 위해 이 타깃을 주소 지정할 때 발생합니다(읽기/쓰기 비트가 1 로 설정된 주소 바이트가 수신됨). 하드 IRQ 전용.

IRQ_ADDR_MATCH_WRITE: int

컨트롤러가 쓰기 트랜잭션을 위해 이 타깃을 주소 지정할 때 발생합니다(읽기/쓰기 비트가 0 으로 설정된 주소 바이트가 수신됨). 하드 IRQ 전용.

IRQ_READ_REQ: int

컨트롤러가 타깃에 바이트를 요청할 때 발생합니다. 핸들러는 컨트롤러의 클럭 주기가 완료되기 전에 write() 를 호출하여 바이트를 공급해야 합니다. 하드 IRQ 전용.

IRQ_WRITE_REQ: int

컨트롤러가 타깃에 바이트를 클럭인했을 때 발생합니다. 핸들러는 컨트롤러가 다음 바이트를 보내기 전에 readinto() 를 호출하여 바이트를 가져와야 합니다. 하드 IRQ 전용.

IRQ_END_READ: int

컨트롤러가 읽기 트랜잭션을 완료했을 때(STOP / 반복 START 수신) 발생합니다. 하드 또는 소프트 IRQ 콜백 중 어느 것으로도 처리할 수 있습니다.

IRQ_END_WRITE: int

컨트롤러가 쓰기 트랜잭션을 완료했을 때(STOP / 반복 START 수신) 발생합니다. 하드 또는 소프트 IRQ 콜백 중 어느 것으로도 처리할 수 있습니다. 생성자에 mem 버퍼가 제공된 경우 메모리 주소를 쓰는 트랜잭션에 대해서는 억제됩니다.