Forum: Mikrocontroller und Digitale Elektronik leidiges Thema - SPI


von Günter (Dino) König (Gast)


Lesenswert?

Hallo Forum,

leider haben sich doch noch einige Merkwürdigkeiten eingestellt:
die unten stehende Routine soll Daten von einem Slave abfragen: der 
erste Schritt hierzu ist der Aufruf des Registers $38 im Slave.
Nach der Übertragung des Bytes (funktioniert) soll der Slave Daten an 
den Master ausgeben (funktioniert nicht).
Was mir dabei auffällt ist, das beim Senden des Bytes $38 8 Taktimpulse 
an SCK auftreten und das Bitmuster über MOSI an den Slave ausgegeben 
werden während in der Empfangssequenz keine Taktimpulse vorhanden sind. 
Das Progrämmchen verbleibt in der Schleife "warten1".
Müssten nicht auch in der Empfangsroutine 8 Taktimpulse auftreten?

Möglicherweise habe ich einen Fehler drin, aber ich sehe den einfach 
nicht.......

Hier die Routine

;------------------------------------------ UP  RX 
-----------------------------------

RX:

ldi  slave_reg,$38
cbi  portb,ss    ;enable Slave
nop
sbi  spcr,spe    ;SPI einschalten
nop
out  spdr,slave_reg  ;register $38 v. Slave wählen und senden
rcall  warten1

rcall  time_1us  ;Interbyte Time 1µs

sbi  spcr,spe    ;enable SPI
in  rx_data,spdr
rcall  warten1
nop
sbi  portb,ss    ;disable Slave
rcall  time_100us  ;0.1mS warten, dann weiter
rcall  time_100us  ;0.1mS warten, dann weiter

rjmp  RX


;-------------------------------------------  UP Warten 
------------------------------

warten1:
sbis  spsr,spif    ;wenn Flag gesetzt, nächstes Byte
rjmp  warten1    ;sonst noch warten
cbi  spcr,spe    ;SPI abschalten
cbi  spsr,spif    ;spif löschen
ret


Danke für eure Mühe,

es grüßt

Günter (Dino)

von Phagsae (Gast)


Lesenswert?

Moin Günter.

Komisch womit ich keinerlei Probleme bislang hatte ist die SPI
Ich programmier mit angeschlossen SPI Slave-> keine Probleme

Was mir ja nicht ganz klar ist warum schaltest du die SPI denn 2 mal ab 
?
In jeder Warteschleife.
Und warum löscht du das SPIF eigentlich ?
Es wird doch nach einem erfolgreichen Transfer gesetzt.
Dh wenn du durch einschreiben ins SPDR einen neuen Transfer startest
Ist das flag wieder neu gesetzt

Was mir auch nicht klar ist
Im 2ten Progteil liest du Daten ein das hättest du doch gleich
machen können

#in  rx_data,spdr
#rcall  warten1


Du schreibst ja nichts in SPDR was soll sich da ändern?
BZW das SPIF ist jetzt garantiert 0 ---->kann ja nicht anders
( Da kann die Warteschleife ja nie verlassen werdn )

Hab mal meine Routine hier kommentiert.
Schiebt und 16bit in den Slave und liest 16bit vom Slave

Das läuft eigentlich so:

Durch schreiben ins SPDR
schickt der Master dem slave 8bit daten
UND empfängt gleichzeitig vom Slave 8bit

Ist der Transfer beendet.
Sind die Daten vom Slave im SPDR
Und können aausgelesen werden
Das SPIF zeigt ob die Aktion erfolgreich war.


Hab mal ne frühere Assy Routine drangehängt.
Die tut ohne probleme.


ADC_WRITE:
; Abfrage Busy Status vom SPI Slave

ADC_WRITE:
sbis PINB,BUSY
rjmp ADC_WRITE

;Slave ready? also Daten tausch
cbi  PORTB,CS

; Dummy zum Slave
out  SPDR,OUT_HB_R

;Transmission H_Byte finished ?> send low bit else wait
AW1:
sbis SPSR,SPIF
rjmp AW1

; Daten vom Slave
in   IN_HB_R,SPDR
nop

;Dummy Daten zum Slave
out  SPDR,OUT_LB_R

;Transmission L_Byte finished ?> send low bit else wait
AW2:
sbis SPSR,SPIF
rjmp AW2

in   IN_LB_R,SPDR
sbi  PORTB,CS


Das wars

Phagsae

von Günter König (Gast)


Angehängte Dateien:

Lesenswert?

Moin Phagsae,

habe mal das Datenblatt von dem CMX813 beigepackt. Vermutlich habe ich 
mich auch etwas blöd ausgedrückt.
Schau es dir mal an, besonders das Timing auf Seite 20. Es drückt wohl 
mehr aus als 1000 Worte.

Mittlerweile habe ich die Aussage, das es mit dem SPI und diesem IC 
überhaupt nicht funktionieren soll.......

Mist!!!

Danke dir erstmal und schönen Gruß,
Günter

von Phagsae (Gast)


Lesenswert?

Moin moin

Eigentlich schaut das ziemlich gut aus vom timing
Wo siehst du denn probleme ?

Einer von uns beiden steht auf dem schlauch.

Wer solll denn im 2. Programmteil Den Clock lieferfern ??
Der CMX tut da gar nix.
Der Clk ist pD immer Input also kann der CMX kein Master werden

Wenn du Daten vom Slave haben möchtest musst
Richtung Slave schreiben!!!!!!!!!!.

Oder der Slave wird zum master
Aber das kann der CMX eigentlich nicht

Hab allerdings das Datenblatt nur füchtig gelesen.
Der SCLK ist n u r Als Eingange definiert

Also passiert folgendes
Der uC ist eine Slave und wartet auf den  SPI Clock
( Da kann er lange warten )


Phagsae

von Günter König (Gast)


Lesenswert?

Hi Phagsae,
genau das ist das Problem. Der CMX kann den Clock nicht liefern. Er 
verlangt die Registeradresse z.B. $3f + Clock, was ja auch klappt. Dann 
aber muss nach einer kurzen Pause der Clock neu starten damit das 
Register ausgelesen werden kann. Und das geht nicht.
Wie gesagt, das initialisieren des CMX geht, er arbeitet auch so wie er 
soll d.H. er liefert auch einen Interrupt. Funktioniert also.

Ich werde aber mal was Hardwaremäßiges probieren: Das Mosi-Signal lasse 
ich mal über ein UND-Gatter laufen, einen Anschluß an Mosi, den zweiten 
an einen Port-Pin. Bei der Registeradressierung werde ich den Portpin 
auf H setzen damit das Mosi-Signal an den CMX gelangt. Bei der Abfrage 
lege ich den Port-Pin auf L, sende einen Dummy und nur der Clock kommt 
zum CMX da der Ausgang vom Gatter auf L liegt und das Register kann 
somit gelesen werden.

Schaun mer mal,

Dank und Gruß,
Günter

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.