Folgendes Problem:
Ein NXT soll Daten von einem STM32F103 empfangen. Der NXT ist Master,
der STM Slave.
Ich bekomme aber kein Adress Match auf dem Debugger, sondern nur BERR.
Dazu schreibt ST:
Also dachte ich, naja vielleicht ist der Takt falsch. Tatsächlich
arbeitet der NXT mit komischen 12kHz, aber selbst nach umstellen bleibt
das Resultat gleich. Wenn ich mit dem STM etwas sende, sehe ich auf dem
Oszi, dass der Takt gleich ist wie beim NXT. Daran kann es also nicht
liegen...
Das hier ist mein Testcode:
Im Anhang: Registerwerte vom Debugger (nachdem der NXT was gesendet hat,
vorher steht alles auf 0)
und
Vom NXT geschicktes Byte.
Elektrische Fehler sind eigentlich ausgeschlossen (Masse ist verbunden,
SDA/SCL nicht vertauscht, und beide Seiten können gegen den Pullup
treiben.)
So langsam gehen mir die Ideen aus, weiss jemand mehr?
Sean Goff schrieb:> Byte_vom_NXT.jpg
Das sieht recht merkwürdig aus. Falls das der NXT als Sender ist, fehlt,
korrekte Adressierung vorausgesetzt, das ACK des STM, das im 9. SCL Takt
eigentlich low werden müsste. Danach (also wenn ACK nicht kommt) sollte
der NXT eigentlich gar nicht mehr an SDA rumfummeln, macht er aber doch
mit der Änderung von SDA, während SCL high bleibt. Diese Bedingung wird
dann vom STM32 als Fehler ausgeworfen.
Prüfe also als erstes, warum vom STM32 kein ACK kommt.
Edit: Kann es sein, das du aus Versehen Adresse 0x02 statt 0x04 benutzt?
Beim abzählen der Clocks kommt mir das so vor, ist auf dem schrägen Foto
aber nicht sooo genau auszumachen.
Matthias Sch. schrieb:> Sean Goff schrieb:>> Byte_vom_NXT.jpg>> Das sieht recht merkwürdig aus. Falls das der NXT als Sender ist, fehlt,> korrekte Adressierung vorausgesetzt, das ACK des STM, das im 9. SCL Takt> eigentlich low werden müsste. Danach (also wenn ACK nicht kommt) sollte> der NXT eigentlich gar nicht mehr an SDA rumfummeln, macht er aber doch> mit der Änderung von SDA, während SCL high bleibt. Diese Bedingung wird> dann vom STM32 als Fehler ausgeworfen.> Prüfe also als erstes, warum vom STM32 kein ACK kommt.> Edit: Kann es sein, das du aus Versehen Adresse 0x02 statt 0x04 benutzt?> Beim abzählen der Clocks kommt mir das so vor, ist auf dem schrägen Foto> aber nicht sooo genau auszumachen.
Ja, ich benutze 0x02 statt 0x04. Das habe ich aber nur testweise
gemacht, weil im Debugger im ADDR Register 0x01 statt 0x02 stand.
Aber heisst das, dass der STM eigentlich richtig konfiguriert ist (halt
mit 2 statt 4)? Er soll einfach auf ein TX Request antworten können. Der
NXT scheint so oder so alles andere als Normkonform zu sein...
Sean Goff schrieb:> Aber heisst das, dass der STM eigentlich richtig konfiguriert ist
Das erfährst du erst dann, wenn die gesendete Adresse des NXT vom STM
mit ACK quittiert wird, also im 9ten SCL low wird.
Nach einem Buserror gibt es übrigens eine von Philips beschriebene Reset
Prozedur. Diese besteht aus dem Senden von bis zu 9 SCL Zyklen, um den
Bus wieder in einen definierten Zustand zu bringen.
John schrieb:> Dein Low-Pegel liegt bei 1V. Das ist zu hoch.
Hilfst du dir jetzt selbst? Kanns mir nicht anders erklären, woher kommt
sonst das Bild..?
Helper schrieb:> Kanns mir nicht anders erklären, woher kommt> sonst das Bild..?
Das ist das Bild vom ersten Post des TO. Ich habe es nur etwas entzerrt.
John schrieb:> Dein Low-Pegel liegt bei 1V. Das ist zu hoch.
Hmm, jetzt wo du das sagst!
Ich habe zwar keine Ahnung, weshalb das so sein soll, denn ich verwende
100k Pullup (ja der NXT soll sehr treiberschwach sein).
Kann es daran liegen? Weil immer als High erkennen tut der STM es ja
nicht, sonst könnte der Fehler doch gar nicht entstehen, oder? Oder kann
es sein, dass das gerade so auf der Schwelle liegt?
Ich weiss das ist etwas mühsam, aber leider kann ich erst nächste Woche
testen vermutlich. Ist ein Schulprojekt, und ich habe weder den NXT noch
das Oszi...
LG, Sean
Danke euch allen, war mal wieder ein ganz blöder Fehler:
Ich habe die Pullups in der Schule dran gemacht, und irgendjemand hatte
die glorreiche Idee 10k Widerstände ins 100k Schächtelchen zu machen :(
Danke an John, ist mir nicht aufgefallen.
Noch ein schönes Wochenende an alle :)
Danke für diese Rückmeldung!
Hatte kürzlich schon das Problem mit fehlendem Pullup. Konnte das nicht
ganz zuordnen, weil es so geklappt hat, wenn ich Rückgabewerte direkt
via UASRT ausgebe (keine Ahnung, wie das passieren kann). Pullup auf dem
Pin eingeschaltet, und schon lief es sauber.
Habe genau diesen Fall auch bei einem Kamera-Modul. Am ATmega328 läuft
das problemlos via Pegelwandler, am STM32 direkt angeschlossen nicht;
selbst beim Bitbang muss ich pfuschen.
4,7kOhm als Pullup ist ganz offensichtlich zu stark. Muss das mal bei
mehr "Motivation zu Aktion" gegentesten. Klingt aber logisch! :)