Ich habe heute den folgenden Code geschrieben, um mit meinem Raspberry Pi einen SPI IO-Expander vom Typ MCP23S17 zu steuern:
[python]
#!/usr/bin/python
import os
from time import sleep
device=’/dev/spidev0.0′
devaddr=0x40
def write(device,deviceaddress,register,byte_data):
handle=open(device, ‚w+‘)
try:
data=chr(deviceaddress)+chr(register)+chr(byte_data)
handle.write(data)
handle.close
return True
except:
print("Unable to write to SPI Bus")
return False
#MCP23S17 Register GPIOB auf Output schalten
write(device,devaddr,0x01,0x00)
delay=0.1
while True:
write(device,devaddr,0x13,0x01)
sleep(delay)
write(device,devaddr,0x13,0x00)
sleep(delay)
[/python]
In diesem Beispiel wird das SPI-Device /dev/spidev0.0 wie eine Datei behandelt. Um den MCP23S17 zu steuern, werden jeweils drei Bytes geschrieben:
- Die Adresse des ICs, die über 3 Adresspins konfiguriert wird. In diesem Beispiel liegen alle drei Pins auf Masse. Die resultierende Adresse ist 0x40. Näheres hierzu findet man im Datenblat des MCP23S17.
- Das Register, das geschrieben wird. Im Beispiel schreibe ich in das Register GPIOB, das für die Steuerung der 8 GPIO-Pins GPB0 bis GPB7 zuständig ist.
- Der Wert, der in das Register geschrieben wird. Ein Byte besteht aus 8 Bits, die jeweils den Zustand 0 oder 1 haben können. Der Wert 0x01ist hexadezimal. Dezimal ist der Wert 1 und Binär ebenfalls 1 oder zur Verdeutlichung 00000001. HIermit wird das erste Bit auf 1 gesetzt. Der Pin GPB0 wird dadurch ebenfalls auf 1 (=VCC) gesetzt.
Die Zweile write(device,devaddr,0x01,0x00) sorgt dafür, dass die Pins des Registers als Output konfiguriert werden.
Die While-Schleife würde eine an GPB0 angeschlossene LED blinken lassen.
Anschluss des MCP23S17 an den Raspberry Pi
Die folgenden Verbindungen müssen hergestellt werden:
- RPI Pin 1 (3.3 Volt) => VDD
- RPI Pin 6 (Masse) => VSS
- RPI Pin 24 (CE0) => CS
- RPI Pin 23 (SCKL) => SCK
- RPI Pin 22 (MISO) => SO
- RPI Pin 20 (MOSI) => SI
Für den Anschluss einer LED an einen der GPIO-Pins ist ein passender Vorwiderstand zu verwenden. Die LED und der GPIO-Expander könnten sonst Schaden nehmen!
Für den produktiven Einsatz ist diese Vorgehensweise nicht geeignet. Sie zeigt aber recht anschaulich, wie der SPI-Bus und der MCP23S17 arbeiten. Für den produktiven Einsatze empfehle ich den Einsatz einer fertigen API wie z.B. die von Quick2Wire.