class I2C – פרוטוקול טורי דו-חוטי¶
I2C הוא פרוטוקול דו-חוטי לתקשורת בין התקנים. ברמה הפיזית הוא מורכב משני קווים, SCL (שעון) ו-SDA (נתונים). ה-OpenMV Cam אינה מספקת נגדי משיכה (pull-up) על הלוח לאף אחד מהקווים – נדרשים נגדי משיכה חיצוניים על שני הקווים 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
ניתן לציין פסק זמן (timeout, ב-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):אות
פין מחבר (header)
הערות
SCLP4SDAP5I2C(4)זמין בנוסף ב-OpenMV Cam M7, H7, H7 Plus ו-Pure Thermal עםSCLעל פין מחברP7ו-SDAעל פין מחברP8.ה-OpenMV 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.PERIPHERAL.addrהיא הכתובת בת 7 הביט (הגיונית רק עבור התקן היקפי).baudrateהוא קצב שעון ה-SCL (הגיוני רק עבור בקר).gencallהוא האם לתמוך במצב קריאה כללית (general-call).dmaהוא האם לאפשר שימוש ב-DMA עבור העברות ה-I2C (שימו לב שהעברות DMA בעלות תזמון מדויק יותר אך כרגע אינן מטפלות כראוי בשגיאות אפיק).
תדר השעון בפועל עשוי להיות נמוך מהתדר המבוקש. הדבר תלוי בחומרת הפלטפורמה. ניתן לקבוע את הקצב בפועל על ידי הדפסת אובייקט ה-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היא כתובת התקן ה-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.
קבועים¶