SPI Buffer enthält "falsche" Daten

Gast #3630285
Lesenswert?
• ▲
▼
Hallo Leute,

Ich kämpfe gerade mit einem komischen Effekt den ich mir noch nicht so 
ganz erklären kann und hatte gehofft jemand von euch kann mich 
vielleicht auf die richtige Fährte bringen.

An meinem PIC42FJ16GA ist über die SPI Schnittstelle ein ADC (AD7680) 
angeschlossen, der mir die Werte eines analogen Drucksensors wandelt. 
Liegt am Sensor kein Druck an, liefert mir dieser eine Offsetspannung 
von ca. 0.8V. Der Wert den mir der ADC liefert entspricht (mit etwas 
rauschen) ziemlich genau diesen 0.8V (um 2 Positionen geschiftet). 
Erhöhe ich nun den Druck auf den Sensor, steigt die Spannung von 0.8V 
auf 1.6V an (Test mit 2bar Druck). Der Wert den mir der ADC liefert (mit 
Oszilloskop betrachtet) entspricht zwar diesen 1.6V aber die Werte die 
im SPI Buffer liegen sehen ganz anders aus. Es scheint als schieben sich 
die Daten im Buffer immer mehr nach links, je höher der ausgegebene Wert 
ist.
Ich muss dazu noch erwähnen, dass ich das Chip Select Signal "manuell" 
steure, da ich mehr als 16 Bit über SPI einlesen möchte. Der Ablauf in 
meiner SPI Interrupt Subroutine sieht dann wie folgt aus:
- CS auf Eins setzen (ADC Sampling beenden)
- SPI Interrupt Flag auf Null setzen
- SPI Buffer solange auslesen, bis keine Daten mehr vorhanden sind -> 
while(SPI2STATbits.SRXMPT == 0)
- Daten werden verarbeitet
- CS auf Null setzen (nächster ADC Sample wird gestartet)
- 3 Dummybyte in SPI Buffer schreiben um den nächsten Wert einzulesen 
(3, weil ich 24 Bit einlesen möchte)

Ich bin mir nicht sicher ob ich im Ablauf meiner Subroutine noch einen 
Fehler drin habe oder ob die SPI Schnittstelle mir hier einen Strich 
durch die Rechnung macht. Hat jemand eine Idee wie sich dieser Effekt 
ergeben kann?
Gast #3630301
Lesenswert?
• ▲
▼
Das ist richtig. Wird die Interrupt Subroutine ausgelöst, wurde auf der 
SPI Schnittstelle gelesen/geschrieben. Als erstes setze ich also, am 
Anfang der ausgelösten Interrupt Subroutine, CS auf high (1) 
(lesen/schreiben ist ja jetzt beendet). Ich kann jetzt die Daten in der 
Subroutine zum weitersenden verarbeiten. Um den Lese-/Schreibvorgang 
erneut zu initialisieren setze ich am Ende der Subroutine das CS wieder 
auf low (0) und schreibe in den Buffer um so den nächsten 
Lese-/Schreibvorgang auszulösen. Die Interrupt Subroutine wird nach 
Beenden dieses Vorgangs erneut ausgelöst.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.