Forum: Mikrocontroller und Digitale Elektronik I2C Problem beim stm32


von peter m. (bastler788)


Lesenswert?

hallo,

ich hab da eine Frage. ich programmiere einen STM32 und hänge da seit 
ein paar tagen am I2C bus fest. prinzipiell läuft der Bus ohne probleme, 
aber ab und zu kommt es dazu, dass der Bus Busy ist und sich dadruch die 
Software aufhängt und nix mehr funktioniert, da er in einer While 
schleife fest hängt.
ein reset im debug modus hilft leider nix, der bus ist dann imer noch 
busy. erst wenn ich die Platine mit dem STM32 von der 
Versorgungsspannung trenne und wieder neu starte ist alles wieder ok.

weis jemand woran das liegt und was man da machen kann? ich benuts die 
Standart Lib des STM32

von Christoph S. (mixer) Benutzerseite


Lesenswert?

Hallo,

kannst du den Bus mitloggen um zu sehen wieso er busy wird?
Um die while-Schleife weg zu bekommen koenntest du das ganze auf 
Interrupts umstellen.

Gruss

von mr. mo (Gast)


Lesenswert?

Die Methode hier habe ich bei WaveShare geklaut, einfach die Events 
auswerten und mit nem Timeout arbeiten:
1
timeout = I2C_Timeout;
2
while(!I2C_CheckEvent(I2C2,  I2C_EVENT_MASTER_BYTE_TRANSMITTED)) {
3
  if((timeout--)==0) {
4
      return 0xFF;
5
  }
6
}

Anstatt dem return 0xFF kann man sich auch eine Meldung per USART 
schicken lassen oder sowas.

von peter m. (bastler788)


Lesenswert?

aber wenn ich die while schleife abbreche bleibt er ja weiterhin busy, 
wenn ich im debug modus bin und resete bringt es ja nichts. ich muss die 
spannungsversorgung kurz weg nehmen damit der bus wieder läuft

von Klaus (Gast)


Lesenswert?

peter müller schrieb:
> ich muss die spannungsversorgung kurz weg nehmen damit der bus wieder
> läuft

Aus der I2C Spec:

> If the data line (SDA) is stuck LOW, the master should send nine clock
> pulses. The device that held the bus LOW should release it sometime
> within those nine clocks.

MfG Klaus

von peter m. (bastler788)


Lesenswert?

Klaus schrieb:
> peter müller schrieb:
>> ich muss die spannungsversorgung kurz weg nehmen damit der bus wieder
>> läuft
>
> Aus der I2C Spec:
>
>> If the data line (SDA) is stuck LOW, the master should send nine clock
>> pulses. The device that held the bus LOW should release it sometime
>> within those nine clocks.
>
> MfG Klaus

was willst du mir bitte damit sagen?

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.