Hallo Leute, ich hoffe einer von euch kann mir helfen.
Ich will zwei Chips über SPI miteinander Kommunizieren lassen. Einer steckt auf einem STK500 und einer auf einer selbstgelöteten Platine. Beides Mega8.
Der auf dem Stk500 ist der Slave und wenn er das Byte "0101_1010" erhalten hat, soll eine bestimmte LED blinken.
Klappt irgendwie aber nicht.
Diverse Messungen mit dem Oszi haben ergeben, dass die Signale an den Pins anliegen. Aber übernehmen tut er sie offensichtlich nicht. Vielleicht ist was am Quellcode falsch? Ich kann den fehler nicht finden. Bitte helft wenn ihr könnt. Habe ein ähnliches Problem mit I2C.
Master
Code:
'------------------------------------------------------------------
' SPI-Master-radbaugruppe-SS.BAS
'Programm zum Nachweis der SPI-Funktiom des Masters mit selbstgewähltem SS-Pin
'Master ist ein Mega8 auf dem Board der Radbaugruppe mit 16MHz Taktfrequenz
'Es handelt sich um die angepasste Version von "spi-master-Stk500,bas"
'/SS hier selbst gewählt (PC2)
'----------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 16000000
$baud = 19200
Dim B As Byte
'PB4(MISO) ist Eingang, Rest sind Ausgänge
Ddrb = &B1110_1111
'alle Pins von PortC= Ausgänge
Ddrc = &B1111_1111
'selbstgewählter /SS-Pin
Ss Alias Portc.2
'zur Übersicht
Mosi Alias Portb.3
Miso Alias Portb.4
Sck Alias Portb.5
'----------------
Enable Interrupts
Config Spi = Hard , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 16
'zu sendendes Byte
B = &B0101_1010
'Datenregister initialisieren
Spdr = 0 ' start with sending 0 the first time
'SPI pins initialisieren
Spiinit
Do
Reset Ss '/SS auf log. "0" ziehen -> Start der Übertrag
Spiout B , 1 'Sendebefehl, sendet 1 Byte
Set Ss '/SS wieder log."1" -> beendet Übertrag.
Loop
End
Slave
Code:
'------------------------------------------------------------------
' SPI-slave_stk500-LED.BAS
'Programm zum Nachweis der SPI-Funktiom des Masters
'Master ist ein Mega8 auf dem STK500 mit 8MHz Taktfrequenz
'+ LED 5 blimkt, wenn Datenregister SPDR = 0 (Startwert)
'+ LED 4 blinkt, wenn Datenregister SPDR = B (B = vom Master gesendetes Byte)
'----------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 8000000
$baud = 19200
Ddrb = &B0001_0000
Config Portd = Output 'LEDs
'\SS = Portb.2
'MOSI = Portb.3
'MISO = Portb.4
'SCK = Portb.5
'Hilfsvariable um Lesezugriff auf SPDR zu testen
Dim Hilf As Byte
Dim B As Byte
Dim _ssspdr As Byte ' dies ist das SPI SLAVE SPDR register
Dim _ssspif As Bit ' SPI interrupt revceive bit
Dim _ssspsr As Byte 'SPI Statusregister Bit 7 muss gesetzt werden, wenn Übertragung beendet
B = &B0101_1010
'SPI konfigurieren
Config Spi = Hard , Data Order = Msb , Master = No , Polarity = Low , Phase = 0
'SPI pins initialisieren
Spiinit
_ssspdr = 0
Do
Hilf = _ssspdr
If Hilf = 0 Then
Portd.5 = Not Portd.5
Waitms 400
End If
If Hilf = B Then
Portd.4 = Not Portd.4
'Portd = _ssspsr
Waitms 400
End If
Loop
End
MfG
Christian
Lesezeichen