Raspberry Pi: Einfacher Schreibzugriff mit SPI und Python

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

MCP23S17 pinout

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.

4.60 avg. rating (92% score) - 5 votes

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Spamschutz * Time limit is exhausted. Please reload the CAPTCHA.