|
|
Zeile 87: |
Zeile 87: |
| | | |
| ==== SPI Methoden==== | | ==== SPI Methoden==== |
| + | |
| + | ; SPI.deinit() |
| + | : Schaltet den SPI Bus aus. |
| + | |
| + | ; SPI.read(nbytes, write=0x00) |
| + | : Liest nbytes Bytes ein und gibt dabei mit write angegebene Byte aus. |
| + | |
| + | ; SPI.readinto(buf, write=0x00) |
| + | : Liest Bytes in den Buffer und gibt dabei mit write angegebene Byte aus. |
| + | |
| + | ; SPI.write(buf) |
| + | : schreibt die in buf enthaltenen Bytes aus. |
| + | |
| + | ; SPI.write_readinto(write_buf, read_buf) |
| + | : schreibt die in write_buf enthaltenen Bytes aus und liest gleichzeitig Bytes in read_buf ein. |
| + | |
| + | Wie beim I2C Bus sind diese Methoden vor allem für das Schreiben von Treibern interessant.<br> |
| + | Wir gehen deshalb nicht weiter darauf ein. |
| + | |
| + | == Ein Beispiel mit dem BME280 Sensor== |
Version vom 15. Dezember 2023, 11:26 Uhr
Das Serielle Periphere Interface
Dem Seriellen Peripheren Interface (SPI) liegt ein sehr einfaches Konzept zu Grunde. Dafür benötigt es mehr Leitungen als die I2C Schnittstelle:
- MOSI
- Master Out Slave In
- MISO
- Master In Slave Out
- SCK
- Clock
- D/C
- Data/Control
- CS / SS
- Chip Select
Das SPI Konzept
SPI arbeitet nach dem Master / Slave Konzept. Der Master kontrolliert die Kommuniktion.
Die Hardware besteht im Prinzip aus einen 8-Bit Schieberegister.
Quelle: https://www-user.tu-chemnitz.de/~heha/hsn/ATmegaX8.chm/19.htm
Die SPI Geräte können auf 2 Arten miteinander verbunden werden. Sie können parallel oder hintereinander (Dasy Chain) verbunden werden.
Quelle: https://de.wikipedia.org/wiki/Serial_Peripheral_Interface
SPI Modes
SPI Modes
SPI Mode |
CPOL |
CPHA
|
0 |
0 |
0
|
1 |
0 |
1
|
2 |
1 |
0
|
3 |
1 |
1
|
SPI Objekt erzeugen
Wie üblich in Micropython muss zuerst eine Instanz der Klasse SPI erzeugt werden.
Hardware SPI
Der Pico hat 2 Hardware SPI Schnittstellen (ID = 0, 1)
Die Klasse SPI unterstützt nur diese drei Leitungen: SCK, MOSI, MISO.
Die D/C und CS Signale muss der Programmierer selbst steuern.
Die Hardware SPI's können auf verschiedene Pins gelegt werden (s. Pinout)
Die default Einstellungen für Hardware SPI findet man so:
from machine import SPI
print(SPI(0))
print(SPI(1))
SPI(0, baudrate=992063, polarity=0, phase=0, bits=8, sck=18, mosi=19, miso=16)
SPI(1, baudrate=992063, polarity=0, phase=0, bits=8, sck=10, mosi=11, miso=8)
SPI Instanz mit default Pins erstellen:
from machine import Pin, SPI
spi = SPI(0, baudrate=400000)
Für weitere Parameter gibt es noch folgende Möglichkeiten:
spi = SPI(1, 10_000_000, sck=Pin(14), mosi=Pin(15), miso=Pin(12))
spi = SPI(0, baudrate=80_000_000, polarity=0, phase=0, bits=8, sck=Pin(6), mosi=Pin(7), miso=Pin(4))
Wenn MISO nicht benötgt wird kann miso=None gesetzt werden.
Software SPI
Für eine SoftSPI Instanz sind weitere Angaben erforderlich:
from machine import Pin, SoftSPI
spi = SoftSPI(baudrate=500000, polarity=0, phase=0, bits=8, firstbit=SoftSPI.MSB, sck=Pin(2), mosi=Pin(3), miso=Pin(4))
SoftSPI ist langsamer als die Hardwarevariante.
SPI Methoden
- SPI.deinit()
- Schaltet den SPI Bus aus.
- SPI.read(nbytes, write=0x00)
- Liest nbytes Bytes ein und gibt dabei mit write angegebene Byte aus.
- SPI.readinto(buf, write=0x00)
- Liest Bytes in den Buffer und gibt dabei mit write angegebene Byte aus.
- SPI.write(buf)
- schreibt die in buf enthaltenen Bytes aus.
- SPI.write_readinto(write_buf, read_buf)
- schreibt die in write_buf enthaltenen Bytes aus und liest gleichzeitig Bytes in read_buf ein.
Wie beim I2C Bus sind diese Methoden vor allem für das Schreiben von Treibern interessant.
Wir gehen deshalb nicht weiter darauf ein.
Ein Beispiel mit dem BME280 Sensor