STM32 - SPI2 will nicht

OP #1534143
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!
#1534152
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 :)
#1910226
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 ?
#1910294
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
#1910361
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren