клас SPI – протокол шини Serial Peripheral Interface (з боку контролера)¶
SPI – це синхронний послідовний протокол, яким керує контролер. На фізичному рівні шина складається з 3 ліній: SCK, MOSI, MISO. На одній шині можуть бути кілька пристроїв. Кожен пристрій повинен мати окремий четвертий сигнал CS (Chip Select) для вибору конкретного пристрою на шині, з яким відбувається обмін. Управління сигналом 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конструктора) виводи фіксовані і не можуть бути змінені. У деяких випадках апаратні блоки допускають 2-3 альтернативні набори виводів для апаратного блоку SPI. Довільне призначення виводів можливе лише для драйвера побітового маніпулювання SPI (id= -1).
У випадку апаратного SPI фактична частота тактового сигналу може бути нижчою за запитувану швидкість передачі. Це залежить від апаратного забезпечення платформи. Фактична швидкість може бути визначена шляхом виведення об’єкта SPI.
- read(nbytes: int, write: int = 0x00) bytes¶
Читає кількість байт, вказану в
nbytes, одночасно безперервно записуючи єдиний байт, заданийwrite. Повертає об’єктbytesіз прочитаними даними.
Константи¶
клас 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із отриманими даними.
Константи¶