26. Lektion: SPI

Aus Attraktor Wiki

Wechseln zu: Navigation, Suche

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.

SPI_Konzept_1
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.
SPI_konzept_2
Daisychain
Quelle: https://de.wikipedia.org/wiki/Serial_Peripheral_Interface

SPI Modes

SPI_Modeses

SPI Modes
SPI Mode CPOL CPHA
0 0 0
1 0 1
2 1 0
3 1 1

Für die Taktfrequenz gibt es bei SPI keine Standards, wie bei I2C. Die maximal zulässigen Taktfrequenzen der SPI Ic's können dem Datenblatt entnommen werden. Sie können bis in den 2stelligen MHz Bereich gehen.

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 BMP280 Sensor

Auf dem Demoboard befindet sich der Temperatur- und Luftdruck-Sensor BME280. Es handelt sich dabei um ein sehr komplexes IC. Wir können aber auf einige fertige Module zurückgreifen, so das die Handhabung für uns sehr einfach wird. Wichtig ist aber, dass die Dateien

  • bmp280.py
  • bmp280_configuration.py
  • bmp280_spi.py
  • bmp280_i2c.py

im Ordner /lib des Pico vorhanden sind.