PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit SPI



Schlaumi89
18.12.2010, 13:42
Hallo :)

ich bin neu hier im Forum und vielleicht könnt ihr mir ja weiterhelfen.
Ich möchte einen ATMega128 mit einem USB-Hostcontroller von FTDI über SPI verbinden. Allerdings funktioniert das Programm nicht so wie es soll.
Es soll über den SPI-Bus das Wort "Dir" an den Hostcontroller schicken worauf dieser über den SPI-Bus ausgibt ob ein USB-Stick angeschlossen ist.
Vielleicht findet ja hier jemand den Fehler.
Programm ist unten angehängt und schonmal vielen Dank für die Hilfe



$regfile = "M128def.dat"
$crystal = 8000000
$baud = 19200

Dim A As String * 20
Dim Test As String * 20

Config Spi = Soft , Din = Pinb.3 , Dout = Pinb.3 , Clock = Pinb.1 ,
Spiinit

A = "Dir"

Do
Spiout A , 10
Spiin Test , 10
Printbin Test
Wait 2
Loop
End

PicNick
18.12.2010, 15:37
Wenn das programm nicht funktioniert, was tut es dann ?
gar nix ? oder empfängst du müll ?
Stimmen die polaritäten der Signale ?

Schlaumi89
18.12.2010, 15:40
Ich hab mal mit Hexterminal drauf geschaut und es wird nur "......" zurück gesendet. Und mit RS232 funktioniert das einwandfrei alles nur bei SPI nicht so ganz..... .
Kenne mich leider auch mit dem SPI nicht so gut aus :(
Richtig angeschlossen ist auch alles das habe ich schon überprüft.

PicNick
18.12.2010, 16:48
Na, dein programm ist ja an sich recht übersichtlich. Da kann man eigentlich nicht viel falsch machen.
Ich nehme an, dass die musik beim "config" spielt, da müsste man genau wissen, was der ftdi für vorstellungen hat, was polaritäten, phasen etc. betrifft.
Gibt's da doku dazu ?

Schlaumi89
18.12.2010, 17:07
Ja klar. Sorry ganz vergessen sie anzuhängen.

Hier ist der Link zu dem Produkt:
http://de.rs-online.com/web/search/searchBrowseAction.html?method=getProduct&R=0406552

Richard
18.12.2010, 17:24
Ja klar. Sorry ganz vergessen sie anzuhängen.

Hier ist der Link zu dem Produkt:
http://de.rs-online.com/web/search/searchBrowseAction.html?method=getProduct&R=0406552

Im Datenblatt sind bei SPI Pin 5 und pin6 genannt, Pin6 mit Pull UP Pin 5 mit Pull down.

Du hast aber bei Config in und out auf den gleichen Pin ?

Ist das so gewollt?

Gruß Richard

Schlaumi89
18.12.2010, 18:14
Uups ne das sollte nicht sein. Hab es geändert aber trotzdem kommt da nichts ordentliches raus sondern nur Ã\5ÃÃ\5Ã\5Ã\5ÃÃ\5Ã\5Ã\5Ã :(
Hier ist auch nochmal die Verdrahtung
USB-Host: Mega128:
6 -> Pin 11 (B.1)
8 -> Pin 12 (B.2)
9 -> Pin 13 (B.3)
10 -> Pin 8 (E.6)

Mitch64
18.12.2010, 22:20
Hallo,
Strings können per SPI nicht verschickt werden.
Man muss den String Zeichenweise ausgeben, sonnst klappt das nicht.

Mitch.

Schlaumi89
18.12.2010, 22:22
Wie mach ich das den? :)
Und wie empfange ich die Bytes dann wieder und bau die richtig zusammen?

Mitch64
18.12.2010, 22:44
Entweder man liest der Speicher aus, an dem der String gespeichert ist Byte für Byte aus und senden den Wert.

Oder man verwendet Mid(Variable-Name,Position,1) und sendet den ASCII-Wert davon.

Es führen immer mehrere Wege nach ROM!

Schlaumi89
18.12.2010, 23:38
Ich hab das nun so gelöst:


$regfile = "M128def.dat"
$crystal = 8000000
$baud = 19200

Dim Value As Byte
Dim Variable1 As String * 15
Dim Variable2 As String * 15
Dim Variable3 As String * 15
Dim Befehl As String * 20
Dim Test As String * 20
Config Porte.6 = Output

Config Spi = Soft , Din = Pinb.3 , Dout = Pinb.2 , Clock = Pinb.1 ,
Spiinit

Befehl = "Dir"

Do
Porte.6 = 1
Variable1 = Mid(befehl , 0 , 1)
Value = Asc(variable1)
Spiout Value , 10
Variable2 = Mid(befehl , 0 , 1)
Value = Asc(variable2)
Spiout Value , 10
Variable3 = Mid(befehl , 0 , 1)
Value = Asc(variable3)
Spiout Value , 10

Spiin Test , 10
Printbin Test
Wait 2
Loop
End


Meintest du das so? Weil da steckt auch noch ein Fehler drin. Der Controller empfängt immernoch nur Murks.

for_ro
18.12.2010, 23:50
Hallo Schlaumi89,
ich hätte jetzt für die Ausgänge auch ein Ausgangsregister benutzt, also so
Config Spi = Soft , Din = Pinb.3 , Dout = Portb.2 , Clock = Portb.1

Warum gibst du immer 10 Byte aus?
SPIOut Value, 10

Wenn du wirklich "Dir" rüberschicken willst, dann musst du die MID() auch auf das erste, zweite und dritte Zeichen setzen.

Schlaumi89
19.12.2010, 10:06
Oh stimmt :D
Habs nun verbessert und es ändert sich trotzdem nichts :(

Mitch64
19.12.2010, 10:25
Was mir auffällt ist, das du 3 mal das Zeichen Nr 0 aus dem String Befehl sendest. Du willst doch aber das 1. Zeichen, dann das 2. Zeichen und das 3. senden?

Du musst
Variable1=Mid(Befehl,1,1) und dann
Variable1=Mid(Befehl,2,1) usw. schreiben.

Mitch64
19.12.2010, 10:34
versuchs mal so:




$regfile = "M128def.dat"
$crystal = 8000000
$baud = 19200

Dim J as Byte
Dim Zeichen as String * 1
Dim Value As Byte

'Dim Variable1 As String * 15
'Dim Variable2 As String * 15
'Dim Variable3 As String * 15

Dim Befehl As String * 20
Dim Test As String * 20
Config Porte.6 = Output

Config Spi = Soft , Din = Pinb.3 , Dout = Pinb.2 , Clock = Pinb.1 ,
Spiinit

Befehl = "Dir"

Do
Porte.6 = 1
For j = 1 to len(Befehl)
Zeichen = Mid(Befehl , j , 1)
Value = ASC(Zeichen)
SPIOUT Value , 1
Next
'Variable1 = Mid(befehl , 0 , 1)
'Value = Asc(variable1)
'Spiout Value , 10
'Variable2 = Mid(befehl , 0 , 1)
'Value = Asc(variable2)
'Spiout Value , 10
'Variable3 = Mid(befehl , 0 , 1)
'Value = Asc(variable3)
'Spiout Value , 10

'Spiin Test , 10
'Printbin Test
Wait 2
Loop

End

Schlaumi89
19.12.2010, 10:54
Ahhh das sieht schon besser aus :D. Mit TeraTerm sieht man da leider nicht allzuviel aber ich werd da nachher mal mit dem HexTerminal drauf gucken.
Dank dir vielmals!

Schlaumi89
19.12.2010, 18:59
So hab mal das Programm auf den Mega aufgespielt und mit Hexterm drüber geschaut.
Ich hab mal einen Screen davon gemacht:
http://img529.imageshack.us/img529/5274/unbenannttf.png
Das ist aber glaub ich immer noch nicht richtig. Weil eigentlich soll er schreiben das kein Medium vorhanden ist :(.

Mitch64
19.12.2010, 20:47
und woher weis der PC, das mit dem String "DIR" der Befehl komplett ist?
Muste vielleicht noch ein CRLF senden?

Mit deinem Screenshoot kann ich nichts anfangen, da kann ich nichtmal den DIR-Befehl raus erroieren.

Schlaumi89
19.12.2010, 21:12
Was ist den der ASCII Wert von einem CRLF?

Mitch64
19.12.2010, 21:16
schau in die bascomhilfe unter ascii chart