STM32L053 libopencm3 und SPI

OP #5270563
Lesenswert?

Ich werkel gerade mit einem STM32L053 in Verbindung mit libopencm3 und 
ich dachte (nachdem es blinkt, I2c und USART geht) ich hätte es halbwegs 
im Griff und doch ist es Pustekuchen.

Ich wollte nun SPI in Betrieb nehmen und muß mit Erschrecken 
feststellen, dass es mit libopencm3 und STM32L0 keine implementierten 
SPI-Funktionen gibt.

Okay, dachte ich mir: Datenblätter STM32F0 und L0 verglichen und die 
Unterschiede anpassen => geht nicht.

Die Änderungen quer durch die lib sind so umfangreich, dass man die nur 
sehr schwerlich posten kann, deshalb schlicht meine Frage:

Hat das hier schon jemand gemacht, eine SPI-Funktionalität für STM32L0 
in Verbindung mit libopencm3?
Würde dieser jemand mir evtl. seine Funktionen zur Verfügung stellen?

(im Moment bin ich am Überlegen, ob ich den SPI-Teil komplett in 
bare-metall machen sollte und mich durch alle Registeradressen 
durchkämpfen, aber auch das ist ein irrer Wust).
#5270613
Lesenswert?

Die SPI-Schnittstelle ist zwischen F0 und L0 tatsächlich verschieden. 
Erfahrungen mit dem L0 habe ich mit libopencm3 bisher noch keine. Nach 
einem Blick ins Datenblatt sieht das für mich folgendermaßen aus:
- F0, F3, F7 und L4 haben identische Registermaps
- F4 und L0 haben identische Registermaps

Von daher würde ich einfach mal die Implementierung aus der 
Schnittstelle des F4 "klauen", d.h. die spi.h aus 
include/libopencm3/stm32/f4 und die spi.c aus lib/stm32/f4 in das 
jeweilige Verzeichnis des L0 kopieren, in include/libopencm3/stm32/spi.h 
noch ein #elif für den L0 einfügen und im Makefile in lib/stm32/l0 noch 
die objects für SPI (nach Vorlage aus F4) einfügen.
Gast #5270654
Lesenswert?

Die STM32 Register - gerade für SPI - sind so gut wie gar nicht 
komplexer als jene eines Atmegas. Bitmasken sind auch definiert. Ich 
brauche ganze 3 (drei) Zeilen, um bei einem STM32F4 das SPI mit 
Registern zu parametrieren. Faustregel: Sehr viel dieser Register 
einfach auf 0 lassen.

Einfach mal versuchen.
#5270934
Lesenswert?

Ich kann mich Nils nur anschließen. SPI ist wirklich kein Hexenwerk. Es 
gibt zum einen ein bisschen Beispielcode im Handbuch und zum anderen 
gibt es für F0 und L0 auch noch die "STM32 snippets", was ebenfalls 
Beispiele direkt auf Registerebene sind:
http://www.st.com/en/embedded-software/stm32snippets.html.

Direktdownload für den L0: 
http://www.st.com/resource/en/firmware/stm32snippetsl0.zip
Gast #5271907
Lesenswert?

Ich habe die libopencm3 Bibliothek erweitert, auf Basis der STM32F0 
Sourcen und ein paar Register umbenannt. Leider scheint es bei L0 nicht 
mehr möglich zu sein, die Bits eines Datenframes zu bestimmen, es sind 
nun entweder 8 oder 16 Datenbits.

Außerdem happert es noch mit einem Register, welches erkennt, ob ein 
Frame bereits gesendet ist oder nicht (SPI_CR_BSY Flag).

Und ja, ich meinte PB3, PB4, BP5. Warum es mit PA5, PA6 und PA7 nicht 
klappt weiß ich noch nicht, vllt. liegts auch an der Beschaltung vom mir 
verwendeten Discovery-Board.

Außerdem hab ich noch einen Bug bei der Systeminitialisierung behoben:

Die "Corespannung" muß, bevor an den RCC-Einstellung etwas geändert 
wird, auf 1,8V angehoben werden, damit der max. Systemtakt von 32MHz 
erreichbar ist.

Fürs erste gebe ich mich so wie es ist zufrieden, SPI-Displays laufen 
zufriedenstellend.

(Ja, ich war so verrückt, nachdem ich mit dem E-Paper Display gespielt 
habe, dieses vom Discovery zu entfernen. Eigentlich wollte ich ein 
universelles Modul aus diesem Display machen, aber leider ist mir das 
Teil beim abheben von der Discoveryplatine zerbrochen. Der Kleber war 
dann zu hartnäckig. Jetzt ist anstelle des Displays ein kleines 
Steckbrett und ich habe das somit zu einem Experimentierboard 
"umgefrickelt")

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren