Forum: Mikrocontroller und Digitale Elektronik SPI Arduino Datenübertragung


von Chris K. (roonpower)


Angehängte Dateien:

Lesenswert?

Hallo in die Runde,

ich hoffe hier an der richtigen Stelle für meinen Beitrag zu sein.
Nachdem ich trotz ähnlicher Beiträge aus dem Forum noch nicht schlauer 
bin, wende ich mich mit einem neuen Thread an euch.

Ich möchte über SPI 2 Slaves und einen Master verbinden.
Hierzu verwende ich folgendes:
Master:
Arduino Uno

Slaves:
1) SD-Daten Logger
2) GPS Modul (integriertes GPS Modul Origin GPS org-1318 auf einem 
antrax GPS/GSM Shield (Datenblätter im Anhang)

Die GPS Daten sollen ausgelesen und dann auf dem Logger abgelegt werden.

Ich habe die Komponenten bereits über eine Sternschaltung mit Hilfe 
eines SN74AHC125 IC (Levelshifter) verbunden, und habe aber jetzt das 
Problem der Datenübertragung. Da ich auf dem Gebiet nicht sehr bewandert 
bin, habe ich nach Internetrecherche nur eine grobe Vorstellung:
Die einzelnen Slaves werden über "Low" Setzten des CS-Pins angesprochen 
und können somit Daten übertragen. Wie dies allerdings aufgezogen wird, 
weiß ich nicht...
Nur dass eine "Buffer-Variable" verwendet wird, die mit Bits gefüllt 
wird und so vom Slave an den Master gesendet wird. Aber in welchem Takt 
und wie das funktioniert weiß ich nicht.

Könnt Ihr mir hier Hilfestellung geben? Gerne kann ich bei Interesse 
weitere Infos zu meinem Stand des Projekts nachreichen.

Vielen Dank im Voraus!
Roonpower

von Wolfgang (Gast)


Lesenswert?

Chris Kahn schrieb:
> Aber in welchem Takt und wie das funktioniert weiß ich nicht.

Dem kann abgeholfen werden
https://de.wikipedia.org/wiki/Serial_Peripheral_Interface

> Aber in welchem Takt ...

Das ist genau der Unterschied zwischen Master uns Slave - der eine 
erzeugt ihn und der andere wird damit getaktet.

von Chris K. (roonpower)


Lesenswert?

Hallo Wolfgang,

danke für deine schnelle Antwort.
Die Seite von Wiki habe ich allerdings schon angesehen, da ich aber 
nicht vom Fach bin, verstehe ich die Infos nicht so ganz.
Klar gibt sie mir Input in Form von Fachwissen, aber es interpretieren 
in Form von Code fällt mir schwer.
Woher weiß ich beispielsweise wie groß meine Variable sein muss, um die 
GPS Daten abzuholen und in welcher Form sie überhaupt vorliegen?
Wie das ganze theoretisch funktionieren soll ist mir klar (dass der 
Master einen Takt vorgibt und eine Variable losschickt, die vom Slave 
mit Daten zurück kommt, wenn man ihn über die SC Leitung aktiviert) wie 
das ganze umzusetzen ist, ist mein Problem.
Ich bin schon länger auf der Suche nach einem kommentierten 
Beispiel-Skript, um mir ein Bild machen zu können und damit zu verstehen 
wie eine Code-Umsetzung aussieht. Aber auch das ist nicht das Gelbe vom 
Ei und ich hoffe durch Support vom Forum zu einer Lösung zu kommen.

Beste Grüße

von Wolfgang (Gast)


Lesenswert?

Chris Kahn schrieb:
> Woher weiß ich beispielsweise wie groß meine Variable sein muss, um die
> GPS Daten abzuholen und in welcher Form sie überhaupt vorliegen?

Die SPI Hardware im µC ist aus Sicht des Programms einfach nur ein 
(8-Bit) Register und durch eine Übertragung wird genau dieser 
Registerinhalt zwischen Master und Slave (per Schiebeoperation) 
ausgetauscht. Das ist alles - ein Byte, nicht mehr und nicht weniger.

Wie der GPS-Empfänger die Daten bereithält und wie man die über SPI 
abholt, sollte im GPS Manuel/Datenblatt beschrieben sein. Für den µC 
musst du dir selber eine Datenstruktur überlegen, in der du die über SPI 
reinkommenden Bytes ablegst.

von Chris K. (roonpower)


Angehängte Dateien:

Lesenswert?

Ok, das hat mir schon mal geholfen an der richtigen Stelle im Datenblatt 
fündig zu werden, danke!
Folgende Infos sind für mich klar:
- Datentransfer bei CS low und SCK high
- Maximale SCK Frequenz 7MHz
- SPI Mode 0
- Da es dem Host möglich ist Daten an den Slave zu senden, bevor dieser 
operationsfähig ist, wird eine Startnachricht gesendet, sobald der 
Operationsstatus im richtigen Muster erreicht ist

Das Buffer System (First In First Out) verstehe ich jedoch nicht.

Und warum ist bei der Grafik einmal MSB und am Ende LSB eingetragen? Ich 
dachte es ist ENTWEDER das eine ODER das andere...
Die Anzahl  der Bytes der GPS Daten kenne ich auch noch nicht. Kann man 
einfach z.b. einen 1024 Byte Block transferieren und schauen was gefüllt 
wird?
Die Quelle dazu habe ich angehängt (Auszug aus dem Datenblatt).

Danke für die Hilfe!

von Wolfgang (Gast)


Lesenswert?

Chris Kahn schrieb:
> Und warum ist bei der Grafik einmal MSB und am Ende LSB eingetragen?

Weil nach dem Start der Übertragung zuerst das Datenbit 7 (MSB) und als 
letztes vorm Ende das Datenbit 0 (LSB) übertragen wird.

> - Da es dem Host möglich ist Daten an den Slave zu senden, bevor dieser
> operationsfähig ist, wird eine Startnachricht gesendet, sobald der
> Operationsstatus im richtigen Muster erreicht ist

Beinahe. Das GPS-Modul legt die Power-On Message im TX-Fifo ab und der 
µC muss per Polling gucken, ob das Modul schon so weit ist.

> Die Anzahl  der Bytes der GPS Daten kenne ich auch noch nicht.
Das sollte aber aus der Modul-Beschreibung hervorgehen. In welchem 
Format werden die Daten denn vom GPS bereit gestellt?

> Kann man einfach z.b. einen 1024 Byte Block transferieren und schauen
> was gefüllt wird?
Laut der auch markierten Beschreibung im Anhang (rechts) kommt ein 
Idle-Pattern raus, wenn keine zu übertragenden Daten vorliegen. Dann 
weiss der Master, dass er bis zum nächsten Poll-Durchgang nicht weiter 
Daten austauschen muss.

von Chris K. (roonpower)


Angehängte Dateien:

Lesenswert?

Danke wieder für die schnellen Antworten Wolfgang!

Das Format der Daten sind,so wie ich es verstanden habe- NMEA 
Datensätze. Die genaue Bezeichnung habe ich per Screenshots in den 
Anhang gepackt.
Wie hilft mir das weiter?

von Karl H. (kbuchegg)


Lesenswert?

Chris Kahn schrieb:
> Danke wieder für die schnellen Antworten Wolfgang!
>
> Das Format der Daten sind,so wie ich es verstanden habe- NMEA
> Datensätze. Die genaue Bezeichnung habe ich per Screenshots in den
> Anhang gepackt.
> Wie hilft mir das weiter?

Das hilft dir insofern weiter, als du weisst, was du aus dem SPI 
(bytesweise) rauskriegen wirst: einen Text. Übertragen Zeichen für 
Zeichen.

Danch gehts genau gleich weiter, wie wenn du den Text per UART empfangen 
hättest. Ganz normale String Verarbeitung und Auswertung, wie sie 
eigentlich zum Standardrepertoir jedes C Programmierers gehören 
(sollten), der sein Handwerk wenigstens ein bischen gelernt hat.

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.