Forum: Mikrocontroller und Digitale Elektronik STM32F030 + I2C + libopencm3


von Ralph S. (jjflash)


Lesenswert?

... und wieder ein Problem mit Software die ich nicht selbst geschrieben 
habe !!!

( ... und ich höre schon, was mir W.S. - wer immer das auch ist - 
schreiben wird: machs selbst und hör auf fertige Libraries zu verwenden 
).

... und auf selbstschreiben wirds wieder mal hinauslaufen.

Folgendes Problem:

mit libopencm3 funktionierte ein STM32F103 in Verbindung mit I2C 
klaglos. Ein einfacheres Programm sollte nun auf eben einen STM32F030 
übertragen werden und damit fängt jetzt mein Problem an.

Die Lib bietet keine "richtige" Unterstützung für STM32F030 an.
Der Header und die dazugehörige Source i2c_common_all wird nicht mit 
eingebunden.

Naaaaaatürlich hat es nicht funktioniert, dem Linker einfach zu sagen: 
binde mir das mit ein (denn es hat wohl einen Grund warum das in der 
"offiziellen" Library nicht eingebunden ist.

Wenn ich mir das Datenblatt zum F0 richtig anschaue (und ich habe eine 
neue Brille) komme ich zu folgendem:

Die Belegungen (und nicht nur der Bitpositionen) der Register der 
Library  bspw. I2C_CR2 stimmen in keinster Weise mit dem Datenblatt 
überein.

Spinne ich jetzt komplett und seh irgendwas nicht richtig oder wurde in 
libopencm3 wirklich die I2C Unterstützung "vergessen" ???

Beispielsauszug von i2c_common_all.c (im Ordner für F0)
1
void i2c_set_clock_frequency(uint32_t i2c, uint8_t freq)
2
{
3
         uint16_t reg16;
4
         reg16 = I2C_CR2(i2c) & 0xffc0; /* Clear bits [5:0]. */
5
         reg16 |= freq;
6
         I2C_CR2(i2c) = reg16;
7
}

Würde bedeuten, dass die Bits 0..5 die Taktfrequenz einstellt.

Lt. Datenblatt sind die Bits hier Slave-Adress-Bits
(Quelle Datenblatt RM0360 Seite 581)

Sehe ich das richtig ??? (und ... hrmpf .... wenn ich da recht habe 
bleibt mir dann nichts anderes übrig, als ein I2C selbst neu zu machen)

Für den Fall dass jemand dasselbe Problem mit libopencm3 hatte und es 
(also das Problem : - ) ) gelöst hat... Zeigst du mir deine Lösung ?

Gruß Ralph

PS ... und gleich an W.S ... ich weiß: selbstmachen (Faulheit holt einen 
immer wieder ein)

PS2 ... für den Moment habe ich mir beholfen, eine Software I2C Funktion 
zu implementieren. Schön ist das allerdings nicht !

von Gerd E. (robberknight)


Lesenswert?

Ich kenne die libopencm3 nicht wirklich, daher weiß ich nicht ob das 
hier das Problem ist:

Beim STM32F0 hat ST (zum Glück) eine im Vergleich zum STM32F1 deutlich 
überarbeitete Version der I2C-Hardware verbaut. Die vom STM32F1 hat 
einige Bugs und ist sehr zickig anzusteuern.

Es kann sein daß die libopencm3 hier nicht richtig an die neue Hardware 
angepasst ist.

von Ralph S. (jjflash)


Lesenswert?

Gerd E. schrieb:
> Es kann sein daß die libopencm3 hier nicht richtig an die neue Hardware
> angepasst ist.

Genau das ist ja meine Frage, ob das so ist !

von Christopher J. (christopher_j23)


Lesenswert?

Ja, für den F0 fehlt in der libopencm3 die I2C Implementierung bzw. die 
Vorhandene ist so nicht korrekt. Hier ist der Bug-Report dazu: 
https://github.com/libopencm3/libopencm3/issues/586

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.