mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 - SPI2 will nicht


Autor: Oliver B. (irq)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche vergeblich das SPI2 (Master Mode) eines STM32 (STM32F103RB) 
auf einem STM32-PerformanceStick von Hitex in Gang zu kriegen. Dazu 
verwende ich die STM-Lib und habe mich an den Beispielen orientiert.

Wenn ich versuche über
SPI_I2S_SendData(SPI2, 0xaa);
etwas zu senden, tut sich überhaupt nichts (auch die Clock ist Null auf 
dem Oszi).

Hier mein Code, fällt jemandem vielleicht irgendetwas auf, bzw. hat 
jemand Beispielcode parat, der funktioniert?
/* RCC */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);

/* GPIO */

/* SPI2 NSS @ PB12 */
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

/* SPI2 SCK/MISO/MOSI @ PB13/PB14/PB15 */
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

/* SPI */
SPI_InitTypeDef SPI_InitStructure;

SPI_InitStructure.SPI_Direction         = SPI_Direction_2Lines_FullDuplex;
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_1Edge;
SPI_InitStructure.SPI_NSS               = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; // 36MHz/256=140kHz < 400kHz
SPI_InitStructure.SPI_FirstBit          = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial     = 7;
SPI_Init(SPI2, &SPI_InitStructure);

SPI_CalculateCRC(SPI2, DISABLE);
SPI_Cmd(SPI2, ENABLE);

Vielen Dank für Anregungen!

Autor: Claudio H. (hedie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich habe mich gerade erst damit beschäftigt (gleicher Controller)

Hier mein Code für SPI1
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   //GPIOB mit einem Takt versorgen
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);    //SPI1 Mit einem Takt versorgen

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

/* Config SPI[2] = Master */
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  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_1Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI1, &SPI_InitStructure);
  SPI_Cmd(SPI1, ENABLE);
    
//Gesendet wird mit:
SPI_I2S_SendData(SPI1, 0xFF);

Ich fand die "bedienung" beim STM32 zu beginn sehr umständlich... man 
gewöhnt sich jedoch relativ schnell daran...

Noch ein tipp:
Was man alles mit den einzelnen Peripherie modulen tun kann, findet man 
zudem leicht in den entsprechenden C Files heraus :)

Autor: Jean (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
es fehlen:

  /* Enable GPIOA clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);

    /* SPI1 Periph clock enable */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);

Gruß

Autor: Claudio H. (hedie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die hat er doch bereits in seinem code...

Autor: Jean (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Claudio H. schrieb:
> Die hat er doch bereits in seinem code...

Oje ich habe Tomaten auf den Augen.
Gehe besser ins Bett.

Autor: Oliver B. (irq)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, zur Aufklärung:

Der obige Code ist korrekt, das Problem saß mal wieder vor dem 
Bildschirm. Hier der Hinweis für diejenigen, bei denen er auch nicht 
funktioniert: Man die Funktion in der er steckt auch aufrufen... doh

Autor: Claudio H. (hedie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
glücklicherweise hast du den fehler noch gefunden :)

Ich finde es schön das ich nicht der einzige bin der mit den ST Librarys 
programmiert...

Autor: Uwe Renschler (flieger_uwe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich hab mir das Beispiel angeschaut und mir geht es genauso. Ich habe 
aber offensichtlich auch Tomaten auf den Augen. Ich krieg den SPI2 
einfach nicht zum laufen. Obwohl ich 
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); korrekt dran habe.

Woran lag es denn noch genau ?

Autor: Michael B. (bubi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
da ich leider gerade keinen Zugriff auf die Doku habe,

Meines Wissens gibts auch noch eine Periph Clock für die "Untergruppe" 
Alternatefunctions...(AFIO oda sowas) (bitte in der Doku checken bin mir 
nicht zu 100% sicher).

Und den GPIO Clock brauchst du natürlich auch, mit SPI2 ist es nicht 
getan!

Hoffentlich hilfts dir ein bisschen weiter

Autor: Uwe Renschler (flieger_uwe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Info.
Die AFIO Clock habe ich schon längst an.
Ich hab es allerdings herausgefunden, warum es nicht gleich klappt:
1.) Zuerst den Hardware SS setzen und das SSOE Bit auch UND DANN erst 
den SPI_Init machen. Ansonsten kann der STM32 je nach 
Hardwarebeschaltung meinen, dass er ein Slave ist und ein Handler wird 
angesprungen.

DANKE. Die ersten Gehversuche sind einfach mühsam und ich bin noch am 
Ausnorden, ob Keil oder IAR oder STLib oder MDK und RLink usw.....

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.