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 값이 있습니다.
일반 메서드¶
- 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로 선택된 이벤트 중 하나가 발생할 때 호출되는 IRQhandler를 설치합니다.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 전용.