AdSense

Sonntag, 23. Juni 2013

SPI-Kommunikation zwischen ATmega und Raspberry PI

(English version) Ich messe die Temperatur in meinem Zimmer (siehe dazu ATmega - Temperaturmessung mit dem DS18S20). Diese liest ja ein ATmega aus. Die Temperaturdaten vom ATmega werden dann per SPI (siehe dazu ATmega - Hardware-SPI) an meinen Raspberry PI gesendet, welcher die Daten sammelt, mittelt und plottet (Gnuplot). Das fehlende Glied in der Kette ist jetzt die Kommunikation zwischen ATmega und Raspberry PI. Nach einigem recherchieren habe ich eine recht gut und schnell funktionierende Lösung gefunden. Auf dem Raspberry PI benutze ich die Library bcm2835 (http://www.airspayce.com/mikem/bcm2835/). Diese hat eingebaute SPI-Befehle.

Auf der Raspberry PI-Seite sieht das folgendermaßen aus (ich gehe davon aus, dass man sich mit SPI etwas auskennt):

#include <bcm2835.h>
int main (int atgc, char** argv)
{
  if (!bcm2835_init())
  {
    return 1;
  }
  bcm2835_spi_begin();
  bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST);
  bcm2835_spi_setDataMode(BCM2835_SPI_MODE0);
  //CLOCK_DIVIDER: Kann verschieden gesetzt werden, hier gibts es mehr dazu
  bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_65536);
  bcm2835_spi_chipSelect(BCM2835_SPI_CS0);
  bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW);

  //Ein Beispiel, welches sendBits sendet und danach returnBits empfängt.
  char sendBits = 0b11111111;
  char returnBits = 0;

  while(true)
  {
    bcm2835_spi_transfer(sendBits);
    //Man kann theoretisch gleichzeitig senden und empfangen, 

    //ich sende aber lieber zuerst
    //und schicke dann einfach Dummy-Bits (0b00000000)
    returnBits = bcm2835_spi_transfer(0);

  }
}


Auf der ATmega-Seite sieht das folgendermaßen aus (die drei SPI-Funktionen von dem ATmega - Hardware-SPI Post müssen natürlich im Prorgamm sein):

#include <avr/io.h>
int main()
{
  SPI_SlaveInit();
  char returnBits = 0;
  char sendBits = 0b11111111;
  while(true)
  {
    data = SPI_SlaveReceive();
    SPI_SlaveSend(sendBits);
  }
}

Kommentare:

  1. Hallo! Danke für den hilfreichen Beitrag.
    Ich wollte nur nachfragen, ob du den Raspberry in diesem Beispiel als Master verwendest?
    Außerdem wollte ich nachfragen, ob die Kommunikation mittels SPI die einfachste Möglichkeit ist, um einen Datentransfer zwischen AtMega und Raspberry PI zu realisieren?

    AntwortenLöschen
    Antworten
    1. Der Atmega wird als Slave und der Rasp als Master betrieben.
      Alternativ zu SPI könnte man zur Kommunikation auch noch I2C benutzen.

      Löschen