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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren