class SPI -- بروتوكول ناقل واجهة الطرفيات التسلسلية (جانب وحدة التحكم)¶
SPI هو بروتوكول تسلسلي متزامن تشغّله وحدة تحكم. على المستوى الفيزيائي، يتكون الناقل من 3 خطوط: SCK وMOSI وMISO. يمكن لأجهزة متعددة مشاركة الناقل نفسه. ينبغي أن يكون لكل جهاز إشارة رابعة منفصلة، CS (تحديد الشريحة)، لاختيار جهاز معيّن على الناقل ليجري الاتصال معه. ينبغي أن تجري إدارة إشارة CS في تعليمات المستخدم البرمجية (عبر فئة machine.Pin).
توجد تطبيقات SPI عتادية وبرمجية على حد سواء عبر الفئتين SPI وSoftSPI. يستخدم SPI العتادي الدعم العتادي الأساسي للنظام لتنفيذ عمليات القراءة/الكتابة وهو عادةً فعّال وسريع لكن قد يكون عليه قيود بشأن الدبابيس التي يمكن استخدامها. يُنفَّذ SPI البرمجي بطريقة النقر البتي ويمكن استخدامه على أي دبوس لكنه ليس بنفس الكفاءة. تملك هاتان الفئتان الطرق المتاحة ذاتها وتختلفان بشكل أساسي في طريقة إنشائهما.
مثال على الاستخدام:
from machine import SPI, Pin
spi = SPI(0, baudrate=400000) # Create SPI peripheral 0 at frequency of 400kHz.
# Depending on the use case, extra parameters may be required
# to select the bus characteristics and/or pins to use.
cs = Pin(4, mode=Pin.OUT, value=1) # Create chip-select on pin 4.
try:
cs(0) # Select peripheral.
spi.write(b"12345678") # Write 8 bytes, and don't care about received data.
finally:
cs(1) # Deselect peripheral.
try:
cs(0) # Select peripheral.
rxdata = spi.read(8, 0x42) # Read 8 bytes while writing 0x42 for each byte.
finally:
cs(1) # Deselect peripheral.
rxdata = bytearray(8)
try:
cs(0) # Select peripheral.
spi.readinto(rxdata, 0x42) # Read 8 bytes inplace while writing 0x42 for each byte.
finally:
cs(1) # Deselect peripheral.
txdata = b"12345678"
rxdata = bytearray(len(txdata))
try:
cs(0) # Select peripheral.
spi.write_readinto(txdata, rxdata) # Simultaneously write and read bytes.
finally:
cs(1) # Deselect peripheral.
المُنشئات¶
- class machine.SPI(id: int, baudrate: int = 1000000, *, polarity: int = 0, phase: int = 0, bits: int = 8, firstbit: int = MSB, sck: Pin | None = None, mosi: Pin | None = None, miso: Pin | None = None)¶
تُنشئ كائن SPI على الناقل المحدد، id. تعتمد قيم id على منفذ معيّن وعتاده. تُستخدم القيم 0 و1 وما إلى ذلك شائعًا لاختيار وحدة SPI العتادية رقم 0 و1 وما إلى ذلك.
بدون أي معاملات إضافية، يُنشأ كائن SPI لكنه لا يُهيَّأ (يحتفظ بإعدادات آخر تهيئة للناقل، إن وُجدت). إذا أُعطيت وسائط إضافية، يُهيَّأ الناقل. راجع
initلمعرفة معاملات التهيئة.الطرق¶
- init(baudrate: int = 1000000, *, polarity: int = 0, phase: int = 0, bits: int = 8, firstbit: int = SPI.MSB, sck: Pin | None = None, mosi: Pin | None = None, miso: Pin | None = None) None¶
تُهيّئ ناقل SPI بالمعاملات المعطاة:
baudrateهو معدل ساعة SCK.polarityيمكن أن يكون 0 أو 1، وهو المستوى الذي يستقر عنده خط الساعة في وضع الخمول.phaseيمكن أن يكون 0 أو 1 لأخذ عينة من البيانات عند الحافة الأولى أو الثانية للساعة على التوالي.bitsهو العرض بالبتات لكل عملية نقل. يُضمن دعم 8 فقط من قبل كل العتاد.firstbitيمكن أن يكونSPI.MSBأوSPI.LSB.sckوmosiوmisoهي كائنات دبابيس (machine.Pin) تُستخدم لإشارات الناقل. بالنسبة لمعظم وحدات SPI العتادية (كما تحددها المعاملidللمُنشئ)، تكون الدبابيس ثابتة ولا يمكن تغييرها. في بعض الحالات، تسمح الوحدات العتادية بمجموعتين أو ثلاث مجموعات دبابيس بديلة لوحدة SPI عتادية. لا يمكن إجراء تعيينات دبابيس اعتباطية إلا لمشغّل SPI بطريقة النقر البتي (id= -1).
في حالة SPI العتادي قد يكون تردد الساعة الفعلي أقل من معدل الباود المطلوب. يعتمد ذلك على عتاد المنصة. يمكن تحديد المعدل الفعلي بطباعة كائن SPI.
- read(nbytes: int, write: int = 0x00) bytes¶
تقرأ عددًا من البايتات يحدده
nbytesمع الكتابة المستمرة للبايت الواحد المعطى بواسطةwrite. تُعيد كائنbytesيحتوي على البيانات التي قُرئت.
الثوابت¶
class SoftSPI -- ناقل SPI مُحاكى برمجيًا¶
تنفّذ الفئة SoftSPI بروتوكول SPI بالنقر البتي على دبابيس GPIO اعتباطية. تعرض السطح ذاته من الطرق الذي تعرضه SPI بحيث يمكن للتعليمات البرمجية الموجودة التي تستهدف SPI العتادي التبديل إلى البرمجي بتغيير المُنشئ فقط. استخدمها عندما لا تكون الدبابيس التي تحتاجها موصّلة بوحدة SPI عتادية، أو عندما تحتاج إلى أكثر من النواقل العتادية المتاحة، أو عندما تتطلب طرفية توقيت طور ساعة غير قياسي لا يستطيع العتاد إنتاجه.
المُنشئات¶
- class machine.SoftSPI(baudrate: int = 500000, *, polarity: int = 0, phase: int = 0, bits: int = 8, firstbit: int = MSB, sck: Pin | None = None, mosi: Pin | None = None, miso: Pin | None = None)¶
تُنشئ كائن SPI برمجي. يجب توفير
sckوmosiوmiso-- لا يوجد اختيار ضمني للدبابيس. راجعSPI.init()لمعرفة معنى المعاملات الأخرى. القيمة الافتراضية لـbaudrateأقل منها فيSPIالعتادي لأن حلقة النقر البتي عليها حِمل إضافي أكبر.الطرق¶
- init(baudrate: int = 500000, *, polarity: int = 0, phase: int = 0, bits: int = 8, firstbit: int = SoftSPI.MSB, sck: Pin | None = None, mosi: Pin | None = None, miso: Pin | None = None) None¶
تُعيد تهيئة ناقل SPI البرمجي بالمعاملات المعطاة. تُحدَّث الوسائط المُوفَّرة فقط؛ وتحتفظ البقية بقيمها السابقة. راجع
SPI.init()لمعرفة معنى كل وسيط.
- read(nbytes: int, write: int = 0x00) bytes¶
تقرأ
nbytesبايت مع الكتابة المستمرة للبايت الواحدwrite. تُعيد كائنbytesيحتوي على البيانات المستلمة.
الثوابت¶