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, 그리고 경우에 따라 scl 과 sda 핀을 전달해야 합니다.

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

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에 사용할 핀을 지정하는 핀 객체입니다.

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

일반 메서드#

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_READ 와 IRQ_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 버퍼가 제공된 경우 메모리 주소를 쓰는 트랜잭션에 대해서는 억제됩니다.