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.