الفئة 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
يمكنك تحديد مهلة (بالملي ثانية):
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على دبوس الترويسة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يحدد ما إذا كان يجب دعم وضع النداء العام.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هو عنوان جهاز 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.
الثوابت¶