-
-
Erfahrener Benutzer
Roboter-Spezialist
Irgendwie muss die I2C Hardware der Mega32 CPUs ne Macke haben...
Ich zeig euch mal nen Protokoll, vielleicht hat ja einer eine Idee dazu:
Es geht um den Buserror da... wir sind Receiver Slave.
die Syntax des Protokls ist ca.
Datenregister x Statusregister x STATUSREGISTERALSTEXT meineANTWORT (Grund) Flags (bit2=SlaveBusy bit1=IsrBusy bit0=ohne Bedeutung)
Die Flags spielen eigentlich keine Rolle, erklären aber warum die ISR nackt (was auch vom Prinzip her so richtig ist). Die Datenverarbeitung ist asyncron, im Prinzip nackt die isr bis das Programm SlaveBusy auf 0 setzt.
Start der Datenübertragung
got DATA a and STATUS 60 mean / SRX_ADR_ACK ACK (Start) Flags 1
got DATA 0 and STATUS 80 mean <- SRX_ADR|data)_ACK -> ACK (Adress) Flags 11
got DATA 63 and STATUS 80 mean <- SRX_(adr|DATA)_ACK -> ACK (Data) Flags 11
got DATA 1 and STATUS 80 mean <- SRX_(adr|DATA)_ACK -> ACK (Data) Flags 111
got DATA 0 and STATUS 80 mean <- SRX_(adr|DATA)_ACK -> ACK (Data) Flags 111
got DATA a and STATUS 60 mean / SRX_STOP_RESTART (eot) Flags 101
Datenübertragung abgeschlossen, nächstes Datagram (wird abgebrochen)
got DATA a and STATUS 60 mean / SRX_ADR_ACK ACK (Start) Flags 101
got DATA 0 and STATUS 80 mean / SRX_(ADR|DATA)_ACK NACK (Slave busy) Flags 111
Die isr nackt weil der Client die Daten noch nicht bearbeitet hat
Clent sagt aber nun "Received: 1"
got DATA 63 and STATUS 88 mean / SRX_ADR_DATA_NACK ACK (eof) Flags 1
Wir antworten noch auf das Nack, der Versuch ist abgebrochen. Der Master versucht ein Neustart. Wir sahen bis hier ein sauber ünbertragenes Byte und einen abgebrochenen Versuch, beides gut abgewickelt.
Also weiter...
got DATA a and STATUS 60 mean / SRX_ADR_ACK ACK (Start) Flags 1
got DATA 0 and STATUS 80 mean <- SRX_ADR|data)_ACK -> ACK (Adress) Flags 11
got DATA 63 and STATUS 80 mean <- SRX_(adr|DATA)_ACK -> ACK (Data) Flags 11
got DATA 2 and STATUS 80 mean <- SRX_(adr|DATA)_ACK -> ACK (Data) Flags 111
got DATA 0 and STATUS 80 mean <- SRX_(adr|DATA)_ACK -> ACK (Data) Flags 111
got DATA a and STATUS 60 mean / SRX_STOP_RESTART (eot) Flags 101
Wieder ein Datagram übertragen...
got DATA a and STATUS 60 mean / SRX_ADR_ACK ACK (Start) Flags 101
got DATA 0 and STATUS 80 mean / SRX_(ADR|DATA)_ACK NACK (Slave busy) Flags 111
isr nackt weil Daten unbearbeitet
Clent sagt aber nun Received: 2
erwartet wird ein SRX_ADR_DATA_NACK vom Master wie in den ersten beiden Durchläufen damit die ISR ein ACK senden kann, bekommen tue ich das:
got DATA 1 and STATUS 0 mean BUSERROR Flags 1
In der Folge verschluckt sich das System weil der Master den Buserror nicht mitbekommen hat, ist hier aber nicht mehr relevant...
Warum bekomme ich erst im 3 Datensatz nach immerhin 6 übertragenen Byte Daten einen Buserror auf einen Ablauf, der genau so vorher 2 mal geklappt hat? Der Master macht in beiden duchläufen exakt das gleiche, der Slave auch. Was ist am 3. bzw. ende vom 2 anders? Andere Master sind nicht am Bus. Das Ganze bei langsamen 100khz.
Achja, das Ganze ist aus Dirks Programm, senden von 3 Byte auf Register 0,1 und 2
Die Vorgeschriebene Reaktion auf SRX_ADR_DATA_NACK (0x8
laut Datenblatt ist [Switched to the not addressed Slave mode; own SLA will be recognized; GCA will be recognized if TWGCE = “1”] -> (1<<TWINT)|(1<<TWEA) ... also ACK
Buserrors findet man im allgemeinen nur bei ungültigen Start/Stop Folgen, es kann sein das der Master das letzte Datenbyte mit einem NACK senden muss als Vorbereitung auf Datenende und Stop, das muss ich noch rausfinden aber es erklärt nicht warum es mal geht und mal nicht!
Ideen, Ratschläge,Meinungen?
PS: SlyD hat es sich übrigends einfach gemacht ... er ACKt einfach alles was reinkommt *grins
LG Rolf
EDIT:
So... das Problem ist behoben... und in Dirks Programm gehen keine Daten mehr flöten... keine Buserrors... und das Ganze mit ca. 4000 Zeichen/Sek. UND Textausgabe... Leider bleibt ab und zu der Transport komplett hängen, wo ich noch nicht raus hab warum. Vielleicht hab ich mir irgendwo nen deadlock gebaut. Und ich hab jetzt noch nicht alle anderen Funktionen geprüft. Und noch was... wenn ich gewusst hätte wieviel besch.... schlechte Doku es zu dem Thema gibt, hätte ich NIEMALSNICHT damit angefangen... aber es wird langsam.
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen