Forum: Mikrocontroller und Digitale Elektronik Problem mit der SPI Datenübertragung zwischen einem Arduino Portenta H7 und einem ADS8684 (ADC)


von Jeremy (dudogama)



Lesenswert?

Ich arbeite derzeit an einem Projekt für meinen Masterabschluss und bin 
auf ein Problem gestoßen. Ich benutze einen Arduino Portenta H7 als 
Schnittstelle zwischen einem PC und einem ADC. Die Datenübertragung 
erfolgt über SPI und läuft durch einen digitalen Isolator (ISOW7841). 
Ich versuche, einige Register des ADC (ADS8684) auszulesen, aber ich 
erhalte nur 0xFF als Antwort.

Ich bin mir nicht sicher, ob das Problem in der Software oder der 
Hardware liegt. Der ADC ist auf die Leiterplatte gelötet und lässt sich 
nicht leicht entfernen, sodass ich ihn nicht isoliert testen kann.

Hierbei wird die Hardware SPI-Schnittstelle des Arduino Portenta H7 
benutzt. Die wichtigsten Pins sind mit dem ADS8684 verbunden. Darunter 
SPI MISO, SPI MOSI, SPI CS (Chip select) und SPI CLK.

Im Code werden 3 einfache Register des ADS8684 einmalig im "setup()" 
ausgelesen und ausgeprinted.
Wobei ich mir nicht ganz sicher bin wie genau das Datenblatt 
hinsichtlich "Bitshifting" oder ähnlichem zu identifizieren ist.

Im Anhang befinden sich die einzelnen Schaltungslayouts und der 
verwendete Arduino Code, sowie die einzelnen Datenblätter der Bauteile 
und des Arduinos.
Referenzprojekte: 
https://github.com/siteswapjuggler/ADS8688a/blob/master/src/ADS8688.cpp
https://github.com/codemonkeyboris/Arduino-ADS868x

Bei Unklarheiten einfach schreiben jede Hilfe wäre sehr willkommen.

von Rahul D. (rahul)


Lesenswert?

SPI hat vier Konfigurationsmöglichkeiten beim Sampling:
- steigende oder fallende Taktflanke
- vordere oder hintere Taktflanke

Sind die Parameter richtig eingestellt?

von N. M. (mani)


Lesenswert?

Jeremy schrieb:
> Ich bin mir nicht sicher, ob das Problem in der Software oder der
> Hardware liegt.

Um in die richtige Richtung zu laufen könnte man ein Oszi mit 4 Kanälen 
oder einen Logik Analyzer anschließen um zu sehen was auf den Leitungen 
tatsächlich anliegt (vor/nach dem Isolator).

Man könnte auch den Isolator Mal runter werfen für den ersten Test und 
überbrücken um den aus zu schließen.

Versorgungsspannungen schon alle gemessen? Isolator? ADS8684?
Reset Pin auf richtigem Level?

von N. M. (mani)


Lesenswert?

Ich glaube deine ReadRegister Funktion ist auch falsch.

Bei den Command Registern heißt es:
1
REGISTER ADDRESS BITS[15:9]

Bit 8 ist das lese/schreib Bit.
Du müsstest die Adresse also auf 9 schieben.
Deine momentane 3 müsste momentan ein Schreiben auf AUTO_SEQ_EN sein.

von Jeremy (dudogama)


Lesenswert?

Die Pegel für die Spannungsversorgung und den Reset Pin am ADC haben wir 
bereits gemessen und korrigiert, das funktioniert jetzt. Wir haben auch 
Signale vor und nach dem Isolator gemessen und die kommen auch durch.

Ich werde mal den Schaltplan bearbeiten, sodass die von uns gemessenen 
Spannungen zu erkennen sind und es gleich hochladen.

In unserer Not entwickeln wir auch grade eine Platine um nur den ADC 
anzusteuern, also ohne Isolator usw.

von Jeremy (dudogama)


Lesenswert?

Hallo Rahul,

soweit ich das Verstanden habe findet die Konfiguration durch das 
Festlegen des Mode1 oder Mode0 statt. Wir haben dabei Mode1 für die 
Flanken gewählt, haben die Leute bei den Referenzprojekten auch gemacht, 
bin mir da aber auch nicht ganz sicher.

von Jeremy (dudogama)


Lesenswert?

Ich habe die Bitshiftung auf 9 jetzt abgeändert, bekomme jedoch 
immernoch keine validen Ergebnisse. Das mit dem AUTO_SEQ_EN Register 
stimmt, die Device ID steht woanders.

von Jeremy (dudogama)


Angehängte Dateien:

Lesenswert?

Ich habe außerdem mal den allgemeinen SPI-Bus des Arduinos ausgelesen, 
währenddessen ich sich erhöhende HEX-Werte sende.
Hierbei benutze ich den SPI_MODE1 des der SPI Schnittstelle.
Ich verstehe nur nicht ganz warum das letzte Bit auf HIGH stehen bleibt 
bis zum nächsten loop mit viel falschen Daten dazwischen.

von N. M. (mani)


Lesenswert?

Jeremy schrieb:
> Ich verstehe nur nicht ganz warum das letzte Bit auf HIGH stehen bleibt
> bis zum nächsten loop

Eigentlich ja egal wie das steht. Daten werden ja erst übernommen wenn 
!CS und Clock 1->0.

Jeremy schrieb:
> mit viel falschen Daten dazwischen.

Das ist ja nur das was dein PicoScope anzeigt. So schlecht sehen die 
Signale nicht aus.
Vermutlich passen einfach die Level/Threshold Einstellungen für den 
Decoder nicht. Bzw sind zu klein.
Zeig Mal die Einstellungen davon.

Dann vielleicht noch Masse nicht optimal angeschlossen und es zappelt 
halt etwas auf der Leitung.

von Rainer W. (rawi)


Lesenswert?

Jeremy schrieb:
> Ich verstehe nur nicht ganz warum das letzte Bit auf HIGH stehen bleibt
> bis zum nächsten loop mit viel falschen Daten dazwischen.

Dann stell doch erstmal dein Oszi so ein, dass nicht alle Signale 
ineinander gematscht sind. Solange die dekodierten Daten während einer 
Clockperiode rumeiern, ist dein Dekoder falsch eingestellt.
Das Signal NACH dem letzten Bit darf auf irgendeinem Wert stehen (Bild 
3)
https://de.wikipedia.org/wiki/Serial_Peripheral_Interface#Eigenschaften

: Bearbeitet durch User
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.