Forum: Mikrocontroller und Digitale Elektronik I2C, ATxmega und EMV - Ein Erfahrungsbericht


von Thomas A. (punisher)


Lesenswert?

Hallo zusammen,

ich bin gerade in der Laune, einfach mal meine gestern gemachten 
Erfahrungen mit einem ATxmega128A1, dem I2C-Bus und EMV zu schildern; 
vielleicht hilft es ja jemandem.

Hintergrund: ich nutze einen ATxmega128A1 auf einer größeren Platine zur 
Steuerung diverser anderer ICs. Im Prinzip geht es darum, aus 
verschiedenen Quellen MP3s (u.ä.) abzuspielen und digital an einen Class 
D-Verstärker auf einer zweiten Platine weiterzuleiten, der per I2C 
angesteuert wird (100 kHz).

Die beiden Platinen sind also über ein 10-poliges Flachbandkabel (70cm) 
verbunden, über das I2C und I2S gehen.

Der ATxmega128A1 stellte sich als ausgesprochen störrisch heraus, 
ständig hängte sich das I2C-Modul auf. Statt nach einer Übertragung in 
den "Idle"-Zustand zu gehen, blieb er "busy" oder sonstwas und hing sich 
in der ASF-TWI-Library in twim_release() auf, weil der Bus nie wieder 
"idle" wurde; zudem war die Datenleitung (SDA) von da an permanent low.

An dieser Stelle kürzen wir einige Tage Fehlersuche ab...

Ursache war die im Flachbandkabel direkt neben der I2C-Takt-Leitung 
(SCL) verlaufende Daten-Leitung des I2S-Interfaces. Vermutlich sind die 
relativ hochohmigen Pullup-Widerstände des I2C daran Schuld, dass bei 
70cm Kabel das Übersprechen vom I2S schon stören konnte.

Abhilfe brachte das Vertauschen von zwei Adern (1 und 4). Völlig 
problemlos funktioniert jetzt folgende Belegung des Flachbandkabels:

1 - I2C Clock (100 kHz)
2 - GND
3 - I2C Data
4 - +3,3V
5 - I2S SDIN (2,8 MHz)
6 - I2S LRCLK (44,1 kHz)
7 - Powerdown
8 - I2S SCLK (2,8 MHz)
9 - Reset
10 - I2S MCLK (11,3 MHz)

Für Viele mag das trivial erscheinen, aber obwohl ich nun wirklich kein 
Anfänger bin, hat es mich in dieser Ausprägung doch überrascht. Es ist 
tatsächlich nicht egal, wie man die einzelnen Adern eines 
Flachbandkabels belegt. Im Zweifel immer eine GND-Leitung zwischen zwei 
Digitalleitungen einplanen. Die zweite Erkenntnis ist, dass der I2C-Bus 
aufgrund seines hochohmigen High-Pegels tatsächlich sehr empfindlich 
gegenüber Störungen ist.


Grüße,
Thomas

P.S.: Trotzdem finde ich Konstruktionen wie die Folgende in den 
ASF-Libraries etwas peinlich:

while (! twim_idle(transfer.bus)) { barrier(); }

Ein einziger Fehler, und das Ding hängt für immer.

von joy (Gast)


Lesenswert?

Thomas A. schrieb:
> P.S.: Trotzdem finde ich Konstruktionen wie die Folgende in den
> ASF-Libraries etwas peinlich:
>
> while (! twim_idle(transfer.bus)) { barrier(); }
>
> Ein einziger Fehler, und das Ding hängt für immer.

...oder bis der WDC zuschlägt :-)

von Thomas A. (punisher)


Lesenswert?

Stimmt. :D

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

... allerdings ist die Erkenntnis nicht unbedingt neu, dass 
Flachbandkabel und 70cm Leitungslänge plus der geringe (3,3 Volt) 
Störabstand die I2C Signale vermurksen. Dafür ist dieser Bus nicht 
gedacht, bzw. dafür muss er einfach hochstromiger (mit kräftigeren 
Pullups) betrieben werden. Die internen XMega Pullups reichen dafür in 
keinem Fall aus.
Bedenkt, das dieser Bus eigentlich mal für Consumergeräteplatinen 
entwickelt wurde, mit 5 Volt lief und nur maximal innerhalb einer 
Farbglotze Signale verschoben hat.

Wer Fail-Safe Programme braucht, ist auch gut beraten, innerhalb jeder 
solchen o.a. Warteschleife Timeouts und Fehlerabfangen zu programmieren. 
Die Libraries geben das oft nicht her.

von Peter D. (peda)


Lesenswert?

Thomas A. schrieb:
> Vermutlich sind die
> relativ hochohmigen Pullup-Widerstände des I2C daran Schuld

Wie hochohmig hast Du sie denn gemacht?

Ich empfehle 1,8k oder bei längerem Kabel auf beiden Seiten 3,9k. Jeder 
IC am I2C-Bus muß ja 3mA abkönnen.

Bei manchen I2C-Controllern (z.B. NUC120) ist ein Timeoutinterrupt mit 
dabei, den sollte man auch nutzen.


Peter

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Thomas A. schrieb:
> Der ATxmega128A1 stellte sich als ausgesprochen störrisch heraus,
> ständig hängte sich das I2C-Modul auf.

Ich halte es für bedenklich, auf einen Controller zu schimpfen und die 
simpelsten Grundregeln der Elektronik nicht in Gänze zu beherrschen. 
Auch wenn Du von "Erfahrung" schreibst, klingt es eher nach einer 
Anklage.

Abgesehen davon ist das TWI des ATXMEGA128A1 etwas buggy, so dass es 
zusätzliche Workarounds brauchen könnte, um eine fehlerhafte Übertragung 
auszuschließen. Diese Workarounds funktionieren aber, wenn man sie denn 
einbaut.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Matthias Sch. schrieb:
> Dafür ist dieser Bus nicht
> gedacht, bzw. dafür muss er einfach hochstromiger (mit kräftigeren
> Pullups) betrieben werden.

Wahrscheinlich würde es schon völlig genügen, wenn man die Takt-
und schnellen Datenleitungen auf einem Hosenträger ordentlich in
Masseleitungen "einbettet".  Sowas hat selbst Centronics bereits
gemacht vor 30 Jahren.

von Detlev T. (detlevt)


Lesenswert?

Ich schließe mich Matthias und Peter an. I2C nur mit den internen 
Pullups grenzt IMO schon an Designfehler. Egal ob Mega mit oder ohne X.

von Thomas A. (punisher)


Lesenswert?

Junge Junge Junge...
Ist der Umgangston hier immer so?
Dabei merkt man bei einigen Leuten sogar, dass sie mein Posting nicht 
einmal richtig gelesen haben. Aber der Reihe nach.

1. Wo bitte steht, dass ich die internen Pullups verwende? 4,7 kOhm sind 
da momentan drauf. Klar kann man die vielleicht noch halbieren, aber 
selbst wenn es dann ginge, würde das hart an der Grenze laufen; sehr 
unschön.

2. Einen I2C-Controller nutze ich nicht, sondern das eingebaute 
TWI-Modul.

3. Dass die Libraries keine Timeouts haben ist mir bewusst, und genau 
das habe ich bemängelt. Klar kann ich das selber ergänzen, aber wozu 
sind dann bitte die Libraries? Die sollten gerade den aufwändigeren Kram 
(Timeouts etc.) bereits beinhalten, denn eine simple Version kann ich 
auch schnell selber schreiben.

4. @Knut Ballhause: meine Güte. Das "störrische Verhalten" des ATxmega 
war mein erster Eindruck zu Beginn der Fehlersuche. Ich schildere doch 
ganz genau, woran es letztendlich lag. Die implizite Schlussfolgerung 
ist, dass der ATxmega nicht wirklich die Ursache war.

Zudem verhält er sich tatsächlich störrisch. Warum? Weil er trotz "TWI 
master inactive bus timeout" nicht in den Idle-Zustand gewechselt hat, 
was ich anhand der Beschreibung im Datenblatt erwartet hätte. Für den 
Zustand "Busy" ist das sogar im Zustandsdiagramm so eingezeichnet. Er 
tat es aber nicht --> störrisch. Finde ich gerechtfertigt.

Die simpelsten Grundregeln der Elektronik... herrlich. Wieso maßen sich 
Leute an, beurteilen zu können, was Andere wissen, ohne auch nur die 
leiseste Ahnung zu haben?

- Auf derselben Platine (nur 2-lagig, 100% selbstentworfen, 1. Prototyp) 
läuft am ATxmega ein 512 kB-SRAM mit 64 MHz und besteht alle RAM-Tests 
von Atmel. In einer Konfiguration, von der in einigen Foren behauptet 
wird, dass sie bei dem Controller nicht funktioniert.

- USB Full-Speed-Interface funktioniert ebenfalls prächtig.

- Die Gegenstelle ist ein 50W-Class D-Verstärker, komplett selbst 
entwickelt, der 1. Prototyp funktioniert fehlerfrei mit hervorragendem 
Klang.

- Eine der krasseren von mir entwickelten Elektroniken misst bei einem 
kapazitivem Sensor mit 7 pF Eigenkapazität eine Änderung von maximal 14 
fF auf 1% genau (oder auch: 140 aF), und zwar 26000mal pro Sekunde. 
Sogar mein erster handbestückter (!) Prototyp wurde verkauft.

Jetzt darfst Du mal raten, wie sich meine Ausbildung nennt.

Aber zugegeben, noch nicht viel Berufserfahrung. Ist noch genügend Raum 
zum Lernen. :-)

"Abgesehen davon ist das TWI des ATXMEGA128A1 etwas buggy" <--- Könnte 
man wohl auch "störrisch" nennen...


5. "Wahrscheinlich würde es schon völlig genügen, wenn man die Takt-
und schnellen Datenleitungen auf einem Hosenträger ordentlich in
Masseleitungen "einbettet"."

Jo, genau das habe ich gemacht, sieht man doch in meinem allerersten 
Posting. +3,3V ist in der Hinsicht gleichwertig zu GND. Und wenn man 
genauer hinsieht stellt man fest, dass die anderen Leitungen auch 
größtenteils durch statische Signale voneinander getrennt sind, die man 
beliebig niederohmig machen kann (Powerdown, Reset).







Mein Posting sollte einfach ein Erfahrungsbericht sein, weil man 
häufiger was über I2C-Probleme liest. Aber bei der Stimmung hier werde 
ich mir das in Zukunft verkneifen.

von Mehmet K. (mkmk)


Lesenswert?

@Thomas A.
Ich möchte mich für Deinen Erfahrungsbericht bedanken.

Dass der Ton hier manchmal mit "starke Brise aus Nord-Nordwest" 
beschrieben werden kann, also daran gewöhnt man sich mit der Zeit. Bin 
mir aber sicher, dass keiner es so meint, wie es manchmal klingt. Selbst 
bei MaWin habe ich das Gefühl, dass seine "Ausraster" mit einem 
Schmunzeln begleitet werden.

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
Noch kein Account? Hier anmelden.