ich brauche Eure Hilfe bei meinem lab@home-Projekt.
Seit mehreren Tagen suche einen Fehler im Design rund um den NAU88C22 Codec und finde ihn nicht. Vielleicht ist das Design für den einen oder anderen interessant. Zumindest einige von Euch haben eine Vorstellung, wenn sie diese Liste lesen: ESP32s3 + STM32G431 + NAU88C22 + DRV8313 + MAX3485 + SN65HVD230 + 4x WS2812 + LSM6DS3 + AHT20 + DS18B20 + IP5306 + TPS54202 + ST7789 + (optional: W5500 | NRF24l01 | SIM7080G | RFM95W) :-)
Das Problem ist schnell formuliert: Der NAU88C22 ist nicht per I2C erreichbar. Ich bekomme also auf ein Ping mit seiner Adresse kein ACK.
Was habe ich bereits getestet (und welche Fehler ich damit ausschließen wollte):
Mehrfach Pinbelegungen im Datenblatt geprüft (Flüchtigkeitsfehler ausschließen)
Mehrfach Referenzschaltplan und Schaltplan anderer Projekte mit dem NAU88C22 gegengeprüft (Flüchtigkeitsfehler ausschließen)
BOM/CPL-Datei überprüft zumindest der relevanten Bauteile rund um den NAU88C22 und dem I2C-Bus (Bestückungsfehler ausschließen)
Optische Kontrolle der Leiterbahnen und der Lötstellen (Lötfehler)
Die anderen Geräte am Bus abgefragt (Fehler in der I2C-Konfiguration des ESP32 oder im Bus-Layout)
Versorgungsspannungen an den 3,3V und 5V-Leitungen gemessen. Spannung am MODE-Pin gemessen. Verbindung der I2C-Pins des NAU (16 und 17) mit den entsprechenden Pins am ESP32 geprüft (Lötfehler)
Kompletten Scan über alle 127 I2C-Adressen gemacht (irgendwelche Verwechslungen mit 7bit/8bit-Addressen)
Zweite Platine getestet (habe fünf bestellt) (Einzelfehler)
Tja, was soll ich sagen - ich finde einfach keinen Grund, weshalb der NAU88C22 nicht per I2C erreichbar ist. Auf einen Seriendefekt des Bausteins oder auf Bestückungsfehler seitens JLCPCB möchte ich das Problem nicht schieben. Vermutlich ist es etwas peinlich Triviales... Bitte helft mir!
Ja, es gibt nur den einen I2C-Bus. Der STM32 arbeitet da quasi als i/o extender (quasi PCA9685+PCA9655+ADS1115+MCP4725). Zum jetzigen Zeitpunkt ist er aber noch stillgelegt. Also: Alle Pins High-Z.
Eventuell ist der 4K7 Pullup zu hochohmig. Es sind doch viele ICs dran angeschlossen, was die Anstiegsflanke ziemlich verschleift. Schon Mal mit einem Oszilloskop gemessen?
Eventuell ist der 4K7 Pullup zu hochohmig. Es sind doch viele ICs dran
angeschlossen, was die Anstiegsflanke ziemlich verschleift. Schon Mal
mit einem Oszilloskop gemessen?
Anbei eine die Hardcopy eines ständigen Pings auf die Adresse des NAU88C22. Sieht m.E. ok aus.
Ich hatte zum Testen übrigens sowohl auf SDA als auch auf SCL einen weiteren 4K7 parallel geschaltet. Damit komme ich auf 2k35 und damit nahe an die empfohlene Untergrenze des PullUp von 2k0 ran.
Ich habe den ESP32 zum Testen mal ruhig gestellt (direkt eine Endlos-Schleife) und dafür mal den STM32 aufgeweckt und mit dem Arduino-Framework einen I2C-Scanner implementiert. Der findet alle I2C-Teilnehmer, also den AHT20, den LSM6 UND (!!!!) den NAU88C22 auf Adresse 0x1A.
Natürlich direkt den umgekehrten Weg ausprobiert (STM32 ruhig stellen und ESP32 wieder als I2C-Master einsetzen), aber kein Erfolg.
Einen Reim darauf machen kann ich mir noch nicht, aber zumindest unter bestimmten (magischen?) Umständen scheint die Hardware mal zu funktionieren. Sind das irgendwelche hauchzarten Timing-Themen beim ESP32?
Uuups, nein, darf er nicht, er muss auf V_DDIO, also in meinem Fall auf 3V3. Vielen lieben Dank für den Hinweis! Schaltplan und Layout habe ich lokal bereits korrigiert und werde das zeitnah im Github bereit stellen!
Leider löst das aber nicht das Problem. Wie aus dem Schaltplan (möglicherweise nicht deutlich genug) hervorgeht, ist der BMx280 alternativ zum AHT20 zu bestücken. Derzeit ist er NICHT bestückt. Übrigens werden derzeit auch ganzen "Steckplätze" für die diversen I2C-Module (SCD40, BH1750 ...) nicht genutzt.
Bei meinem derzeitigen Test hängen konkret folgende Teilnehmer am I2C-Bus:
NAU88C22
AHT20
LSM6DS3
STM32 (zumindest, wenn die I2C-Slave-Variante der Firmware im Flash ist)
Mit einem komplett reduzieren Testprogramm, das im ESP-IDF nur den I2C initialisiert und dann einen "Probe" auf die Adresse des NAU88C22 macht, bekam ich ein Acknowledge. Den Code habe ich quasi 1:1 aus meinem Hauptprojekt übernommen.
Es scheint, als gäbe es eine sehr seltsame Wechselwirkung in meinem Hauptcode, die aber offensichtlich nur die I2C-Adresse 0x1A betrifft. Jedenfalls habe ich einen funktionierenden Startpunkt, von dem ich jetzt selbst weiter forschen kann. Ich werde jetzt mal meinen Hauptcode komplett reduzieren und dann Schritt für Schritt wieder aufbauen. Hoffentlich komme ich dadurch dem Problem auf die Schliche. Meine Vermutung, dass ich im Hardware-Design einen Fehler gemacht habe, hat sich nicht bestätigt.
Euch allen möchte ich für Eure Unterstützung sehr herzlich danken!
ich melde mich wieder - das Problem ist noch nicht gelöst. Die Aussage aus dem vorherigen Post muss ich insofern erweitern, als dass es sich dabei um einen sehr sehr seltenen Ausnahmefall gehandelt hat. Per Log zweifelsfrei dokumentieren konnte ich das nur noch ein einziges mal.
Spannend ist aber das folgende: Ich habe testweise den ESP32 zum Nichtstun animiert (app_main(){while(true) vTaskDelay(100)}) und den STM32 zum I2C-Master gemacht und einen I2C-Scanner implementiert. Zur Erinnerung: der STM32 arbeitet eigentlich als I2C-Slave als I/O-Expander für den ESP32. Der STM32 findet den NAU88C22 immer! Ich habe auch dann eine Aufnahme mit dem Oszilloskop gemacht, um mögliche Unterschiede zu erkennen. Was fällt da auf?: Bei STM32 ändert sich SDA mit nicht sichtbarer Verzögerung, wenn SCL auf Low geht, beim ESP32 gibt es eine sichtbare Verzögerung von etwa 1us. Beides ist meines Erachtens OK, wobei mir das Verhalten des ESP32 fast besser gefällt...
Ich habe wegen dieser Thematik bereits hier https://www.esp32.com/viewtopic.php?f=13&t=41437&start=10 einen Thread gestartet, aber ein Ergebnis haben wir leider noch nicht. Vielleicht gibt es unter Euch noch jemanden, der mit einen Tipp, Rat oder Hinweis geben kann?