Hallo Leute,
ich bin gerade dabei, mir ein LCD-Modul zu basteln, was ich über I2C und
über SPI ansteuern kann. Auf dem Modul sitzt ein ATmega8, angesprochen
wird es auch von ATmegas.
I2C funktioniert schon, allerdings habe ich mit dem SPI Probleme...
Manchmal funktioniert die Übertragung schlecht, manchmal garnicht,
manchmal bricht sie zusammen...
Habe schon öfter mit SPI gearbeitet, aber noch nie solche Probleme
gehabt...
Habe die beiden Platinen mit einem Flachbandkabel verbunden, schon 2
verschiedene Sender ausprobiert (um Hardwarefehler auszuschließen). Auf
dem LCD-Modul sollte auch kein Hardware-Fehler sein, die Leitungen sind
sauber von einander getrennt.
Ansteuerroutinen sind folgende (Ausschnitt)
Sender
1
voidlcdSPIInit(uint8_toperation){//1: save SPI-settings, Init lcd SPI; 0: restore SPI
Wenn ich mit lcdSPI_data(char data) sende, kommt es seltener zu
Störungen.
Wenn ich mit lcdSPI_string(char *data) "Hello World" sende, dann ist der
häufigste Fehler, dass statt dem o ein y ankommt, und der
zweithäufigste, dass statt dem l ein c kommt... Oder es kommt überhaupt
kein String an...
Die Fehler sind zwar oft die selben, lassen sich aben nicht (nicht in
der gleichen Reihenfolge) reproduzieren, sondern sind zufällig.
Gruß, Yaro
Ich bekomme das Problem ein wenig in Griff, wenn ich nach jedem Byte die
SS-Leitung hoch und dann wieder runterziehe, um das SPI zu resetten.
Dann verliere ich beim Senden zwar öfters mal einen Buchstaben, aber der
Rest bleibt ok.
Trotzdem ist das doch kein wünschenswerter Zustand!
Ich hab mit SPI bisher noch nie solche Probleme gehabt! Es lief immer
ohne Probleme!
Woran könnte sowas liegen?
Ich bin für jeden Tip dankbar!
Gruß, Yaro
Du mußt das SPI im Empfänger puffern, da das LCD langsam ist.
Besonders ein Clear ist grausam, sollte man aber eh nicht verwenden, da
dann das LCD flackert.
Professioneller ist, immer den Text überschreiben.
Peter
Du "überfährst" den Empfänger wahrscheinlich einfach. Bedenke, dass dort
Software die Bytes einzeln abholen muss. Und durch die LCD-Routinen im
SPI-Interrupt ist es obendrein manchmal ziemlich langsame Software.
Ich puffere den Empfänger. Auf das LCD gebe ich den Text erst dann aus,
wenn das letzte Zeichen angekommen ist.
Ich schreibe zuerst alles in den Puffer, danach kommt dann das
Steuerzeichen, mit dem das Modul weiß, was es mit den angekommenen Bytes
tun soll.
Gruß, Yaro
Ursache gefunden! Begründung nicht!
Wenn ich im LCD-Modul MISO nicht als Output deklariere, dann geht alles
ohne Fehler... (benutze MISO sowieso nicht)
Wie kann das sein?
Gruß, Yaro
Je schneller die Daten über den Bus gehen, umso mehr musst du an
Beschaltung bzw. Layout machen. Bei MOSI MISO SCK nach GND und bei CS
AUF VCC. Nimm mal 10k, wenn das zu viel ist, dann 1k. Das brauchst du,
weil du immer Kapazitäten auf der Leitung hast.
Bei mir ging das bis 25 MHz gut, dann mochte der Controller nimmer.
Werde ich beim nächsten Schaltplan berücksichtigen, danke!
Aber eine Antwort darauf, wieso es mit MISO nicht geht und ohne schon.
Arbeite mit 16MHz, prescaler 16.
Gruß, Yaro