Ich versuche, meiner ferngesteuerten Drohne ein I2C-Display hinzuzufügen. Ich bekomme das Display nicht zum Laufen. Ich nahm den gleichen Code und kopierte ihn auf einen stm32f303k8 Nucleo und brachte das Display zum Laufen. Ich habe den Code zurück auf die Drohne verschoben und auf dem STM32F303cc-Prozessor getestet. Es funktioniert nicht. Die folgenden Signale bilden genau dieselbe Codezeile, die auf beiden Chips über I2c geht. Nun, natürlich neu kompiliert im cubemx-Framework für die verschiedenen Chips. Die gelbe Linie ist scl. Die blaue Linie die Uhr. Die gelbe Linie mit den Schnörkeln stammt von der Drohne, die nicht funktioniert. Die anderen 2 stammen vom Arbeitskern. Was stimmt nicht mit dem Signal auf der Drohne, dem stm32f303cc-Chip? Warum ist es wirklich schnörkellos. Beide haben Pull-Widerstände 2,2k und 4,7k. Warum ist die gelbe Linie unten, oberes Bild, 50/50 zwischen hoch und niedrig aufteilen, was wie das Bestätigungsbit aussieht? Danke
geteilt 50/50 zwischen Hoch und Tief auf dem, was wie das Bestätigungsbit aussieht
[...]
Es sieht aus wie ein Tauziehen zwischen Hoch und Tief auf dem Ack
Richtig, und das bedeutet, dass der I 2 C-Master die SDA-Leitung nicht tatsächlich freigegeben hat, damit der I 2 C-Slave die Bestätigung ausführen kann.
Das bedeutet wiederum, dass die GPIO-Pins, die für den I 2 C-Bus auf dem I 2 C-Master verwendet werden (wahrscheinlich beide Pins, aber sicherlich SDA) falsch konfiguriert und auf ihrer Standardeinstellung „Push-Pull“ belassen und nicht umgeschaltet wurden "Open-Drain", wie es für den I 2 C-Betrieb erforderlich ist.
Das verursacht das "Tauziehen", wie Sie es beschrieben haben, oder wie glen_geek sagte: "Warum zieht die SDA-Leitung nicht bis zum Boden?" Die Antwort ist, dass SDA (und wahrscheinlich auch SCL, aber die meisten Slaves versuchen nicht, es zu fahren) immer noch angesteuert ( von einem GPIO-Pin, der immer noch als "Push-Pull" konfiguriert ist) und nicht freigegeben wird (nur mit passivem Pull-up). ) wie ein "Open-Drain" -Pin wäre.
Wenn Sie sich auf STM32CubeMX verlassen, um den Initialisierungscode zu schreiben, dann haben Sie entweder gerade einen Fehler in der von Ihnen verwendeten Version entdeckt (suchen Sie nach Updates und Errata) oder sie falsch konfiguriert (ich verwende es nicht, also kann es sein). sagen Ihnen nicht, welche Einstellung falsch sein könnte).
Beim Nucleo liegt der I2C auf I2C1. Auf der Drohne ist es auf I2C2.
Die I 2 C-Ports unterscheiden sich also zwischen den funktionierenden und nicht funktionierenden Konfigurationen. Das könnte leicht erklären, warum Ihr Problem nur bei einer Konfiguration auftritt, wenn das STM32CubeMX-Framework I2C2 nicht korrekt initialisiert (und es gab Port-Initialisierungsfehler, die nur einige Ports betreffen).
glen_geek
Jeffrey Edward Messikian
SamGibson
Jeffrey Edward Messikian