Forum: Mikrocontroller und Digitale Elektronik SPI mit Raspberry Pi2


von Michael L. (nightflyer88)


Lesenswert?

Hallo zusammen

Ich möchte mit dem RPI2 per SPI mit einem STM32 kommunizieren. Für den 
Anfang habe ich mir überlegt, testweise den LIS3DSH Sensor auf dem STM32 
Discovery Board auszulesen, später sollte dann der STM32 als Slave 
dienen.

Nun die Frage: was brauche ich alles auf dem RPI damit ich mit SPI 
kommunizieren kann ? Die Software auf dem RPI wollte ich mit dem QT 
Creator programmieren.

Ich habe schon gegoogelt, aber da gibt es relativ viele Varianten, dass 
ich langsam den überblick verloren haben.

von holger (Gast)


Lesenswert?

>Ich möchte mit dem RPI2 per SPI mit einem STM32 kommunizieren.

Ich würde den per UART anschliessen.

von Michael L. (nightflyer88)


Lesenswert?

holger schrieb:
> Ich würde den per UART anschliessen

zu langsam..

von Timmo H. (masterfx)


Lesenswert?


von Michael L. (nightflyer88)


Lesenswert?

Super bestens ! Also mit dem wiringpi funtkioniert auf jedenfall mal das 
einfache schreiben auf einen gpio.

nun zurück zum spi und dem stm32 discovery board. habe noch ein kleines 
problem: und zwar sind die pegel am RPI 3.3V und am discovery 3V :-(

gemäss datenblatt vom LIS3DSH dürfen die signale max 0.3V grösser als 
VDD_IO sein.  Was kann ich da machen ? einfach einen wiederstand 
dazwischen, oder muss da wirklich ein pegelwandler dran ?

von Michael L. (nightflyer88)


Lesenswert?

Also das Problem mit den Pegeln hat sich erledigt.

Mit der wiringPI lib kann ich jedoch den SPI port am Raspberry nicht 
initialisieren. Bei wiringPiSPISetup(0,1000000) kommt immer der Fehler:

/home/pi/test/mainwindow.cpp:-1: error: undefined reference to 
`wiringPiSPISetup'
:-1: error: collect2: ld returned 1 exit status

Was mache ich genau falsch ?

Hier der Code von mainwindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "wiringPiSPI.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
    int a;
    a = wiringPiSPISetup(0,1000000);


    ui->lineEdit->setText("SPI Setup");

}

von Mario (Gast)


Lesenswert?

Du musst gegen wiringPi linken, z.B. mit -lwiringPi.

von Michael L. (nightflyer88)


Lesenswert?

alles klar du meinst also so wie hier: 
http://wiringpi.com/examples/gertboard-and-wiringpi/blink/

aber wie mache ich das mit dem QT Creator ?

von Timmo H. (masterfx)


Lesenswert?


von Karsten F. (Firma: von Dänemark) (bingo600)


Lesenswert?

Have a look at how Guzunty PI accesses the spi (fast)

https://github.com/Guzunty/Pi/

Spi user lib : https://github.com/Guzunty/Pi/tree/master/src/gzlib

Spi test program & makefile : 
https://github.com/Guzunty/Pi/tree/master/src/gz_16o8i

/Bingo

von Michael L. (nightflyer88)


Lesenswert?

irgendetwas passiert, jedoch nicht das richtige.

Vom sensor LIS3DSH möchte ich das inforegister auslesen (0x0D), ich 
sollte dann den wert 0x21 zurückbekommen, es kommt jedoch immer 0xFF, 
was mach ich falsch ?

Hier mal der Code:

    int a;
    int b;
    quint8 buff[10];
    QString txt;

    a = wiringPiSPISetupMode(0,1000000,0);
    txt = "Setup: "+QString::number(a)+"\n";

    buff[0]=0x8D;
    a = wiringPiSPIDataRW (0,buff,1) ;
    txt += "RW: "+QString::number(a)+"\n";

    for(b=0;b<10;b++){
        txt += QString::number(buff[b])+"\n";
    }

    ui->textEdit->setText(txt);

von Michael L. (nightflyer88)


Lesenswert?

habe den fehler bereits gefunden :-)

SPI Mode = 1
das empfangene byte steht natürlich in zweiten byte: buff[1] und nicht 
in buff[0]


besten dank für eure hilfe

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.