الفئة 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):

الإشارة

دبوس الترويسة

ملاحظات

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 يحدد ما إذا كان يجب دعم وضع النداء العام.

  • 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

تهيئة الناقل كسيّد (متحكم) -- فهو يقود SCL ويبدأ المعاملات.

PERIPHERAL: int

تهيئة الناقل كتابع (طرفية) يستمع على العنوان addr المضبوط في init() ويستجيب للمعاملات التي يبدأها متحكم على الناقل نفسه.