Forum: Mikrocontroller und Digitale Elektronik SPI geht nicht richtig auf stm32


von Alfred (Gast)


Lesenswert?

Hallo,

Ich nutze sie STM32 lib und ISystem mit code sourcery. Wenn ich den 
Beispielcode aus der Lib nehme dann geht es.
Wenn ich sie allerdings herunterkürtze funktioniert es plötzlich nicht 
mehr.

Habe auf den folgenden Code heruntergekürtzt. die Spi wird eingerichtet 
aber wenn ich etwas schicken will passiert nichts. Im Debugger ist zu 
sehen das nicht in das SPI Datenregister geschrieben wird. Ich verstehe 
nicht warum, da alles da ist was man braucht:

#include "stm32f10x_conf.h"
 /* Private typedef 
-----------------------------------------------------------*/
 /* Private define 
------------------------------------------------------------*/
 /* Private macro 
-------------------------------------------------------------*/
 /* Private variables 
---------------------------------------------------------*/
 SPI_InitTypeDef  SPI_InitStructure;
 /* Private functions 
---------------------------------------------------------*/
 void RCC_Configuration(void);
 void GPIO_Configuration(void);

 int main(void)
 {
   /* System clocks configuration 
---------------------------------------------*/
   RCC_Configuration();

   /* GPIO configuration 
------------------------------------------------------*/
   GPIO_Configuration();

   /* SPI1 configuration 
------------------------------------------------------*/
   SPI_InitStructure.SPI_Direction = SPI_Direction_Tx;
   SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
   SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
   SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
   SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
   SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
   SPI_InitStructure.SPI_CRCPolynomial = 7;
   SPI_Init(SPI1, &SPI_InitStructure);

   /* Enable SPI1 */
   SPI_Cmd(SPI1, ENABLE);

   /* Transfer procedure */

     /* Send SPI1 data */
     SPI_I2S_SendData(SPI1, 0x55);


   while (1)
   {}
 }

 void RCC_Configuration(void)
 {
   /* Enable peripheral clocks 
--------------------------------------------------*/
   /* GPIOA, SPI1 clock enable */
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

 }

 void GPIO_Configuration(void)
 {
   GPIO_InitTypeDef GPIO_InitStructure;

   /* Configure SPI1 pins: SCK, MISO and MOSI 
---------------------------------*/
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIO_Init(GPIOA, &GPIO_InitStructure);

 }

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

- GPIO_Pin_6 sollte Eingang sein.
- Direction "SPI_Direction_1Line_Tx"

Den SPI_BaudRatePrescaler_16 auf 256 erhöhen, dann sieht man es besser 
am Oszi.

In dem "SPI_Init()" sind viele assert_param(), darin z.B. 
IS_SPI_DIRECTION_MODE(), darin wiederum sieht man was für Parameter der 
erwartet.
In Eclipse kommt man da leicht hin, einfach Strg+Linke Maustaste.

von Alfred (Gast)


Lesenswert?

Ich benutze nur spi als Ausgang, wie gesagt es funktioniert erst nach 
meiner kürzung nicht. Der Rest ist Original ST.

von (prx) A. K. (prx)


Lesenswert?

SPI_InitStructure.SPI_Direction ist trotzdem falsch besetzt.

Es könnte helfen, die bei Parameterfehlern aufgerufene Funktion 
assert_failed auch zu nutzen.

von Alfred (Gast)


Lesenswert?

Der Parameter war zwar falsch, aber das Problem besteht weiterhin, 
vieleicht ist einer so nett und kann das mal compilieren.

von (prx) A. K. (prx)


Lesenswert?

Wenn die Langfassung des Programms funktioniert, die Kurzfassung jedoch 
nicht, dann liegt es doch auf der Hand, diese Versionen mal en detail zu 
vergleichen. Und wenn man dabei nichts sieht, dann sukzessive zu kürzen 
um festzustellen, wann genau das Problem auftritt. Oder ist dir das zu 
viel Arbeit, sollen andere suchen?

von Alfred (Gast)


Lesenswert?

Finde diese Antworten einfach nur schade und wenig produktiv. COPY und 
Paste und innerhalb 3 Minuten hätte man eine helfende Antwort, anstatt 
ebenfalls drei Minuten so etwas zu schreiben. Wer nicht helfen will, 
soll es doch einfach lassen! Ich programmiere am STM32 schon länger und 
den der sofort etwas produktives damit angestellt hat, den will ich mal 
sprechen. Ich bin mittlerweile bei einem OVERHEAD von 8k ohne 
irgendetwas wirklich programmiert zu haben. Langsam geht mir die Lib 
aufn Sack.
Wenn man nicht von den Beispielen zu einem eigenem Programm kommt dann 
ist das ganze ST System überflüssig. Das es hier wohl an etwas anderem 
liegt muss man ja auch erstmal wissen. Wer schon spi programmiert hat 
kann normalerweise mit einem Blick sagen was fehlt. Vermutungen helfen 
keinem bei dem complexen Zeugs.

Habe den Fehler gefunden, aber gut überflüssige 8 Stunden daran 
gesessen. Obwohl nicht aufgerufen hatte eine Funktion die SPI Behandlung 
gestört. Da in dieser Funktion aber nichts steht (Platzhalter), weiß ich 
immer noch nicht warum. Aber schön dass es trotzdem jetzt funktioniert.

von (prx) A. K. (prx)


Lesenswert?

Alfred schrieb:

> Finde diese Antworten einfach nur schade und wenig produktiv. COPY und
> Paste und innerhalb 3 Minuten hätte man eine helfende Antwort, anstatt
> ebenfalls drei Minuten so etwas zu schreiben.

Danke für die Blumen, aber mit einem Beispiel unter der Verwendung der 
FWlib konnte ich nicht dienen, da ich die nicht verwende ...

> Ich bin mittlerweile bei einem OVERHEAD von 8k ohne
> irgendetwas wirklich programmiert zu haben. Langsam geht mir die Lib
> aufn Sack.

.... was mir beispielsweise diesen Overhead erspart. Allerdings kriegt 
man den beim GCC ggf. auch mit ein paar Compileroptionen weg. 
Grobrichtung
  -ffunction-sections
  -fdata-sections
für die FWlib (und nur die), sowie
  --gc-sections
beim Linken. Allerdings muss man dann aufpassen, dass Int-Handler nicht 
ebenfalls verschwinden.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Schön, dass es jetzt geht. Wenn es irgendwo anders was rein gespuckt 
hat, konnte sowiso niemand weiter helfen...

Den obigen Code habe ich mit meinem ja schon heute Morgen verglichen und 
die Diffs gepostet. (Ich nutze den um ein EA-DOG Display zu beschreiben)

von Alfred (Gast)


Lesenswert?

Ich bin mir nicht so sicher das alles laufen wird, da ich z.B. das 
Linker Script irgendwoher habe. Wenn ich das nicht übersehen habe 
liefert die ST nicht mit. Die die ich bei den Beispielen gefunden habe 
funktionieren bei mir nicht.

>Schön, dass es jetzt geht. Wenn es irgendwo anders was rein gespuckt
hat, konnte sowiso niemand weiter helfen...

Daher mein Wunsch, das es ein anderer compiliert, wenn es da 
funktioniert hätte, bräuchte ich an dieser Stelle nicht weitersuchen.

Mit der Lib werde ich mal sehen, das Problem ist das alles miteinander 
vernetzt ist. Entweder man verabschiedet sich davon, oder eben nicht. 
Ich suche noch nach der Möglichkeit z.B. die lib mit Option und meine 
Sachen ohne Option zu compilieren.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Man bindet einfach die LIB ein, nutz z.B. die Initialisierung der 
Pheriperie und schaut dann was in den Regsitern drin steht.

Später, wenn alles läuft kann auch direkt in die Register die Zahl 
geschrieben werden, ohne LIB.

Die Regsiter "Manuell" zu nutzen, ohne LIB ist auch nicht sehr schwer.

Ich nutze gerne die LIB. Hat auch einen Vorteil:
Wenn man irgend etwas benutzt, dann kann man durch das ganze Projekt 
nach dem gleichen Befehl suchen, und findet so schnell heraus wo evt. 
das gleiche "Doppelt belegt" ist/wurde.

Ich habe viele C-Dateien, eine für LCD, eine für Seriell, eine für 
Timer, eine für Dimmer usw. Diese nutzen z.B. Timer. Wenn ich ein neues 
Projekt mache, dann stupfe ich mir das ganze zusammen und dann muss ich 
schauen dass das eine Modul nicht den gleichen Timer nutzt wie ein 
anderes.

Die Lib hilft zumindest sehr einen Überblick zu behalten und die 
Struktur ist auch nicht kryptisch. Ist zwar etwas lästig eine komplexe 
Struktur auszufüllen, anstatt ein Register mit einem Hex Code zu 
beschreiben, dafür wartungsfreundlicher.

Die 8KB Lib-Overhead sind doch auch nicht so viel (=teuer). Ich nutze 
sowiso nur noch die 256KB Variante und derzeit bin ich bei 110KB 
Flash-Nutzung.
Wenn man was sparen möchte, dann kann man immernoch die 
Compilleroptionen aktivieren, dann spart man etwa 1/3 Platz. Ist aber 
nur Sinnvoll für Produktion, denn der kleinere Code ist sehr schwer 
debugbar.

von Alfred (Gast)


Lesenswert?

Ich bin langsam völlig verzweifelt und habe so eine Art HENNE EI 
Problem. Ich bin mir nicht sicher was läuft und was nicht.

Ich habe einen STM32f105VC und daran einen ISYSTEM 5000 (6K €), also 
eigendlich gut ausgestattet. Das ganze wird mit codesourcery compiliert.

Nachdem ich nun wieder und wieder ein Grundsystem aufgestellt habe und 
nach euren Infos (sorry, bin langsam echt gereizt) alles 
heruntergekürtzt hatte, schien alles zu laufen. Als ich dann meine 
restlichen GPIOS wieder zuschalten wollte ging es wieder nicht. Dann 
habe ich mal alles auf Anfang gesetzt und RCC und GPIOs gesetzt. GING?
Dann habe ich im main.c nur GPIO_InitTypeDef GPIO_InitStructure; in die 
Main geholt, dann absturz (???). lege ich sie wieder in den globalen 
bereich gehts wieder. OK dachte ich, jetzt lagere ich den 
Initialisierungsteil der in der Main funktioniert in eine Funktion. Habe 
die GPIO_InitTypeDef GPIO_InitStructure; extern gesetzt und wieder geht 
nichts.
WAS mache ich nur falsch, ähnlich schauerlich reagierte heute morgen 
spi.
Ich weiß nicht mehr ob ich etwas falsch mache oder vieleicht meine 
Umgebung spinnt, oder das Linker script.

Frage: Kann mir einer mal eine komplett lauffähige Umgebung geben mit 
allem was dazu gehört. Ich weiß langsam nicht mehr vor und zurück. 
Irgendwas scheint nicht zu stimmen sobalt große Variablen beschrieben 
werden.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Lauffähige Umgebung ist hier Beschrieben: STM32 Artikel (Siehe Teil 
Installation für...)
Auch gibt es ein Demo-Projekt von Martin Thomas für Eclipse.

von (prx) A. K. (prx)


Lesenswert?

Alfred schrieb:

> Ich habe einen STM32f105VC und daran einen ISYSTEM 5000 (6K €), also
> eigendlich gut ausgestattet. Das ganze wird mit codesourcery compiliert.

Codesourcery bedeutet, dass man an manchen Stellen selber Hand anlegen 
muss, wo einem dies in kommerziellen Entwicklungssystemen abgenommen 
wird. Wie beispielsweise beim Startup und beim Debugging mit OpenOCD. 
Geld scheint ja da zu sein.

> Frage: Kann mir einer mal eine komplett lauffähige Umgebung geben mit
> allem was dazu gehört.

Sorry, ich verwende Crossworks.

Andererseits hast du hier nie dein komplettes Projekt abgeladen, so 
dass auch keiner darin nach den Trüffeln schnüffeln kann.

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.