Ich habe heute den folgenden Code geschrieben, um mit meinem Raspberry Pi einen SPI IO-Expander vom Typ MCP23S17 zu steuern:
#!/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)
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.