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.
SPI hat vier Konfigurationsmöglichkeiten beim Sampling: - steigende oder fallende Taktflanke - vordere oder hintere Taktflanke Sind die Parameter richtig eingestellt?
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?
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.
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.
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.
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.