Forum: Mikrocontroller und Digitale Elektronik STM32 - SPI2 will nicht


von Oliver B. (irq)


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
1
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?
1
/* RCC */
2
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
3
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
4
5
/* GPIO */
6
7
/* SPI2 NSS @ PB12 */
8
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_12;
9
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
10
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
11
GPIO_Init(GPIOB, &GPIO_InitStructure);
12
13
/* SPI2 SCK/MISO/MOSI @ PB13/PB14/PB15 */
14
GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15;
15
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
16
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
17
GPIO_Init(GPIOB, &GPIO_InitStructure);
18
19
/* SPI */
20
SPI_InitTypeDef SPI_InitStructure;
21
22
SPI_InitStructure.SPI_Direction         = SPI_Direction_2Lines_FullDuplex;
23
SPI_InitStructure.SPI_Mode              = SPI_Mode_Master;
24
SPI_InitStructure.SPI_DataSize          = SPI_DataSize_8b;
25
SPI_InitStructure.SPI_CPOL              = SPI_CPOL_Low;
26
SPI_InitStructure.SPI_CPHA              = SPI_CPHA_1Edge;
27
SPI_InitStructure.SPI_NSS               = SPI_NSS_Soft;
28
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; // 36MHz/256=140kHz < 400kHz
29
SPI_InitStructure.SPI_FirstBit          = SPI_FirstBit_MSB;
30
SPI_InitStructure.SPI_CRCPolynomial     = 7;
31
SPI_Init(SPI2, &SPI_InitStructure);
32
33
SPI_CalculateCRC(SPI2, DISABLE);
34
SPI_Cmd(SPI2, ENABLE);

Vielen Dank für Anregungen!

von C. H. (hedie)


Lesenswert?

Hallo

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

Hier mein Code für SPI1
1
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   //GPIOB mit einem Takt versorgen
2
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);    //SPI1 Mit einem Takt versorgen
3
4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
5
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
6
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
7
  GPIO_Init(GPIOA, &GPIO_InitStructure);
8
9
/* Config SPI[2] = Master */
10
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
11
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
12
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
13
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
14
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
15
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
16
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
17
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
18
  SPI_InitStructure.SPI_CRCPolynomial = 7;
19
  SPI_Init(SPI1, &SPI_InitStructure);
20
  SPI_Cmd(SPI1, ENABLE);
21
    
22
//Gesendet wird mit:
23
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 :)

von Jean (Gast)


Lesenswert?

Hi,
es fehlen:

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

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

Gruß

von C. H. (hedie)


Lesenswert?

Die hat er doch bereits in seinem code...

von Jean (Gast)


Lesenswert?

Claudio H. schrieb:
> Die hat er doch bereits in seinem code...

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

von Oliver B. (irq)


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

von C. H. (hedie)


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

von Uwe R. (flieger_uwe)


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 ?

von Michael B. (bubi)


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

von Uwe R. (flieger_uwe)


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

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.