الصنف I2CTarget -- جهاز هدف I2C

هدف I2C هو جهاز يتصل بناقل I2C ويتحكم فيه متحكم I2C. يمكن أن تتخذ أهداف I2C أشكالاً عديدة. يطبّق الصنف machine.I2CTarget هدف I2C يمكن تكوينه كجهاز ذاكرة/سجلات، أو كجهاز I2C اعتباطي باستخدام دوال رد النداء (إذا كان المنفذ يدعم ذلك).

متوفر على OpenMV Cam M4 / M7 / H7 / H7 Plus / Pure Thermal / RT1062 / AE3.

مثال على الاستخدام في حالة جهاز الذاكرة:

from machine import I2CTarget

# Create the backing memory for the I2C target.
mem = bytearray(8)

# Create an I2C target.  Depending on the port, extra parameters
# may be required to select the peripheral and/or pins to use.
i2c = I2CTarget(addr=67, mem=mem)

# At this point an I2C controller can read and write `mem`.
...

# Deinitialise the I2C target.
i2c.deinit()

لاحظ أن بعض المنافذ تتطلب تمرير id، وربما دبوسي scl و sda، إلى مُنشئ I2CTarget لتحديد نسخة عتاد I2C والدبابيس التي يتصل بها.

عند تكوينه كجهاز ذاكرة، من الممكن أيضاً التسجيل لاستقبال الأحداث. على سبيل المثال للإشعار عند قراءة/كتابة الذاكرة:

from machine import I2CTarget

# Define an IRQ handler, for I2C events.
def irq_handler(i2c_target):
    flags = i2c_target.irq().flags()
    if flags & I2CTarget.IRQ_END_READ:
        print("controller read target at addr", i2c_target.memaddr)
    if flags & I2CTarget.IRQ_END_WRITE:
        print("controller wrote target at addr", i2c_target.memaddr)

# Create the I2C target and register to receive default events.
mem = bytearray(8)
i2c = I2CTarget(addr=67, mem=mem)
i2c.irq(irq_handler)

يمكن تطبيق أجهزة I2C أكثر تعقيداً باستخدام المجموعة الكاملة من الأحداث. على سبيل المثال، لرؤية الأحداث الخام أثناء إطلاقها:

from machine import I2CTarget

# Define an IRQ handler that prints the event id and responds to reads/writes.
def irq_handler(i2c_target, buf=bytearray(1)):
    flags = i2c_target.irq().flags()
    print(flags)
    if flags & I2CTarget.IRQ_READ_REQ:
        i2c_target.write(buf)
    if flags & I2CTarget.IRQ_WRITE_REQ:
        i2c_target.readinto(buf)

# Create the I2C target and register to receive all events.
i2c = I2CTarget(addr=67)
all_triggers = (
    I2CTarget.IRQ_ADDR_MATCH_READ
    | I2CTarget.IRQ_ADDR_MATCH_WRITE
    | I2CTarget.IRQ_READ_REQ
    | I2CTarget.IRQ_WRITE_REQ
    | I2CTarget.IRQ_END_READ
    | I2CTarget.IRQ_END_WRITE
)
i2c.irq(irq_handler, trigger=all_triggers, hard=True)

المُنشئات

class machine.I2CTarget(id: int, addr: int, *, addrsize: int = 7, mem: bytearray | None = None, mem_addrsize: int = 8, scl: Pin | None = None, sda: Pin | None = None)

أنشئ وأعد كائن I2CTarget جديداً باستخدام المعاملات التالية:

  • id يحدد طرفية I2C معينة. تعتمد القيم المسموح بها على المنفذ/اللوحة المحددة. لبعض المنافذ قيمة افتراضية وفي هذه الحالة يمكن حذف هذا المعامل.

  • addr هو عنوان I2C للهدف.

  • addrsize هو عدد البتات في عنوان هدف I2C. القيم الصالحة هي 7 و 10.

  • mem هو كائن يدعم بروتوكول المخزن المؤقت وقابل للكتابة. إذا لم يُحدد فلا توجد ذاكرة داعمة ويجب قراءة/كتابة البيانات باستخدام الطريقتين I2CTarget.readinto() و I2CTarget.write().

  • mem_addrsize هو عدد البتات في عنوان الذاكرة. القيم الصالحة هي 0 و 8 و 16 و 24 و 32.

  • scl هو كائن دبوس يحدد الدبوس المستخدم لـ SCL.

  • sda هو كائن دبوس يحدد الدبوس المستخدم لـ SDA.

لاحظ أن بعض المنافذ/اللوحات سيكون لها قيم افتراضية لـ scl و sda يمكن تغييرها في هذا المُنشئ. وسيكون لأخرى قيم ثابتة لـ scl و sda لا يمكن تغييرها.

الطرق العامة

deinit() None

أنهِ تهيئة هدف I2C. بعد استدعاء هذه الطريقة لن يستجيب العتاد بعد الآن للطلبات على ناقل I2C، ولا يمكن استدعاء أي طرق أخرى.

readinto(buf: bytearray) int

اقرأ إلى المخزن المؤقت المعطى أي بايتات معلّقة كتبها متحكم I2C. تُعيد عدد البايتات المقروءة.

write(buf: bytes) int

اكتب البايتات من المخزن المؤقت المعطى، لتُمرّر إلى متحكم I2C بعد أن يرسل طلب قراءة. تُعيد عدد البايتات المكتوبة. معظم المنافذ تقبل بايتاً واحداً فقط في كل مرة لهذه الطريقة.

irq(handler: Callable[[I2CTarget], None] | None = None, trigger: int = IRQ_END_READ | IRQ_END_WRITE, hard: bool = False) None

ثبّت معالج مقاطعة handler يُستدعى عند إطلاق أحد الأحداث المحددة بـ trigger. trigger هو قناع بتي من ثوابت IRQ_* مدموجة بعملية OR؛ والافتراضي يُطلَق عند نهاية كل قراءة أو كتابة من جانب المتحكم.

hard=True يسجل معالج مقاطعة صلبة (لا تخصيص للكومة في دالة رد النداء). الافتراضي هو دالة رد نداء مجدولة. مرر handler=None لتعطيل المقاطعة.

ملاحظة

IRQ_ADDR_MATCH_READ و IRQ_ADDR_MATCH_WRITE و IRQ_READ_REQ و IRQ_WRITE_REQ يجب معالجتها بواسطة دالة رد نداء مقاطعة صلبة (hard=True) لأن الأحداث يجب الإقرار بها بشكل متزامن مع العتاد. IRQ_END_READ و IRQ_END_WRITE يمكن معالجتها بواسطة دوال رد نداء ناعمة أو صلبة؛ وتتشارك جميع الأحداث معالجاً واحداً، لذا إذا احتاج أي حدث إلى دالة رد نداء صلبة فإنها جميعاً تحتاج إليها.

عند تزويد المُنشئ بمخزن ذاكرة مؤقت، يكبت المُشغّل IRQ_END_WRITE للمعاملة التي تكتب عنوان الذاكرة فقط. هذا يبقي أحداث نهاية المعاملة ذات معنى حتى عندما يؤجل مجدول المقاطعة الناعمة دالة رد النداء.

memaddr

القيمة الصحيحة لأحدث عنوان ذاكرة اختاره متحكم I2C (صالحة فقط إذا حُدد mem في المُنشئ).

الثوابت

كل ثابت IRQ_* هو بت علم. ادمجها بعملية OR لبناء قناع trigger لـ irq(). داخل المعالج يمكن استرجاع مجموعة الأحداث المُطلَقة عبر self.irq().flags() مدموجة بعملية AND مع كل ثابت.

IRQ_ADDR_MATCH_READ: int

يُطلَق عندما يخاطب متحكمٌ هذا الهدفَ لمعاملة قراءة (تم استقبال بايت العنوان مع ضبط بت القراءة/الكتابة على 1). مقاطعة صلبة فقط.

IRQ_ADDR_MATCH_WRITE: int

يُطلَق عندما يخاطب متحكمٌ هذا الهدفَ لمعاملة كتابة (تم استقبال بايت العنوان مع ضبط بت القراءة/الكتابة على 0). مقاطعة صلبة فقط.

IRQ_READ_REQ: int

يُطلَق عندما يطلب المتحكم بايتاً من الهدف. يجب على المعالج استدعاء write() لتزويد البايت قبل اكتمال دورة ساعة المتحكم. مقاطعة صلبة فقط.

IRQ_WRITE_REQ: int

يُطلَق عندما يكون المتحكم قد أدخل بايتاً إلى الهدف بنبضات الساعة. يجب على المعالج استدعاء readinto() لاسترجاع البايت قبل أن يرسل المتحكم البايت التالي. مقاطعة صلبة فقط.

IRQ_END_READ: int

يُطلَق عندما يكون المتحكم قد أنهى معاملة قراءة (استقبل STOP / بداية متكررة). يمكن معالجته بواسطة دالة رد نداء مقاطعة صلبة أو ناعمة.

IRQ_END_WRITE: int

يُطلَق عندما يكون المتحكم قد أنهى معاملة كتابة (استقبل STOP / بداية متكررة). يمكن معالجته بواسطة دالة رد نداء مقاطعة صلبة أو ناعمة. يُكبت للمعاملة التي تكتب عنوان الذاكرة عندما يُزوّد المُنشئ بمخزن mem مؤقت.