Forum: Mikrocontroller und Digitale Elektronik SPI Buffer enthält "falsche" Daten


von Don_Camillo (Gast)


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?

von PittyJ (Gast)


Lesenswert?

Ich dachte, CS müßte auf low (0) gesetzt werden, um einen Transfer 
einzuleiten.
Von daher verstehe ich den Algorithmus nicht so ganz.

von Don_Camillo (Gast)


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.

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.