Hallo auch, ich brüte schon seit ein paar Tagen an der I2C Kommunikation (mit EEPROM, Display) an einem STM32F103RFT6. Die Pins PB10/11 führen die Signale SCL/SDA des 2. I2C Interfaces (I2C2). Pullups 3.6k sind dran. Selbst in einem minimalsten Testprogramm regt sich an den Leitungen nichts, dauerhafter Highpegel. Im Debugger sind alle notwendigen Register der RCC, GPIOB und I2C2 korrekt gesetzt. Gleiches Testprogramm für I2C1 konfiguriert, läuft ohne Probleme. Ich habe schon sämtliche Errata's und "googles" durch, nichts gefunden. Meine Hoffnung liegt nun hier. Hat jemand eine evtl Lösung?
Moinsen,
wurde auch beim richtigen Package für die physischen Pins geguckt?
Laut Datenblatt liegen I2C2 SCL/SDA an Pin 29/30 für LQFP-64. Nicht, das versehentlich bei LQFP-100 geguckt wurde und 47/48 vewendet wird.
Grüße, derEine
Sollen wir Hellsehen?
Zeig deinen CODE!
Laut Datenblatt liegen I2C2 SCL/SDA an Pin 29/30 für LQFP-64. Nicht, das versehentlich bei LQFP-100 geguckt wurde und 47/48 vewendet wird.
Einwand berechtigt, ist aber korrekt angeschlossen (SCL: pin 29, PB10 und SDA: pin 30, PB11) Getestet wurde auf 2 verschiedenen Boards mit dem gleichen negativen Ergebnis.
Sollen wir Hellsehen?
Zeig deinen CODE!
Der Code für die Initialisierung, Nutzung der I2C-Schnittstellen dürfte den Wissenden bekannt sein. Es wurde mit verschiedenen Tests geprüft: Bare-Metal, HAL, StdPeripherie, auch mit STMCube erzeugter Code, alles mit gleichem Ergebnis. Das Ding rührt sich nicht.
Gibt es sonst eventuell ein Konflikt mit einer aktivierten USART3 Schnittstelle?
Patrick schrieb:
Laut Datenblatt liegen I2C2 SCL/SDA an Pin 29/30 für LQFP-64. Nicht, das versehentlich bei LQFP-100 geguckt wurde und 47/48 vewendet wird.
Einwand berechtigt, ist aber korrekt angeschlossen (SCL: pin 29, PB10 und SDA: pin 30, PB11) Getestet wurde auf 2 verschiedenen Boards mit dem gleichen negativen Ergebnis.
Gut, an der Hardware liegt es nicht.
Kilo S. schrieb:
Sollen wir Hellsehen?
Zeig deinen CODE!
Der Code für die Initialisierung, Nutzung der I2C-Schnittstellen dürfte den Wissenden bekannt sein. Es wurde mit verschiedenen Tests geprüft: Bare-Metal, HAL, StdPeripherie, auch mit STMCube erzeugter Code, alles mit gleichem Ergebnis. Das Ding rührt sich nicht.
Gut, die Software ist auch ausgeschlossen.
Also muss der Bug im Silizium des Chips sitzen - denn an dir bzw. deiner Schaltung (die du geheim hältst) und deinem Code (den du ebenfalls geheim hältst) kann es schließlich nicht liegen. Beides ist schließlich garantiert fehlerfrei - es stammt ja schließlich von dir. Ergo können wir dir hier nicht weiterhelfen.
Ah, der fehlerfreie perfekte Mensch erbarmt sich zu uns ins niedere Forum auf der Suche nach Hilfe die ja unmöglich auf einen seiner Fehler zurückzuführen sind!
Langsam aber sicher sind doch 90% der Menschheit noch zu doof einen Schuh vol pisse auszuleeren, bei dem die Anleitung dazu auf der Sohle steht!
Goodbye, TROLL!
Gut, die Software ist auch ausgeschlossen.
Also muss der Bug im Silizium des Chips sitzen - denn an dir bzw. deiner Schaltung (die du geheim hältst) und deinem Code (den du ebenfalls geheim hältst) kann es schließlich nicht liegen. Beides ist schließlich garantiert fehlerfrei - es stammt ja schließlich von dir. Ergo können wir dir hier nicht weiterhelfen.
Dabei ist der Code garnicht von mir (CubeMX)
Ah, der fehlerfreie perfekte Mensch erbarmt sich zu uns ins niedere Forum auf der Suche nach Hilfe die ja unmöglich auf einen seiner Fehler zurückzuführen sind!
Schwachsinn, habe ich nie behauptet. Warscheinlich ist mein Ersuchen doch nur für Leute mit entsprechendem Wissen geeignet!
hier noch ein weiterer Test , nutzt die StdPeriph lib.
Kein clock keine Pin Definitionen!
Geräteadresse?...
Du sprichst von Pin 10/11, ich sehe aber nur Pin 6/7 konfiguriert.
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
falsch initialisiert!
F1 benutzt keine Alternate-Function Nummern (GPIO_AF4_I2C2 existiert hier nicht)
Du sprichst von Pin 10/11, ich sehe aber nur Pin 7/8 konfiguriert.
Mist, falsches File. Du hast Recht, ändert aber nix.
Eigentlich haette der Compiler auch eine Warnung schicken sollen (16-bit vs. 8-Bit).
Daher meine Frage bezüglich der Adresse...
Warscheinlich ist mein Ersuchen doch nur für Leute mit entsprechendem Wissen geeignet!
Vorsicht, so hochtrabenden können tief Fallen!
__HAL_RCC_AFIO_CLK_ENABLE();
ist auch richtig, kann weggelassen werden, ändert aber ebenfalls nix. Damit auch die letzten Zweifel ausgeräumt werden: Testumgebung: Visual Studio mit Extension VisualDGB (Compiler GCC) Wie schon gesagt: in der Hardware-Registeransicht sind alle Register von I2C2, GPIOB, RCC korrekt gesetzt, aber es passiert nichts. Ich kan sehen, dass beim Sendeversuch, d.h. I2C2->DR das zu sendende Datum erhält, es bleibt jedoch beim nächsten Singlestep stehen (im Gegenzug zum Test mit I2C1)
Eigentlich haette der Compiler auch eine Warnung schicken sollen (16-bit vs. 8-Bit).
Daher meine Frage bezüglich der Adresse...
???
CubeMX setzt CR2 oft nur für I2C1 korrekt.
1 |
|
2 |
|
3 |
|
I2C2 kann mit JTAG/SWD Pins kollidieren, wenn AFIO falsch konfiguriert ist.
1 |
|
2 |
|
3 |
|
4 |
|
teste mal:
1 |
|
2 |
|
Wenn du mir diese drei Werte gibst, sag ich dir sofort den Fehler:
RCC->CFGR I2C2->CR2 GPIOB->CRH
RCC->CFGR I2C2->CR2 GPIOB->CRH
RCC->CFGR: 0x001d040a I2C2->CR2: 0x00000024 GPIOB->CRH: 0x2848ff42 (CNF/MODE 10,11 = 0x11)
Prüfe:
1 |
|
Wenn ≠0 → Ursache gefunden.
Typische Gründe:
Slave hält SDA
Pull-ups fehlen / zu schwach
vorheriger Reset mitten im Transfer
Debugger Stop während I2C aktiv.
Fix (offizieller ST Workaround)
1 |
|
2 |
|
Vor Init Bus freitakten:
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
Direkt nach Init:
1 |
|
Ausgabe:
1 |
|
BUSY Flag gesetzt, Ursache bestätigt.
Füge direkt nach Init ein:(Schnelllösung)
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
das sollte selbst mit kaputten slaves laufen:
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 |
|
44 |
|
45 |
|
46 |
|
47 |
|
48 |
|
49 |
|
50 |
|
51 |
|
52 |
|
53 |
|
54 |
|
55 |
|
56 |
|
57 |
|
58 |
|
59 |
|
60 |
|
61 |
|
62 |
|
63 |
|
64 |
|
65 |
|
66 |
|
67 |
|
68 |
|
69 |
|
70 |
|
Kilo S. schrieb:
Prüfe:
soweit geprüft! anbei Auszug aus dem Quellcode. Seltsam ist, dass die eingebaute Scannerfunktion tatsächlich die beiden angeschlossenen Slaves auch mit den richtigen Adressen findet. Das Testprogramm eetest() läuft einmal durch und bleibt dann beim nächsten Durchlauf in der single_write(0x20, 0x15) hängen, wartet auf ein gesetztes TXE Bit, was nicht kommt.
Wie zu sehen, die I2C-Funktionen sind in einer Klasse enthalten.
Der F1 ist da pingelig.
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
Hier:
1 |
|
Problem:
| statt ||
prüft das ganze Register statt Flags
ADDR wird nie gelöscht
Der Scanner funktioniert nur zufällig.
Dritter versteckter Bug
In readByte():
1 |
|
Das ist Write-Adresse, nicht Read.
Read müsste sein:
1 |
|
So weit so gut...
versuchs mal hiermit...
versuchs mal hiermit...
Hier mal die Resultate aus deinem Beispiel: Er spricht wieder!!! da ich auf dem Testboard ein EEPROM habe, dass eine 16bit Adresse verlangt, (FM64LC64) habe ich die read/write funktionen noch entsprechend ergänzt und siehe da, was man reinschreibt, kommt auch wieder raus. Jetzt muss ich nur noch ergründen, warum mein Code rum zickt Schon mal Danke Kilo S.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.