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.
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 :-)
... 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.
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
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.
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.
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.
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.
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.