الصنف SPI -- بروتوكول تسلسلي تقوده وحدة تحكم

إن SPI بروتوكول تسلسلي متزامن تقوده وحدة تحكم. على المستوى الفيزيائي يستخدم ثلاثة خطوط (SCK، MOSI، MISO) إضافةً إلى خط اختيار شريحة لكل طرفية.

الاستخدام مشابه لـ I2C؛ والفرق الرئيسي هو المعاملات المُمررة عند تهيئة الناقل:

from pyb import SPI
spi = SPI(2, SPI.CONTROLLER, baudrate=600000, polarity=1, phase=0, crc=0x7)

المعامل الوحيد المطلوب هو mode (SPI.CONTROLLER أو SPI.PERIPHERAL). إن polarity هو مستوى الخمول لـ SCK (0 أو 1). تحدد phase ما إذا كانت البيانات تؤخذ عيناتها عند حافة الساعة الأولى (0) أو الثانية (1). أما crc فهي إما None (دون CRC) أو متعدد حدود CRC.

نقل البيانات:

data = spi.send_recv(b"1234")        # send 4 bytes and receive 4 bytes
buf = bytearray(4)
spi.send_recv(b"1234", buf)          # send 4 bytes and receive 4 into buf
spi.send_recv(buf, buf)              # send/receive 4 bytes through buf

المُنشئات

class pyb.SPI(bus: int | str, *args, **kwargs)

إنشاء كائن SPI على الناقل bus المحدد (فهرس صحيح لطرفية SPI، مثلاً 2 لـ SPI2). بدون معاملات إضافية يُنشأ الكائن لكنه لا يُهيأ (يحتفظ بإعدادات الناقل السابقة إن وُجدت)؛ وإذا قُدمت وسائط إضافية فإن الناقل يُهيأ بها. راجع init() للاطلاع على المعاملات المتاحة.

إن SPI(2) موصول بدبابيس الترويسة نفسها على كل كاميرات STM32 OpenMV Cam؛ بينما تكشف OpenMV Cam N6 إضافيًا عن SPI(4):

الناقل

NSS

SCK

MISO

MOSI

SPI(2) (جميع كاميرات STM32 OpenMV Cam)

P3

P2

P1

P0

SPI(4) (OpenMV Cam N6 فقط)

P15

P16

P17

P18

إن NSS ليس مقادًا من طرفية SPI على أي من الناقلين؛ فهو متاح للاستخدام كاختيار شريحة GPIO عادي.

الطرق

deinit() None

إيقاف ناقل SPI.

init(mode: int, baudrate: int = 328125, *, prescaler: int = -1, polarity: int = 1, phase: int = 0, bits: int = 8, firstbit: int = SPI.MSB, ti: bool = False, crc: int | None = None) None

تهيئة ناقل SPI بالمعاملات المحددة:

  • يجب أن تكون mode إما SPI.CONTROLLER أو SPI.PERIPHERAL.

  • إن baudrate هو معدل ساعة SCK (وهو منطقي فقط لوحدة التحكم).

  • إن prescaler هو المقسّم المسبق المستخدم لاشتقاق SCK من تردد ناقل APB؛ ويتجاوز استخدام prescaler قيمة baudrate.

  • يمكن أن تكون polarity 0 أو 1، وهي المستوى الذي يستقر عنده خط الساعة في حالة الخمول.

  • يمكن أن تكون phase 0 أو 1 لأخذ عينات البيانات عند حافة الساعة الأولى أو الثانية على التوالي.

  • يمكن أن تكون bits 8 أو 16، وهي عدد البتات في كل كلمة منقولة.

  • يمكن أن تكون firstbit إما SPI.MSB أو SPI.LSB.

  • تشير ti بقيمة True إلى اتفاقيات إشارة Texas Instruments، خلافًا لاتفاقيات Motorola.

  • يمكن أن تكون crc None لعدم استخدام CRC، أو محدّد متعدد حدود.

قد لا يطابق تردد ساعة SPI قيمة baudrate بالضبط. لا يدعم العتاد سوى الساعات التي تساوي تردد ناقل APB الأصل مقسومًا على مقسّم مسبق من قوى العدد اثنين (2, 4, 8, 16, 32, 64, 128 أو 256)؛ ويختار المشغّل أعلى قيمة لا تتجاوز قيمة baudrate المطلوبة. إن SPI(2) على APB1. للتحكم الدقيق في الساعة، اضبط prescaler مباشرةً بدلاً من baudrate.

تُظهر طباعة كائن SPI معدل الباود المحسوب والمقسّم المسبق المختار.

recv(recv: int | bytearray, *, timeout: int = 5000) bytes

استقبال البيانات على الناقل:

  • يمكن أن تكون recv عددًا صحيحًا، وهو عدد البايتات المراد استقبالها، أو مخزنًا مؤقتًا قابلاً للتعديل، سيُملأ بالبايتات المستقبَلة.

  • إن timeout هي المهلة بالميلي ثانية لانتظار الاستقبال.

القيمة المُرجعة: إذا كانت recv عددًا صحيحًا فيكون مخزنًا مؤقتًا جديدًا للبايتات المستقبَلة، وإلا فيكون المخزن المؤقت نفسه الذي مُرر إلى recv.

send(send: int | bytes | bytearray, *, timeout: int = 5000) None

إرسال البيانات على الناقل:

  • إن send هي البيانات المراد إرسالها (عدد صحيح للإرسال، أو كائن مخزن مؤقت).

  • إن timeout هي المهلة بالميلي ثانية لانتظار الإرسال.

send_recv(send: int | bytes | bytearray, recv: bytearray | None = None, *, timeout: int = 5000) bytes

إرسال البيانات واستقبالها على الناقل في الوقت نفسه:

  • إن send هي البيانات المراد إرسالها (عدد صحيح للإرسال، أو كائن مخزن مؤقت).

  • إن recv مخزن مؤقت قابل للتعديل سيُملأ بالبايتات المستقبَلة. يمكن أن يكون نفس send، أو يُحذف. إذا حُذف، فسيُنشأ مخزن مؤقت جديد.

  • إن timeout هي المهلة بالميلي ثانية لانتظار الاستقبال.

القيمة المُرجعة: المخزن المؤقت الذي يحتوي على البايتات المستقبَلة.

الثوابت

CONTROLLER: int

تهيئة ناقل SPI كسيّد (وحدة تحكم) -- تقود OpenMV Cam SCK و MOSI وتتولى مسؤولية المعاملة.

PERIPHERAL: int

تهيئة ناقل SPI كتابع (طرفية) -- تستجيب OpenMV Cam لنبضات الساعة التي تقودها وحدة تحكم بعيدة.

MSB: int

تُمرر إلى firstbit لإرسال/استقبال البت الأكثر دلالة أولاً (الترتيب الأكثر شيوعًا).

LSB: int

تُمرر إلى firstbit لإرسال/استقبال البت الأقل دلالة أولاً.