Hallo zusammen, ich komme mal direkt zu meinem Problem: Ich habe hier 2 Mikrocontroller (AVR ATmega48) verbunden über die integrierten SPI-Schnittstellen. Nun möchte ich vom Master ans Slave Befehle und Daten senden können, sowie vom Slave zum Master Daten zurück geben können. Der Umfang der Daten wird je 12-bit (aufgeblasen auf 2 Byte) sein. Die Befehle haben ein Byte länge und werden bisher durch ein Startbyte, das bei den 12-bit Datenbytes nicht vorkommen kann, gekennzeichnet. Nun bisher hab ich immer 2 Byte direkt hintereinander vom Master aus gesendet. Leider ist diese Methode sehr instabil, da aus noch nicht 100% geklärten Ursachen immer mal wieder ein Byte verloren geht und damit die "Synchronisierung" verloren geht. Das Slave interpretiert dann immer das 2. Byte als erstes und umgekehrt. Zudem werden dann Plötzlich Datenfragmente als Befehle interpretiert was zu sehr verrücktem Verhalten führt. Nun liegt es nahe, dass da wohl etwas sinnvolleres Programmiert werden muss. Ich frage mich allerdings was. Ein richtig sinnvolles einfaches Protokoll will mir nicht einfallen und Google antwortet mir mit allem Möglichen was nach Protokoll klingt aber nichts einfaches, das geeignet ist sinnvoll 2Byte lange Datensätze ohne riesigen Verwaltungsaufwand oder ähnlichem zu übertragen. Ich wollte euch daher einfach mal fragen was ihr so verwendet. Ihr werdet ja bestimmt schon das eine oder andere Mal Daten zwischen Prozessoren ausgetauscht haben. Vielleicht könnt ihr mir auch einen Tip geben welcher Google-Code hilfreiche Treffer liefert. Danke schonmal Leo
Naja, wenn die überprüfst ob alle 3 Bytes einer Übertragung angekommen sind und vielleicht zusätzlich noch 1 Byte als Checksumme überträgst, sollte das doch ausreichen oder nicht?
Wenn du nur 12 bit von deine 16 nutzt, benutzt doch je ein bit pro byte zur kennzeichnung, ob es das erste, oder das zweite ist.
Das ist eigentlich eine Idee... die 6-6 Aufteilung ist mir auch noch nicht gekommen... Danke. Damit spiel ich mich mal eben, wenn aber sonst noch jemand Ideen hat bin ich sehr gerne offen dafür!
Viktor schrieb: > Wenn du nur 12 bit von deine 16 nutzt, benutzt doch je ein bit pro byte > zur kennzeichnung, ob es das erste, oder das zweite ist. Oder das dritte, oder das vierte. Aber nur wenn man mit 2 Bit von 0 bis 3 Zählen kann. Jeder anständige Mikroprozessor kann das, aber nicht jeder Prohgrammierer... :D scnr mfg mf
Du musst dem Master mitteilen, dass der Slave gerade nichts empfangen kann (sowas nennt sich auch "Handshake"). Der "normaldumme" AVR besitzt keinen Puffer für die SPI. Deswegen kann es sein, dass dein Programm zwischendurch was anderes macht. Es sei denn, du pollst die SPI bzw. deren Interrupt-Flags. Dann liegt es an was anderem. Die SPI hat ja die "Slave-Select"-Leitung ("/SS"). Damit wird dem Slave signalisiert, dass er jetzt Daten geschickt bekommt. Da brauchst du dann kein Startbyte senden, da er ja weiß, dass, sobald das /SS-Signal ankommt, er die beiden Datenbytes geschickt bekommt. Dein Programm muß also auf das /SS-Signal reagieren und dann solange auf den Port hören, bis entweder das /SS-Signal wieder ungültig ist, oder es 2 Bytes empfangen hat.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.