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);
}
}
Hallo! Danke für den hilfreichen Beitrag.
AntwortenLöschenIch 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?
Der Atmega wird als Slave und der Rasp als Master betrieben.
LöschenAlternativ zu SPI könnte man zur Kommunikation auch noch I2C benutzen.