Servus, ich habe hier seit Tagen keine Erfolge mit der SPI-Anbindung eines AVR-Slaves am LPT eines PC's (Master). Die Datenübertragung ist mehr als mieserabel egal weche Frequenz ich auch Betreibe (selbst bei 1 sek. pro Bit und LED als Kontrolle). Der LPT bringt 4,4V bei High und war schlecht in den Flanken, daraufhin habe ich eben für SCK und MOSI je zwei Inverter genommen, Flanken sind jetzt OK und mit dem Oszi sauber.
Der momentane AVR-Slave-Code:
Code:' SPI-Slave-Routine für SPI-Hub ' ============================= $RegFile = "m8def.dat" $Crystal = 7372000 $Baud = 115200 On SPI SPI_Interrupt NoSave LEDError Alias PortD.7 Dim TempSpi As Byte Dim SpiDataRec As Byte DDRD.7 = 1 ' LED auf Out PortD.7 = 0 ' LED aus Init: DDRB.4 = 1 ' MISO auf Ausgang PortB.4 = 0 ' MISO auf High GoSub SPI_Init ' SPI-Initialisierung Set SREG.7 Main: Do LEDError = SpiDataRec.0 Loop SPI_Init: SPCR = &B11000000 ' SPI-Slave einstellen ReSet SPSR.SPI2X ' Double Speed aus SPIDataRec = 0 Return SPI_Interrupt: 'TempSpi = SREG If SPSR.7 = 0 Then GoTo SPI_Interrupt SpiDataRec = SPDR SPDR = 0 'LEDError = SPSR.WCOL ' Write-Collision? 'Print SpiDataRec; " "; 'SREG = TempSpi Return
Der momentane PC-Code:
Jetzt müßte der LPT ein SPI-Protokoll senden auf Mode 0, laut Oszi ist das auch der Fall in jeder Geschwindigkeit. Das Problem ist es kommt eben immer das Anfangsbyte verschoben an im AVR-Slave. Aus einer 1 wird meinetwegen mal eine 128, dann eine 64, auch mal eine 32 und so weiter, also eben willkürlich verschoben.Code:Private Declare Function Inp Lib "inpout32.dll" Alias "Inp32" ( _ ByVal PortAdress As Integer) As Integer Public Declare Sub Out Lib "inpout32.dll" Alias "Out32" ( _ ByVal PortAdress As Integer, ByVal Value As Integer) Private Sub CmdTransmit_Click() Dim SendByte As Byte Dim ReciveByte As Byte Dim TempByte As Byte Dim i As Byte TxtTest.Text = "" ' Sendebyte laden SendByte = Val(TxtSend.Text) For i = 0 To 7 ' Datenbit auf Bus legen HubMosi = (SendByte And &H80) <> 0 Call SchreibeDatenByte With TxtTest If HubMosi Then .Text = .Text & "1" Else .Text = .Text & "0" End With ' Clock-Puls senden HubSck = Not HubSck Call SchreibeDatenByte HubSck = Not HubSck Call SchreibeDatenByte ' Byte links schieben SendByte = (SendByte And &H7F) * 2 Next i End Sub Public Sub SchreibeDatenByte() Dim Ausgabe As Byte Ausgabe = 0 If HubSck Then Ausgabe = Ausgabe + 1 If HubReset Then Ausgabe = Ausgabe + 2 If HubMosi Then Ausgabe = Ausgabe + 128 Out Basisadresse, CInt(Ausgabe) Debug.Print Ausgabe End Sub
Hat jemand eine Idee woran das liegen kann?
Grüße Wolfgang







Zitieren

Lesezeichen