2016-08-02 58 views
0

Wir verwenden den Atmel SAM4S2C 32-Bit-ARM-Mikroprozessor zusammen mit einer intelligenten Batterie, die von einem bq20z45-Controller gesteuert wird. Die Batterie sendet eine Nachricht an ein (nicht vorhandenes) Smart-Batterieladegerät am SMBus. Es scheint, dass innerhalb von 24 - 72 Stunden der Mikrocontroller und die intelligente Batterie versuchen, Daten auf dem Bus gleichzeitig zu senden. Dies wäre normalerweise kein so großes Problem, aber manchmal zieht der SAM4S beide TWI-Linien (SDA, SCL) nach diesem Vorfall tief. Wir stellen den Bus zurück, um dieses Problem zu lösen, aber es wäre schön zu verstehen, was hier passiert.Atmel SAM4S ziehen TWI/I²C-Leitungen niedrig

Wir können dieses Problem reproduzieren, indem wir einen Funktionsgenerator mit einem 100 kHz Rechtecksignal auf den Bus setzen. Das Flag ARBLST (Arbitration Lost) wird im Mikroprozessor gesetzt, beide Leitungen werden auf Low gesetzt.

Die Verwendung eines Busses bei getrennter Batterie (+ Funktionsgenerator angeschlossen) funktioniert ebenfalls, ist jedoch tendenziell robuster. Dies liegt möglicherweise daran, dass keine Kommunikation mit der Batterie stattfindet und nur das Adressbyte auf dem Bus ist. Es gibt also viel weniger Kommunikation zu kollidieren.

Hat jemand irgendwelche Probleme im Zusammenhang damit? Irgendeine Erfahrung? Das wiederholte Lesen von Datenblättern brachte keine brauchbaren Ergebnisse.

Der SAM4S befindet sich im Master-Modus.

+0

Sind Sie sicher, dass der SAM4S sie niedrig zieht und nicht die Batterie? Ich war mir nicht ganz klar darüber, was das Ergebnis bei nicht angeschlossener Batterie war. – rjp

+0

Wir ziehen die Batterie heraus, wenn der Fehler auftritt. Die Zeilen bleiben niedrig - ich denke, es ist ziemlich sicher, dass der SAM4S2C sie tief zieht. –

Antwort

0

So sehe ich das:
SAM4S2C ist der Master, es sendet ein Startsignal + Adresse und irgendwann während dieser Phase ist die Linie LOW anstelle der erwarteten HOCH. Dies bedeutet, dass die Arbitration verloren gegangen ist, genau wie wenn es einen anderen Master in der Leitung gibt. Der Multimaster-Modus ist in einigen Systemen erlaubt. Nennen wir diesen virtuellen zweiten Master Virtual-Master.
An diesem Punkt ist SAM4S2C nicht mehr der Master, es will Ihnen sagen, dass es die Arbitration daher das ARBLST Flag verloren hat.
Nun, da Virtual-Master Master ist, verhält sich das SAM4S2C wie ein Slave. Der Slave darf das sogenannte Clock-Stretching durchführen, bei dem die Clock-Zeile so lange NIEDRIG ist, wie Sie möchten, und Sie haben so Zeit, die Verarbeitung vor dem Fortsetzen zu verarbeiten. Jetzt musst du die Uhr in der Firmware ausdehnen, ich erinnere mich nicht, wie, Entschuldigung. Versuchen Sie dann möglicherweise, die Übertragung einige Male erneut zu wiederholen, bevor Sie einen Fehler anzeigen.

+0

Gemäß dem Datenblatt geht der SAM4S2C nicht automatisch in den Slave-Modus, wenn ARBLST gesetzt ist. Da wir bei diesem Ereignis den Slave-Modus nicht manuell aufrufen, ist dies nicht der Fall. Außerdem befinden sich die Register in der I/O-View von Atmel Studio im Zustand "Master Mode". –

+0

Gemäß offizieller I²C-Spezifikation: "Der verlierende Master muss daher sofort in seinen Slave-Modus umschalten." Scheint akzeptabel, dass der SAM4S2C seine Konfiguration nicht selbst ändert, da dies nur ein temporärer Zustand ist. Quelle: http://www.nxp.com/documents/user_manual/UM10204.pdf – wire67