Forum: Mikrocontroller und Digitale Elektronik STM32L053 libopencm3 und SPI


von Ralph S. (jjflash)


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).

von Ralph S. (jjflash)


Lesenswert?

Ach so, ja:

PS: wer Schreib- und/oder Grammatikfehler findet, darf diese 
unentgeldlich zu seiner eigenen Belustigung behalten und mit diesen 
anfangen was immer er/sie möchte !

von Christopher J. (christopher_j23)


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.

von Curby23523 N. (Gast)


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.

von Christopher J. (christopher_j23)


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

von Ralph S. (jjflash)


Lesenswert?

... ich habs hinbekommen. Prinzipiell ist alles einfach, wenns mal geht. 
Aus mir nicht erfindlichen Gründen läufts auf PB3 bis PB5... und auf PA 
nicht...

von Christopher J. (christopher_j23)


Lesenswert?

Was denn hinbekommen? libopencm3 oder direkter Registerzugriff? Ist es 
ein STM32L053C6/8 bzw R6/8? Ich nehme mal an du meinst SPI1 an PB3, PB4 
und PB5 bzw. PA5, PA6, PA7.

von jjflash (Gast)


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")

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.