Forum: Mikrocontroller und Digitale Elektronik Problem mit PIC & SPI Verbindung


von Michael P. (Firma: FH WHV) (michimon)


Angehängte Dateien:

Lesenswert?

Hi zusammen,
ich arbeite das erste Mal mit µControllern, mit der Sprache C und mit 
dem SPI Bus. Ich bitte um Nachsicht falls es sich um ein typisches 
Anfängerproblem handelt oder ich irgendwelche Regeln dieses Forums 
übersehen habe.

Nun zu meinem Problem:

PIC 18F2550, Datenblatt unter 
http://ww1.microchip.com/downloads/en/DeviceDoc/39632b.pdf
AD7142 Capacity-Digital-Converter, Datenblatt unter 
http://www.analog.com/UploadedFiles/Data_Sheets/AD7142.pdf
Ich arbeite mit dem CCS C-Compiler Version 4.023 und dessen 
Entwicklungsumgebung.

Der 18F2550 und der AD7142 sollen über eine SPI Verbindung miteinander 
verbunden werden. Beide Bauteile verfügen über eine entsprechende 
Hardware-Schnittstelle. Der PIC soll den AD7142 initialisieren und 
anschliessend überwachen.

Das Programm im Anhang beschreibt ein 16-Bit Register des AD7142 und 
liest es anschliessend wieder aus. Der Vorgang wird immer wiederholt 
sodass die Beobachtung der Signale mit einem Logic Analyzer/Scope 
leichter ist.
Mit der eigentlichen Anwendung hat das Programm noch nicht viel zutun 
aber es ist für mich ein Test der SPI-Schnittstelle.

Die SPI Verbindung funktioniert insofern das Daten gesendet und 
empfangen werden. Der AD7142 "versteht" die gesendeten Daten und 
Codewörter(read/write) ansonsten würde er z.B. keine Daten ausgeben.

Bei der Ausgabe der Daten gibt es allerdings einen Fehler:
Der PIC sendet z.B. AAAA und empfängt anschliessend AAAB. Das Bit0 des 
16-Bit Datenwortes ist immer eine 1 und ich weiss nicht warum !? MISO 
wird über einen Pullup auf 4V gezogen und es scheint mir so das auf die 
falschen Flanken reagiert bzw zuwenig Takte ausgegeben werden. Ich habe 
schon die unterschiedlichen SPI Modi ausprobiert und bin ansonsten 
ratlos.

Vielleicht kann mir ja jemand von euch helfen.

Ich habe mein Problem hoffentlich deutlich genug dargestellt. Falls noch 
weitere Informationen nötig sind, liefere ich sie gerne und so schnell 
wie möglich :)

Danke

von Zacc (Gast)


Lesenswert?

SPI hat verschieden modi, fallende Flanke, steigende flanke, cs hoch, cs 
tief. Da muss man genau das Datenblatt der beiden bausteine befolgen.

von Michael P. (Firma: FH WHV) (michimon)


Lesenswert?

CS ist low-active .. daran liegt es nicht. Die verschiedenen SPI Modi 
habe ich ausprobiert und es gab keine Änderung. Aus dem Datenblatt des 
AD7142 geht auch nicht wirklich hervor welchen SPI Mode man nehmen muss. 
Ich vermute sogar das man den Modi beim Senden bzw. Empfangen wechseln 
muss (wenn sowas geht).

Zitat dazu aus dem Datenblatt (S.31) :
"Data is clocked out of the AD7142 on the negative edge of SCLK, and 
data is clocked into the device on the positive edge of SCLK."

von Zacc (Gast)


Lesenswert?

Nein , man muss den Mode nicht wechseln. Das Device schiebt die Daten 
auf die fallende Flanke raus, und der Controller liest sie mit der 
steigenden Flanke rein.

von Michael P. (Firma: FH WHV) (michimon)


Lesenswert?

Meiner Meinung gilt folgendes :
CMP=1     (Transmit occurs on transition from active to Idle clock 
state)
CKE=1     (Idle State Clock = high)

Ruhezustand des Taktes ist high und er sendet bei der positiven Flanke. 
Das entspricht Mode 1,0 (PIC Datenblatt) bzw. Mode 3 (CCS Compiler).

Oder verstehe ich da was falsch ?

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.