Forum: Mikrocontroller und Digitale Elektronik STM32F4 I2C hängt sich auf (Busy und Timeout)


von Matthias F. (frank91)


Lesenswert?

Hallo alle zusammen :P

Ich benutze das STM324x91-Eval Entwicklungsboard und habe einen 
separaten IC an das I2C angeschlossen.

Aber ich habe ein ähnliches Problem wie folgender User:
https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=https%3a%2f%2fmy%2est%2ecom%2fpublic%2fSTe2ecommunities%2fmcu%2fLists%2fcortex_mx_stm32%2fSTM32F103XX%20I2C%20Busy%20Flag%20after%20unsuccessful%20transfer&FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&currentviews=458

Wenn ich den Befehl "HAL_I2C_Mem_Read" ausführe kommt es gelegentlich zu 
einem Timeout error.
Manchmal funktioniert der nächste Befehl wieder, manchmal kommt beim 
nächsten
Befehl allerdings eine "Busy Meldung". Diese bekomme ich dann nicht mehr 
weg.

Wenn ich in diesem Zustand SDA und SCL messe fällt auf, dass SCL zwar 
auf high ist SDA aber aucf low. Außerdem kommen keine Clock Signale 
mehr.
Why this error hapens and what can i do?

Warum passiert dieser Fehler und was kann man dagegen tun?

Im Link weiter oben, werden folgende Zeilen als abhilfe verwendet.

SET_BIT(hi2c1.Instance->CR1, I2C_CR1_STOP);
I2C_WaitOnFlagUntilTimeout(&hi2c1, I2C_FLAG_BUSY, SET, 1000);

Wenn ich diese in meinen Code einfüge tritt er Fehler allerdings 
weiterhin auf.
Allerdings sind die Spannungen an SDA und SCL nach dem Fehler nicht 
immer gleich. Manchmal sind beide Unterschiedlich, manchmal sind beide 
Signale low oder High.
Erst nach einem Hardware Reset sind wieder Clock Signale zu erkennen.

Hier ist mein verwendeter Code:
1
zaehler =0;
2
  do
3
  {
4
    while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY);
5
     test = HAL_I2C_Mem_Read(&hi2c1, panel_touch_adresse, adresse_anpassen(mxt_object_message_count_t44.start_address), I2C_MEMADD_SIZE_16BIT, (uint8_t *)buffer, mxt_object_message_count_t44.size_minus_one +1, 100);
6
7
     if(test == HAL_ERROR)
8
     {
9
       HAL_GPIO_WritePin(GPIOG, GPIO_PIN_7, RESET);
10
       HAL_Delay(1000);
11
     }
12
     if(test == HAL_BUSY)
13
     {
14
       HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_10);
15
       HAL_Delay(1000);
16
17
18
       SET_BIT(hi2c1.Instance->CR1, I2C_CR1_STOP);
19
       I2C_WaitOnFlagUntilTimeout(&hi2c1, I2C_FLAG_BUSY, SET, 1000,HAL_GetTick());
20
     }
21
     if(test == HAL_TIMEOUT)
22
     {
23
       HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_12);
24
       HAL_Delay(1000);
25
     }
26
27
28
     zaehler++;
29
     if (zaehler >=2) test = HAL_OK; //Nicht ok. Ich breche auf diese Weise die Schleife ab
30
31
32
  }while(test != HAL_OK);

von ui (Gast)


Lesenswert?

Wie stellst du sicher das der am I2C angeschlossene IC richtig 
antwortet? Stimmen die ACK Bits? Passt das mit dem Timing immer? Oder 
hängt sich vielleicht der IC auf?

von Matthias F. (frank91)


Lesenswert?

Also ich denke langsam immer mehr, dass es sich um ein  EMV Problem 
handelt.

Also es ist so: (Hoffentlich versteht man es wie ich es meine)
Wie gesagt verwende ich das  STM324x91-Eval Entwicklungsboard.
Ich besitze 3 Displays:
-Das 4 Zoll Display des Entwicklungsboardes, welches direkt aufgesteckt 
wird
-Ein 7 Zoll Display
-Ein weiteres (anderes) 7 Zoll Display

Bei dem 4 Zoll Display sind bis jetzt keine Probleme mit dem I2C 
aufgefallen.

Das 4" Display habe ich wegmontiert und 2 Adapter gebastelt, welcher 
mittels freiluftverdrahtung die Belegung auf die 2 7" Displays anpasst.
Das Radio rauscht auch leicht, wenn ich diese Schaltungen in Betrieb 
nehme. Sie funktionieren aber.

Verwende ich das erste 7 Zoll Display kommt der Beschriebene Fehler vor, 
wenn auch selten.

Verwende ich das erste 7" Display allerdings statt seinem Touch 
Controller mit dem Touch des zweiten 7" Displays an, tritt der Fehler 
häufiger auf.

Verwende ich das zweite 7 Zoll Display inklusive seines Touch 
Controllers erkennt das Touch Dinge, die es gar nicht gibt.


Ich hoffe, dass sobald ich eine richtige (EMV gerechte) Platine daraus 
mache, das Problem nicht mehr auftritt :-/

von Matthias F. (frank91)


Lesenswert?

Aber dennoch muss es doch irgendwie eine Möglichkeit geben, den I2C 
wieder läuffähig zu machen, wenn ein Fehler erkannt wird.

Kennt hier jemand einen Weg?

von I2CUser (Gast)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.