PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SPI Kommunikation zwischen 2 AVR's



Ruppi
04.07.2007, 17:50
Hallo!

Ich habe Schwierigkeiten bei der Kommunikation zweier AVR's über SPI. Folgenden Code verwende ich für den Master:



$regfile = "m8def.dat"
$crystal = 16000000

Config Portb.5 = Output
Config Portb.4 = Input
Config Portb.3 = Output
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 0 , Clockrate = 64 , Noss = 1
Spiinit

Dim B As Byte
B = 80

Do

Spiout B , 1
Wait 2

Loop
End


Und folgenden Code für den Empfang:


$regfile = "m8def.dat"
$crystal = 18432000

Config Spi = Hard , Interrupt = On , Data Order = Msb , Master = No , Polarity = High , Phase = 0 , Clockrate = 64 , Noss = 1
Spiinit
'Enable Spi

On Spi Spi_isr

'Interrupt's global aktivieren
Enable Interrupts

Config Portd = Output
Dim B As Byte , Status As Byte

Status = 0

Do
If Status = 1 Then
Portd.5 = 1
Waitms 500
Portd.5 = 0
Status = 0
End If

Loop
End


Spi_isr:
Spiin B , 1
Status = 1
Return


Leider funktioniert rein gar nichts. Es scheint, als wird vom Master gar nichts gesendet. Der Slave hingegen scheint zu funktionieren, d.h. beim flashen des Codes für den Master wird der Interrupt des Slaves ordnungsgemäß ausgeführt.

Woran könnte das liegen?

Furtion
04.07.2007, 19:16
Hi,

wie weit sind denn die beiden Chips auseinander? Ich hatte mit I2c und
der seriellen Komu schon mal er hebliche Probleme damit. Und:
Hast du die Chiprate in den Fuses umgestell? Damit hatte ich auch schon
mal Probleme.

Ruppi
04.07.2007, 20:47
Hi,
die Fuses sind entsprechend eingestellt, aber könnte es vielleicht Probleme machen, dass ein AVR mit 16MHz und der andere mit 18,432MHz läuft? Die Controller sind vielleicht 10cm voneinander getrennt - also keine Entfernung!
Jemand noch eine Idee?

Pascal
04.07.2007, 21:23
Kannst du mal einen Schaltplan posten? Evtl. stimmt ja da etwas nicht.

Furtion
04.07.2007, 21:33
Hi,

ich würde eher auf das mit dem Quarz tippen, wenn es für dich kein aufwand
ist würde ich einfach mal 2 16Mhz Quarze nehmen.

Ruppi
04.07.2007, 21:49
Hi,
Schaltplan habe ich gerade nicht da, aber da wäre auch nicht viel zu sehen. Es ist eine normale Standard-Beschaltung auf einem Testboard.
Ich könnte auf die interne 8MHz Quarzfrequenz umstellen und dann noch einmal testen, ein Versuch wäre es vielleicht wert.
Vorerst danke für die Antworten!

Pascal
04.07.2007, 21:57
Manchmal kommt es halt auf Kleinigkeiten im Schaltplan an. Wie hast du denn die SPIs der AVRs miteinander verbunden? MOSI des einen an MOSI des anderen?

Ruppi
05.07.2007, 09:34
ja, die Leitungen sind eins zu eins miteinander verbunden. Wenn ich es richtig verstanden habe, wird der MOSI Pin beim Master als Ausgang (Master Out) und beim Slave als Eingang (Slave In) geschaltet. Demnach sollte es funktionieren. Merkwürdig ist ja, dass der Slave den Interrupt auslöst, wenn ich den Master über ISP programmiere, sonst aber nicht. Deshalb liegt die Vermutung nahe, dass der Master gar nichts sendet.
Wann wird denn überhaupt der Interrupt ausgelöst? Wenn ein Byte komplett empfangen ist, oder wenn sich der Zustand der Clock-Leitung ändert?