Hi,
läuft es inzwischen?
Es gab ja schon den konstruktiven Hinweis
>Und auch hier hatte Joe schon angemerkt, dass im Slave das Laden von
>SPDR natürlich vor dem Transfer stattfinden muss, also ...
Das ist natürlich richtig. Wenn es aber nur das wäre, dann hätte der
Master ja folgendes protokollieren müssen:
,x,1,3,7,15
,31,1,3,7,15
,31,1,3,7,15 usw.
Er hat aber
,4,15,31,1,3
,7,15,31,1,3
,7,15,31,1,3 usw protokolliert.
Damit am Master die 15 kommen kann, muss die Schleife beim Slave schon
bis i=3 gelaufen sein.
Das bedeutet, Master und Slave laufen nicht synchron. Damit die
Übertragung fehlerfrei startet, muss der Slave schon im ersten
Durchlauf der for-Schleife innerhalb der while Schleife warten (vorher
sollte er schon den ersten Wert in das SPDR Register geschrieben haben),
wenn auf dem Master das SPDR-Register beschrieben wird.
Da die 15 als 2. Wert zu sehen ist, muss das SPIF-Bit auf dem Slave
schon 4 mal als high erkannt worden sein. Also ist zu vermuten, dass der
Start nicht synchronisiert wird.
Während des weiteren Ablaufs protokolliert der Master dann auch noch
einige Male die 4. Das deutet ebenfalls darauf hin, dass vom Slave kein
Wert bereitgestellt wurde. Da das gezeigte Programm ja nicht vollständig
ist, weiß man nicht, was der Slave sonst noch so treibt.
Also 1. Maßnahme: prüfen, mit welchem Takt der Slave wirklich läuft, ob
dort also auch die Bedingung Takt<=F_CPU/4 eingehalten ist. 2. Maßnahme:
die richtigen Anfangsbedingungen schaffen.
Dann gab es noch den Hinweise auf den für SS verwendeten Port. Habe ich
zwar nicht verstanden, aber wenn es nur einen Master und einen Slave
gibt, dann hätte ich beim Master auch den SS-Port genommen. Das ist hier
PORB0. Dieser Pin wird zwar richtig auf Ausgang gestellt und dann
unnötig mit High belegt. Aber das sollte so funktionieren und kann
nichts mit dem Problem zu tun haben. Man sieht ja auch an dem Output des
Masters, dass die SPI-Übertragung funktioniert, aber immer mal wieder
nicht wirklich synchron läuft.
Damit die 5 Werte fehlerfrei übertragen werden, muss der Slave den 1.
Wert schon im ersten Durchlauf der Schleife im SPDR Register
bereitgestellt haben und auf das SPIF High warten, wenn der Master den
Dummy Wert (DW) in sein SPDR schreibt und damit die Übertragung startet.
Wenn der Master-Takt nicht zu schnell für den Slave ist und der Slave
nicht zu lange durch Interrupt unterbrochen wird, sollte dieses Beispiel
eigentlich auch funktionieren.