Hi,
ich habe jetzt mal eine SPI Kommunikation zwischen zwei Mega32 aufgebaut. Allerdings bin ich nicht ganz zufrieden: Mein Master überträgt 4 bytes zum Slave. Nur scheint dadurch der Slave total ausgelastet zu sein. Das liegt wohl daran dass ich ein "on SPI" interrupt verwende, aber wie komme ich ohne den aus..?
Hier der Code vom Master:
Code:
'MASTER
'===CHIP SETTINGS===
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 19200
'SPI
Config Spi = Hard , Interrupt = Off , Data Order = Lsb , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 4
'SPI
Dim A(4) As Byte
Enable Interrupts
Spiinit
'Main Loop soll nur die 4 Bytes verändern
Do
If A(1) < 200 Then
Incr A(1)
Else
A(1) = 16
End If
If A(2) < 250 Then
Incr A(2)
Else
A(2) = 0
End If
If A(3) > 1 Then
Decr A(3)
Else
A(3) = 233
End If
If A(4) > 60 Then
Decr A(4)
Else
A(4) = 160
End If
Spiout A(1) , 4
Waitms 3 '300Hz transfer von 4 bytes ist das ziel
Loop
Der code vom Slave:
Code:
'===CHIP SETTINGS===
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 19200
'SPI
Config Spi = Hard , Interrupt = On , Data Order = Lsb , Master = No , Polarity = High , Phase = 1 , Clockrate = 4
Dim A(4) As Byte
Enable Interrupts
On Spi Wasempfangen
Enable Spi
Spiinit
Do
Toggle Led_gelb
Waitms 3 'wenn die led regelmäßig hell ist -> µC läuft ungestört. Ist aber nicht so
Loop
'SPI
Wasempfangen:
Spiin A(1) , 4
Toggle Led_rot 'diese flackert auch sehr unregelmäßig
Return
Alle Leitungen (MOSI, MISO, SCK, SS) sind direkt 1:1 verbunden. Hatte es zwar erst aus "Sicherheitsgründen" mit 10k Widerständen versucht aber da ging gar nix.
Hat jemand einen Tipp wie ich ohne Interrupts auskomme? Ich dachte mein Haupt-µC soll der Slave sein, da er dann kein SCK erzeugen muss. Ist das sinnvoll? Wie könnte überhaupt ein Master Daten vom Slave empfangen?
Was auch ein bisschen nervt: Zum programmieren (über die ISP Schnittstelle) muss ich jedes mal die SPI Verbindung Master/Slave trennen, sonst werden die µC's nicht erkannt. Gibts da vielleicht nen Trick?
Vielen Dank für eure Hilfe!
Lesezeichen