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.

deinit() None

تُطفئ ناقل SPI.

read(nbytes: int, write: int = 0x00) bytes

تقرأ عددًا من البايتات يحدده nbytes مع الكتابة المستمرة للبايت الواحد المعطى بواسطة write. تُعيد كائن bytes يحتوي على البيانات التي قُرئت.

readinto(buf: bytearray, write: int = 0x00) None

تقرأ في المخزن المؤقت المحدد بواسطة buf مع الكتابة المستمرة للبايت الواحد المعطى بواسطة write. تُعيد None.

write(buf: bytes) None

تكتب البايتات الموجودة في buf. تُعيد None.

write_readinto(write_buf: bytes, read_buf: bytearray) None

تكتب البايتات من write_buf أثناء القراءة في read_buf. يمكن أن يكون المخزنان المؤقتان نفسهما أو مختلفين، لكن يجب أن يكون لكليهما الطول ذاته. تُعيد None.

الثوابت

MSB: int

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

LSB: int

مرّره إلى firstbit لإرسال/استقبال البت الأقل أهمية أولًا.

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() لمعرفة معنى كل وسيط.

deinit() None

تُحرّر دبابيس GPIO التي طالب بها مشغّل النقر البتي وتتوقف عن تشغيل الناقل.

read(nbytes: int, write: int = 0x00) bytes

تقرأ nbytes بايت مع الكتابة المستمرة للبايت الواحد write. تُعيد كائن bytes يحتوي على البيانات المستلمة.

readinto(buf: bytearray, write: int = 0x00) None

تقرأ في buf مع الكتابة المستمرة للبايت الواحد write. تُعيد None.

write(buf: bytes) None

تكتب buf إلى الناقل. تُهمَل البايتات المستلمة.

write_readinto(write_buf: bytes, read_buf: bytearray) None

تكتب write_buf وتقرأ في read_buf في الوقت ذاته. يجب أن يكون المخزنان المؤقتان بالطول ذاته؛ ويمكن أن يكونا متداخلين.

الثوابت

MSB: int

مرّره إلى firstbit لإرسال/استقبال البت الأكثر أهمية أولًا.

LSB: int

مرّره إلى firstbit لإرسال/استقبال البت الأقل أهمية أولًا.