Hallo, habe hier ein SAM4E-EK auf dem ich bereits den TWI0 ohne Probleme
nutzen kann. Allerdings brauche ich für meine Hardware zwingend auch den
zweiten I2C (TWI1) vom Controller. Dieser liegt wie der TWI0 auf
Peripheral A.
PIN = Peripherie A = SYSIO
PB4 = TWD1 (TWI Daten) = TDI (JTAG) und
PB5 = TWCK1 (TWI CLK) = TDO/TRACESWO.
Da ich über den SAM ICE Debugge habe ich mich dann für Serial Debugwire
entschieden, da hier die Pins TDI und TDO scheinbar unbenutzt sind. Um
auf Nummer sicher zu gehen habe ich einen weiteren 20Pol
Pfostenverbinder ohne Pin 5 und 13 (TDI und TDO) auf den SAM ICE
gepresst, damich diese Leitungen wirklich getrennt sind zum Debugger.
Wenn ich die Portpins, wie auch schon bei TWI0, Peripheri A zuweise
bleibt der PB5 Pin low. Beide Pins (PB5/PB4) haben einen Pullup nach
VCC.
Einziges Problem in meinen Augen kann eigentlich nur noch der TRACESWO
sein, der ja an der TPIU hängt. Da gucke ich aber nicht durch wie ich
den konkret abschalten soll. Wenn ich einmal über den SAM ICE Debugge
(20Pol verbindung gesteckt) ist der Pin low, dann zieh ich z.B. den
Debugge, resette den MC und der Pin liegt hoch, aber der I2C macht
nichts und Debuggen kann ich ja in dem Moment logischer Weise nicht.
Habt ihr noch irgendwelche Tips wie ich den TWI1 ebenfalls nutzen kann?
Chip ist der SAM4E16E. Irgendwie sind die Pins nicht wirklich an
Peripherie A.
Trotzdem will der TWI1 immer noch nicht. Im Prinziep habe ich die
gleiche Vorhergehensweise wie bei TWI0 durchlaufen (Ich nutze übrigens
das ASF).
Pin Configuration ist
Nach der Initialisierung sind die Register gleich wie in TWI0. Wenn ich
die Datenleitungen PB4 und PB5 als output initialisieren und nicht dem
TWI1 zuordne lassen diese sich auch High und Low schalten. Nur wenn der
TWI1 den Pinnen zugeordnet ist, sind diese immer High. twi_master_read()
hängt er sich in der Funktion auf und bekommt scheinbar kein
TWI_SR_RXRDY.
Hier auch einmal die FUnktion (unverändert aus dem ASF):
Da das Ganze beim TWI0 super funktioniert schließe ich hier eigentlich
den Fehler aus. Irgendwas muss noch mit meiner Peripheriezuweisung
falsch sein. In der Funktion wird auch das TWI-MMR richtig beschrieben.
Danach passiert nichts mehr in den Registern / in der Funktion.
Die PIO Statusregister PIO_PSR P4 und P5 sind auch auf 0 sodass sie der
PIO_ABCDSR0 und 1 Peripherie zugeordnet werden. Hier sind alle Bits 0,
also Peripherie A für den TWI.
Danke für deine Hilfe Thomas, die Clock sollte aktiviert sein, habe sie
auch nochmal expliziert über den PMC eingeschaltet -> keine Veränderung.
Ich habe auch für meine Übersicht nochmal ein neues Projekt (mit Vorlage
für das SAM4E-EK Board) angelegt, den TWI Service über den ASF
hinzugefügt und in der init.c den TWI1 definiert:
Das ist auf jeden Fall problematisch. twi_master_options_t liegt bei dir
auf dem Stack und du initialisierst nicht alle Felder. Da steht dann
also Müll drin. Da fehlt so was in der Art:
Nein, ich fasse es nicht. Es passiert etwas an den Pinnen was im ersten
Augenblick nach I2C ausschaut. Super.. Den Rest kann ich leider erst
morgen genauer betrachten. Der Wahnsinn. Es scheint wirklich an
irgendeinem Müll im Speicher gelegen zu haben.
Wirklich super vielen lieben Dank Thomas. Ich hab mir wirklich schon
einen Wolf gesucht. War kurz davor einen Multiplexer zu integrieren um
nur den TWI0 zu nutzen.
Das ist eine Stolperstelle, die sich durch die ganze ASF-Doku zieht. Zum
Konfigurieren eines Moduls werden immer Strukturen genommen und diese
sind in den Beispielen immer global definiert und oft eben nur teilweise
initialisiert. Dann denkt man sich, dass sieht in einer Funktion viel
schöner aus und schon sucht man 2 Tage den Fehler.
> War kurz davor einen Multiplexer zu integrieren um> nur den TWI0 zu nutzen.
TWI ist ist ja aber eigentlich schon ein Bus, an dem mehrere devices
hängen können oder hast du zwei devices mit den gleichen, nicht
änderbaren, Adressen?
Genau das habe ich mir auch gedacht bei dem ASF. Es ist auch tatsächlich
das erste Mal für mich wo ich mit dem ASF arbeite. Habe lange überlegt
ob ich den Weg nach wie vor zu fuß gehe oder nicht. Letztendlich
versuche ich mich nun mit dem ASF, da ich später noch SD + FAT + evtl.
Ethernet benötige und ich mir hierdurch etwas weniger Aufwand und
Fehlerquellen erhoffe.
Wieder was gelernt, sich die Strukturen genauer anzuschauen und sich
nicht auf die Beispiel Doku zu verlassen.
Zum I2C. Habe ziemlich viele Ein- und Ausgabe-Bausteine (PCA9555PW) auf
der Hardware. Zum einen reichen hier die 3 Adressbits nicht aus und zum
Anderen habe ich einen Bus gedacht für Eingabelemente, der relativ
zeitnah übertragen soll und an dem Anderen Bus sind die etwas
zeitunkretischen Dinge, wie Anzeigeelemente angeschlossen.
Die ASF ist wohl besser als ihr Ruf und bei den ARMs kommt man wohl auch
nicht mehr drum herum. Jedenfalls solange sie gewünschte
Funktionalitäten abdeckt. Gerade das TWI-Modul ist da etwas rudimentär,
es unterstützt keine interrupt-basierten Abläufe.
Für einfache Sachen, zB. Konfiguration eines PWMs, hat die ASF genau die
Funktionen, die man sich ansonsten selber schreiben würde.
Hallo liebe Gemeinde,
ich habe versucht das Beispiel von Michael auf TWI0 anzupassen ohne
Erfolg.
Ich habe es als .zip in den Anhang gepackt vielleicht kann mir jemand
helfen. Ich nutze einen ATSAM4E8C. Vielen Dank
VG