Freitag, 10. Juli 2015

SPI Kommunikation am Arduino

In diesem Tutorial geht es darum, wie verschiedene Arduinos, Mikrocontroller oder sonstige Geräte, wie beispielsweise Shields, oder externer Speicher,  mit einem Arduino, über das SPI Protokoll kommunizieren können. Das ist, ähnlich wie I2C, ein Protokoll, mit dem Daten seriell übertragen werden.

Der Aufbau

Eine SPI Verbindung besteht aus 4 Pins. Das sind der MISO, der MOSI, der SCK und der SS Pin. Auf dem MISO Pin werden Daten vom Slave zum Master gesendet, auf dem MOSI Pin Daten vom Master zum Slave, und der SCK Pin gibt den Takt an. Der SS Pin ist dazu da, um eine speziellen Slave anzusprechen. Da SPI mehrere Slaves unterstützt, werden einach alle Geräte mit den selben MISO, MOSI und SCK Pins verbunden. Damit man nun einen speziellen Slave auswählen kann und nur dieser auf die aktuell gesendeten Informationen achtet, hat der Master zu jedem Slave eine eigene SS Leitung. Sobald er diese Verbindung zu einem Slave auf LOW setzt, empfängt dieser die gesendeten Daten und reagiert dementsprechend. Dadurch braucht man am Master für jeden zusätzlichen Slave nur einen weiteren Pin.
Der ICSP Header sind die 6 freistehenden Pins neben dem ATmega328 auf dem Arduino Uno Board. Da diese mit ihren jeweiligen Pendants, der digital Pins, mit dem jeweils gleichen Pin am Mikrocontroller verschaltet sind, kann man Pin 11, 12, 13 trotzdem nicht frei verwenden, obwohl an sie kein Kabel angeschlossen ist. Hier findet ihr die ICSP Header Zählweise:
Diese Pins verbindet man nun mit dem jeweils gleichen Pins des anderen Geräts. Das bedeutet MISO zu MISO, MOSI zu MOSI, SCK zu SCK und SS zu SS. Der SS Pin ist standardmäßig Pin 10 des Arduino. Ihn findet man nicht am ICSP Header. Ich habe einen Arduino mit einem ATmega328 verbunden, also einen Arduino mit einem Mikrocontroller. Dabei muss man am Mikrocontroller die Arduino Mikrocontroller Umrechnung beachten und den Mikrocontroller mit Strom versorgen. 

Das Programm

Das Programm zum übertragen von Daten besteht logischerweise aus zwei Teilen. Einem Sketch zum Senden der Daten, für den Master, und ein Sketch zum Empfangen der Daten, für den Slave. Meine beiden Sketch senden den Text "Hello, World!" vom Mikrocontroller an den Arduino, der das dann, über die serielle Konsole, am PC ausgibt. Man verwendet dazu die SPI Bibliothek, für den Arduino, die bereits mit der Arduino IDE vorinstalliert ist.

Der Master

Der Master beginnt, über SPI.begin(), die SPI Kommunikation. Dann schaltet er den SS Pin (10) auf LOW und sendet über SPI.transfer() die einzelnen Buchstaben des eingegebenen Textes. Am Ende schaltet er wieder den SS Pin auf HIGH, und beendet dadurch die Kommunikation.

Der Slave

Der Slave benötigt ebenfalls die SPI Bibliothek. Dann wird im Setup ein Interrupt erstellt, der aufgerufen wird, sobald etwas über die SPI Verbindung empfangen wird. Das wird dann, sobald eine "\n", also ein Zeilenumbruch, empfangen wird, über die serielle Verbindung, an den PC gesendet.


Wenn man nun in der Arduino IDE die serielle Konsole öffnet, sieht man, was der Arduino, vom Mikrocontroller, empfängt:


Keine Kommentare:

Kommentar veröffentlichen