Ich versuche, in die kapazitive Sensorik einzusteigen und benötige daher eine stabile Kommunikation zwischen einem Arduino und einem TI FDC2114 , der bereits auf einem EVM gelötet ist. Beide unterstützen I2C, und wegen der unterschiedlichen Betriebsspannung von 5 V für den Arduino und 3,3 V für den FDC verwende ich einen PCA9512A bidirektionalen Level-Shifter und 10k-Pullups auf 5 V (Arduino Mega intern) sowie auf 3,3 V.
Beim Scannen der Adresse des FDC bekomme ich manchmal eine positive Antwort (ACK auf dem letzten Takt nach der angeforderten 7-Bit-Adresse), aber meistens ein NACK. Selbst wenn ich ein ACK erhalte, kann der FDC einige Sekunden später den SDA nicht mehr auf 0 V herunterziehen und ich bekomme wieder NACK. Bei NACK kann es helfen, SDA und SCL unter Spannung abzuziehen und wieder einzustecken, aber es funktioniert nicht immer. Ich habe bereits alle Kabel gewechselt, also sollte es kein mechanisches Problem sein. Ich habe auch beobachtet, dass die Spitzenspannung bei SCL 3,4 V und bei SDA mehr als 3,6 V beträgt, aber ich weiß nicht, ob dies zu Problemen führen kann und woher die Spannungsdifferenz stammt.
Bei Verwendung der mitgelieferten MCU des EVM gibt es überhaupt keine Probleme. Was übersehe ich, warum funktioniert es nicht zuverlässig?
Problem gelöst!
Ich habe versucht, den FDC mit einem Arduino Mini Pro 3,3V zum Laufen zu bringen und hatte das gleiche Problem wie zuvor.
Am Ende war die Lösung einfach: Der FDC hat einen Shutdown-Pin (SD), der ihn bei HIGH in den Ruhezustand versetzt und bei LOW aktiv setzt. Als ich SD mit GND verbunden habe, sind alle Probleme verschwunden. Jetzt habe ich ein stabiles Signal zwischen Arduino Mini Pro 3,3V und FDC2114. Ich denke, es würde auch mit dem Arduino Mega und Level Shifter funktionieren, aber ich kann es nicht testen.
Danke nochmal für deine Hilfe.
Es tut mir leid, dass ich die letzten Tage nicht geantwortet habe. Anscheinend funktioniert der PCA9512A nicht mehr, da auf der 3,3V-Seite weder ein Takt- noch ein Datensignal vorhanden ist. Daher habe ich einen Arduino Mini Pro 3,3V bestellt, um das Problem der Pegelverschiebung zu vermeiden, obwohl es besser wäre, das Problem zu lösen, anstatt es nur zu vermeiden. Aber ich möchte in meinem Projekt vorankommen, also scheint dies der schnellste Weg zu sein.
Aber ein paar Punkte zur Klarstellung: In den Schaltplänen sind die Klimmzüge auf der 5V-Seite falsch. Sie sind intern, nicht extern, wie das Bild vermuten lässt. Außerdem sind sie tatsächlich 10k, weil es ein Arduino Mega 2560 ist. Alle Geräte haben eine solide gemeinsame Basis. Ich habe Frequenzen zwischen 100 kHz und 400 kHz ausprobiert, aber keine davon schien zu funktionieren. Der ACC-Pin wird durch einen 10k-Widerstand auf 3,3 V hochgezogen, was Anstiegszeitbeschleuniger ermöglicht. Die Kondensatoren sind so nah wie möglich am FDC.
Da der Levelshifter defekt ist, kann ich keine Tracebilder hochladen. Das tut mir leid, aber trotzdem danke für deine Hilfe.
Der Arduino hat bereits eingebaute Pullup-Widerstände. Dies kann seine Fähigkeit beeinträchtigen, die Leinen weit genug nach unten zu ziehen. Deaktivieren Sie entweder die integrierten Pullups oder entfernen Sie die externen 10-kΩ-Pullups und sehen Sie, ob sich die Situation verbessert.
Hier sind einige Ideen, sorry, wenn Sie sie bereits in Betracht gezogen haben.
Ihr Problem ist möglicherweise kein elektrisches, es könnte logisch sein. Der von Ihnen verwendete I2C-Pegelumsetzer wurde entwickelt, um die START- und STOP-Bedingungen auf dem Bus zu erkennen. Wenn Ihre Software also falsch ist, ist es denkbar, dass sich der Puffer nicht im richtigen Modus befindet.
Wenn Sie die I2S-Kommunikation starten, versuchen Sie, jeder Operation ein START-Bit gefolgt von einem STOP-Bit voranzustellen. Das sollte den Puffer auf den richtigen Zustand zurücksetzen. Untersuchen Sie dann Ihren I2C-Code, um festzustellen, ob es ein Problem bei der Handhabung der STOP-Bedingungen gibt. Verwenden Sie genügend Verzögerungen, damit Ihre I2C-Kommunikationsgeschwindigkeit nicht zu hoch ist. 400kHz sollten zuverlässig funktionieren.
Stellen Sie schließlich in Ihrem I2C-Code im Arduino den Ausgang nicht auf hoch, wenn Sie einen hohen Pegel übertragen möchten. Stellen Sie stattdessen den Pin (SDA oder SCL) ein, der eingegeben werden soll, dann kümmern sich die Widerstände darum, die Pins hoch zu ziehen. Wenn es Ihnen möglich ist, die SDA- und SCL-Pins niemals hoch zu treiben, können Sie den Pegelumsetzer vollständig entfernen und nur den Widerstands-Pull-up auf 3,3 Volt für diese Pins verwenden. 3,3 Volt in den Arduino-Eingangspins sollten hoch genug sein, um einen hohen Zustand zu erkennen.
Beginnen Sie mit einer einfacheren Schaltung - Sie verwenden ein 5-V-Arduino - verwenden Sie einfach ein 3,3-V-Arduino und Ihr 3,3-V-Slave-Gerät. Der atmega328 ist für den 2-5-V-Betrieb bei verschiedenen Geschwindigkeiten ausgelegt. Wenn Sie also Quarz und Eingang austauschen möchten, können Sie den vorhandenen wiederverwenden. Überprüfen Sie einfach das Datenblatt, welche Geschwindigkeiten bei welchen Spannungen ausgeführt werden sollen. Ich habe gelesen, dass einige Leute Glück haben, sogar mit nur 3,3 V auf volle 20 MHz zu gehen. Mit nur dem Arduino und dem Slave-Gerät können Sie sich der Schaltung sicherer sein und die Skizze richtig zum Laufen bringen. Fügen Sie der Schaltung nachträglich Komplexität hinzu, wenn Sie aus irgendeinem Grund das 5-V-Arduino verwenden müssen. Die chinesischen Ebay-Klone funktionieren eigentlich sehr gut, basieren aber normalerweise auf dem atmel 32u4, der USB eingebaut hat, um die Kosten für einen externen Chip zu vermeiden. Der größte Nachteil für sie ist, dass der Versand einen Monat dauert.
Entfernen Sie den Pegelwandler!
Da I2C-Treiber Open-Drain sind, können Sie sie ohne Pegelwandler anschließen.
I2C-Bustreiber sind „Open Drain“, was bedeutet, dass sie die entsprechende Signalleitung auf Low ziehen, aber nicht auf High treiben können.
Ref.: https://learn.sparkfun.com/tutorials/i2c/i2c-at-the-hardware-level
Nick Alexejew
Jot
SamGibson
J. Senf
SamGibson
ACC
Pin am PCA9512A angeschlossen ist. (b) Der physische Ort der Kondensatoren ist wichtig. (c) Sie sagten: " 10k Pullups bis 5V (Arduino Mega intern) " Ein Arduino Mega verwendet die ATmega1280 MCU, aber seine Spezifikation (siehe Seite 355) besagt, dass die internen Pullup-Widerstände irgendwo zwischen 20k und 50k liegen. (e) Ich freue mich darauf, die Oszilloskopspuren zu sehen.nächster Hack
bitsmack