PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : TWI MultiMaster Problem beim Umschalten Slave -> Master



triplebit
11.03.2007, 01:25
Hallo zusammen,

ich habe schon mittlerweile ne ganze Zeit dieses MM-Problem(immer wieder gegogelt und wieder neu probiert).

Mittlerweile bin ich auf den Fehler schon relativ nahe gekommen, und hoffe das etz endgültig lösen zu können ;-((((

Ich habe eine mini MM-Umgebung mit 2AVR M16 und einem Dragon zum debuggen.

Beide M16 können als Slave empfangen und als Master senden(MT und SR).....MR und ST sind nicht implementiert.

Das ganze basiert auf der Bibl. von Atmel, also in C. Den Code poste ich natürlich bei Bedarf, aber ich denke das das ganze nicht am Code direkt sondern eher an der Vorgehensweise liegt.

Zunächst init. ich beide MCs als Slave, setzte die Register

TWEN, TWIE (TWSR wird mit ISR abgefragt), für den Slave-Mode TWEA damit ein MT weiss, das der Slave erfolgreich empfangen hat, und cleare noch mit TWINT!

somit sind beide MCs im Slave-Mode.

wenn nun ein MC sendet, setzt er das StartBit und es wird zum testen genau ein Byte übertragen(plus Slave-Adresse und Write natürlich)

das ganze funzt auch in beide Richtung(nach einem Reset ohne Prg-Änderung oder HW-Änderung), soll heissen beide MCs können von Slave auf Master umschalten das Byte senden, und quitieren dann mit dem Stop-Bit(welches auch vom Slave empfangen wird)

Der Fehler tritt nun auf, wenn nachdem ein Slave vom Master adressiert wurde, mit ACK bestätigt hat und der Master sein Stop-Bit gesendet hat. Jetzt müsste der Ursprüngliche Slave, Master werden und ebenfalls das StartBit senden(was genau auf dem Bus los ist kann ich nicht sagen, da mir die HW fehlt, der Bus ist aber High, also kein MC nuckelt dran). Nun die Fehler die laut Dragon auftreten:

Entweder das StartBit wird gesetzt, die ISR für TWSTART wird aber nicht aufgerufen. Soll heissen, der Master merkt anscheinend nicht das er das Start-Signal gesendet hat.

Oder das StartBit wird gesetzt die ISR wird aufgerufen läuft dann aber auf Bus-Fehler.

Manchmal, wenn ich mit dem Dragon debugge funzt es sogar, so wie es sollte.

Ich habe mittlerweile auch schon schleifen eingebaut die bei Master-Slave Umschaltung eine gewisse Anzahl am Cycles warten (10, 20 und 200 schon probiert). Der Fehler tritt zu 100% auf wenn ich nicht mit dem Dragon debugge, aber mit dem Dragon funzt es eben AbundZu mal ?-)))))


hoffe es kann jemand helfen

Cu

Martin

PicNick
11.03.2007, 09:45
Schau mal, ob du da was findest. Wechselseitiges Master-Slaven kann lustig sein
https://www.roboternetz.de/wissen/index.php/TWI_Praxis_Multimaster

triplebit
11.03.2007, 19:13
Habe das mittlerweile gefixt.

Das Problem war, das das TWI anscheinend länger braucht um die Stop-Cond durchzubringen(Die 200 Counts reichen nicht) . Habe das bei Peter Fleury gefunden. Ich warte ganz einfach bis das TWSR die Stop-Cond nicht mehr drinstehen hat(Wenn im Master-Modus)

while(TWCR & (1<<TWSTO));

das wars, so einfach kanns sein :-))))

cu

Martin