คลาส I2C -- โปรโตคอลอนุกรมแบบสองสาย

I2C เป็นโปรโตคอลสองสายสำหรับการสื่อสารระหว่างอุปกรณ์ ในระดับฟิสิคัลประกอบด้วยสองสาย ได้แก่ 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)

สร้างออบเจ็กต์ I2C บน bus ที่กำหนด (ดัชนีอุปกรณ์ต่อพ่วงเป็นจำนวนเต็ม เช่น 2 สำหรับ I2C2) หากไม่มีพารามิเตอร์เพิ่มเติม ออบเจ็กต์จะถูกสร้างแต่ไม่ได้เริ่มต้น (จะคงค่าการตั้งค่าบัสก่อนหน้าหากมี) หากมีอาร์กิวเมนต์เพิ่มเติม บัสจะถูกเริ่มต้น ดู init() สำหรับพารามิเตอร์ที่ใช้ได้

I2C(2) เชื่อมต่อกับพินหัวต่อเดียวกันบน OpenMV Cam ทุกรุ่นที่เปิดเผย pyb.I2C (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 ด้วยพารามิเตอร์ที่กำหนด:

  • mode ต้องเป็น I2C.CONTROLLER หรือ I2C.PERIPHERAL

  • addr คือที่อยู่ 7 บิต (เหมาะสำหรับอุปกรณ์ต่อพ่วงเท่านั้น)

  • baudrate คืออัตราสัญญาณนาฬิกา SCL (เหมาะสำหรับตัวควบคุมเท่านั้น)

  • gencall คือว่าจะรองรับโหมด general-call หรือไม่

  • dma คือว่าจะอนุญาตให้ใช้ DMA สำหรับการถ่ายโอน I2C หรือไม่ (โปรดทราบว่าการถ่ายโอน 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_size เลือกความกว้างของ memaddr: 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]

สแกนที่อยู่ I2C ทั้งหมดตั้งแต่ 0x01 ถึง 0x7f และคืนค่ารายการที่ตอบสนอง ใช้ได้เฉพาะในโหมดตัวควบคุมเท่านั้น

ค่าคงที่

CONTROLLER: int

เริ่มต้นบัสเป็น master (ตัวควบคุม) -- มันขับ SCL และเริ่มต้นธุรกรรม

PERIPHERAL: int

เริ่มต้นบัสเป็น slave (อุปกรณ์ต่อพ่วง) ที่รับฟังบน addr ที่ตั้งไว้ใน init() และตอบสนองต่อธุรกรรมที่เริ่มต้นโดยตัวควบคุมบนบัสเดียวกัน