Forum: Mikrocontroller und Digitale Elektronik SPI Delay-Problem mit Raspberry Pi


von MemY (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe ein Problem mit meiner SPI Kommunikation eines Raspberry Pi`s.
Konkret geht es darum viele Messwerte, die mit einem FPGA erfasst 
werden, sehr schnell an einen Raspberry zu übermitteln, um dort die 
eigentliche Auswertung und anschließende Visualisierung vorzunehmen.

Für die Kommunikation verwende ich auf Raspberry-Seite den Standard SPI 
Linux-Treiber .

Die SPI Schnittstelle habe ich wie folgt parametriert:
1
static const char *device = "/dev/spidev0.0";
2
static uint8_t mode = 1;
3
static uint8_t bits = 8;
4
static uint32_t speed = 30000000;
5
static uint16_t delay = 0;

Die Kommunikation mit dem FPGA funktioniert. Jedoch habe ich 
festgestellt, dass die Zeit, bis der MISO Port nach dem letzten 
gesendeten Bit auf High schaltet, sehr lange dauert (rote Pfeile). Auch 
variieren diese Delays je nach Sendezeitpunkt eines SPI-Telegramms 
stark.

Wie schon erwähnt funktioniert die Kommunikation, ist aber zeitlich sehr 
ineffektiv, da 20 bis 80us lange Pausen enthalten sind, bevor ein neues 
Telegramm geschickt werden kann. Dadurch habe ich eine deutlich 
langsamere Kommunikation bzw. effektive Datenrate...

Kann mir jemand einen Tipp geben, wie ich diese Delays verkürzen kann, 
sodass die Telegramme näher zusammenrutschen und eine schnellere 
Kommunikation stattfinden kann?

Oder hat jemand bessere Erfahrungen mit WiringPi o.ä. gemacht?

Vielen Dank für eure Hilfe!

Viele Grüße, MemY

von Falk B. (falk)


Lesenswert?

Klingt nach einem Delay im SPI-Treiber im Linux. Denn dort wird ja das 
Chip Select wieder hochgezogen, das ist aber eher mit niedriger 
Priorität im Linux verankert.

von Gerd B. (bertr2d2) Benutzerseite


Lesenswert?


von MemY (Gast)


Lesenswert?

Danke für Eure Antworten!

Werde es mit dem Treiber von Martin Sperl versuchen..

Grüße MemY

von MemY (Gast)


Lesenswert?

Also irgendwie bekomme ich den Treiber von Martin Sperl nicht zum 
laufen...

Mir fehlen sämtliche Header (Auszug von spi-bcm2835dma.c):
1
#include <linux/clk.h>
2
#include <linux/completion.h>
3
#include <linux/delay.h>
4
#include <linux/err.h>
5
#include <linux/interrupt.h>
6
#include <linux/io.h>
7
#include <linux/kernel.h>
8
#include <linux/module.h>
9
#include <linux/of.h>
10
#include <linux/of_irq.h>
11
#include <linux/of_device.h>
12
#include <linux/spi/spi.h>

Kann mir jemand sagen, wie ich den Treiber korrekt eingebunden bekomme?

Vielen Dank,
MemY

von gaaag (Gast)


Lesenswert?

>Mir fehlen sämtliche Header (Auszug von spi-bcm2835dma.c):

Linux Kernelsourcen installieren

von Gerd B. (bertr2d2) Benutzerseite


Lesenswert?

Hier ist eine Anleitung zum Cross-Compilieren:

http://lnxpps.de/rpie/raspi-anleitung.txt

von Lothar (Gast)


Lesenswert?

Falk Brunner schrieb:
> Klingt nach einem Delay im SPI-Treiber im Linux

Ist jetzt kein Witz: für schnelles IO auf dem Raspberry bietet sich 
immer das alte RISC OS an:

https://www.riscosopen.org/forum/forums/5/topics/1445

von Marc Rupprath (Gast)


Lesenswert?

Hallo;

es mag dein Problem nicht lösen und ist auch keine konkrete Antwort auf 
deine Konkrete Frage, jedoch:

Der Rasperry Pi hat keine SPI Schnittstelle, das Timing au fden Pins ist 
"Hand Made" ?


Wenn Ja, meine Meinung (neben RISC OS ....)

Verwende zur Datenerfassung einen µC der eine SPI Schnittstelle besitzt.
Das ist dein "Schnittstellenbaustein".

Die Weitergabe an den Pi kann dann über andere Schnittetellen erfolgen:
 - GPIO, TCP/IP/USB..

nur ein Vorschlag:
Den RAM des Kontrollers könntes du als Buffer verwenden.


Wenn du bei Linux Lösungen bleiben möchtest:

Ich weis nicht ob der Pi geeignet ist:

Es gibt eine vielzahl von Embedded Linux geeigneten Controllern, die 
eine Anzahl von Schnittstellen (SPI,,,,,) schon auf der Chipfläche 
integruert haben.


Wie gessagt: Löst dein Problem nicht, nur ideen.

Gruß

von Gerd B. (bertr2d2) Benutzerseite


Lesenswert?

>
> Der Rasperry Pi hat keine SPI Schnittstelle, das Timing au fden Pins ist
> "Hand Made" ?
>

Der Prozessor hat sogar zwei SPI-Busse:

http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf

wobei aber nur ein SPI Bus über den PIN-header herausgeführt ist.

BTW: Das Delay Problem habe ich auch beobachtet:
http://www.raspberrypi.org/forum/viewtopic.php?f=44&t=7027&start=103
bzw jemand anders:
http://www.raspberrypi.org/phpBB3/viewtopic.php?t=38587&p=319353

Siehe auch:
http://www.raspberrypi.org/forum/viewtopic.php?f=44&t=19489&hilit=notro+spi


Den SPI-DMA Treiber habe ich mir aber im Detail nicht so genau 
angeschaut.
Aus den Erinnerungen heraus meine ich aber gesehen zu haben, das er
wesentlich geringere Delays hat.

Ich würde mir aber auch:
http://wiringpi.com/reference/spi-library/

anschauen. Ggf. benutzt die Lib ein paar Tricks, um die Delays
zu umgehen.

von MemY (Gast)


Lesenswert?

Hey Leute!

Vielen Dank für die zahlreichen Posts!

Die Idee von Marc Rupprath ist zwar berechtigt, aber in meinem 
Anwendungsfall ungünstig (wegen zusätzlicher Hardware, Aufwand, Kosten, 
etc.)

Die von Gerd B. erwähnte wiringPi Lib habe ich schon ausprobiert, jedoch 
genau mit dem selben Verhalten...

Dann werde ich doch noch den Treiber von Martin Sperl anschauen müssen?

Viele Grüße
MemY

von Tobias S. (tryan)


Lesenswert?

Hallo MemY,

ich habe leider genau das selbe Problem und hoffe Du konntest eine 
Lösung finden

Ich nutze die bcm2835 lib mit dem RPI2 sowie die aktuellste 
Kernel-Version.

Konntest Du eine Lösung für den Bug finden?

VIele Grüße Tobias

Beitrag #5680206 wurde von einem Moderator gelöscht.
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.