คลาส 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):สัญญาณ
พินหัวต่อ
หมายเหตุ
SCLP4SDAP5I2C(4)ยังมีให้ใช้งานบน OpenMV Cam M7, H7, H7 Plus และ Pure Thermal โดยมีSCLบนพินหัวต่อP7และSDAบนพินหัวต่อP8OpenMV Cam N6 ไม่เปิดเผย
pyb.I2C; ใช้machine.I2Cแทนเมธอด¶
- init(mode: int, *, addr: int = 0x12, baudrate: int = 400000, gencall: bool = False, dma: bool = False) None¶
เริ่มต้นบัส I2C ด้วยพารามิเตอร์ที่กำหนด:
modeต้องเป็นI2C.CONTROLLERหรือI2C.PERIPHERALaddrคือที่อยู่ 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คือที่อยู่อุปกรณ์ I2Cmemaddrคือตำแหน่งหน่วยความจำภายในอุปกรณ์ I2Ctimeoutคือค่าหมดเวลาเป็นมิลลิวินาทีในการรอการอ่าน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คือที่อยู่อุปกรณ์ I2Cmemaddrคือตำแหน่งหน่วยความจำภายในอุปกรณ์ I2Ctimeoutคือค่าหมดเวลาเป็นมิลลิวินาทีในการรอการเขียนaddr_sizeเลือกความกว้างของmemaddr: 8 หรือ 16 บิต
ใช้ได้เฉพาะในโหมดตัวควบคุมเท่านั้น
- recv(recv: int | bytearray, addr: int = 0x00, *, timeout: int = 5000) bytes¶
รับข้อมูลบนบัส:
recvสามารถเป็นจำนวนเต็ม ซึ่งเป็นจำนวนไบต์ที่จะรับ หรือบัฟเฟอร์ที่แก้ไขได้ซึ่งจะถูกเติมด้วยไบต์ที่รับได้addrคือที่อยู่ที่จะรับจาก (ต้องระบุเฉพาะในโหมดตัวควบคุม)timeoutคือค่าหมดเวลาเป็นมิลลิวินาทีในการรอการรับ
ค่าที่คืน: หาก
recvเป็นจำนวนเต็ม จะคืนค่าบัฟเฟอร์ใหม่ของไบต์ที่รับได้ มิฉะนั้นจะคืนค่าบัฟเฟอร์เดิมที่ถูกส่งเข้ามาในrecv
ค่าคงที่¶