mikrocontroller.net

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


Autor: Alfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

 }

Autor: Markus Müller (mmvisual)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alfred (Gast)
Datum:

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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
SPI_InitStructure.SPI_Direction ist trotzdem falsch besetzt.

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

Autor: Alfred (Gast)
Datum:

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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Alfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus Müller (mmvisual)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Alfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus Müller (mmvisual)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus Müller (mmvisual)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.