الصنف 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)P3P2P1P0SPI(4)(OpenMV Cam N6 فقط)P15P16P17P18إن
NSSليس مقادًا من طرفية SPI على أي من الناقلين؛ فهو متاح للاستخدام كاختيار شريحة GPIO عادي.الطرق¶
- 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.يمكن أن تكون
polarity0 أو 1، وهي المستوى الذي يستقر عنده خط الساعة في حالة الخمول.يمكن أن تكون
phase0 أو 1 لأخذ عينات البيانات عند حافة الساعة الأولى أو الثانية على التوالي.يمكن أن تكون
bits8 أو 16، وهي عدد البتات في كل كلمة منقولة.يمكن أن تكون
firstbitإماSPI.MSBأوSPI.LSB.تشير
tiبقيمة True إلى اتفاقيات إشارة Texas Instruments، خلافًا لاتفاقيات Motorola.يمكن أن تكون
crcNone لعدم استخدام 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وتتولى مسؤولية المعاملة.