STM32 103RB und Probleme mit SPI1

OP #1204038
Lesenswert?

Hi,
Ich bin gerade dabei mich mit den neuen ARM-Cortex anzufreunden. Klappt 
auch alles sehr schön.
Mein Problem ist zur Zeit die SPI1-Schnittstelle zu implementieren. Die 
SPI2-Schnittstelle läuft mit meinem produzierten Code ohne Probleme. Muß 
ich irgendwelche Besonderheiten bei SPI1 beachten, die ich übersehen 
habe ???

Mein Controller ist ein STM32F103RB, arbeiten tue ich mit IAR ARM v. 
5.11 , derzeit noch mit der 32K Kickstart Edition.

Wie gesagt funzt SPI2, nur SPI1 nicht. In der Schleife zum abfragen, ob 
das SPI-Schieberegister leer ist, bleibt das Proggi hängen.
--> while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);


Hier mal meine Init:
1
SPI_InitTypeDef SPI_struct;
2

3
  //deInit
4
  SPI_I2S_DeInit(SPI1);
5
  //GPIO_PinRemapConfig(GPIO_Remap_SPI1,DISABLE);
6

7
    /*Initialize Pins*/
8
         //SS Pin
9
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
10
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
11
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
12
   GPIO_Init(GPIOA, &GPIO_InitStructure);
13
   
14
   //CD Pin
15
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
16
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
17
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
18
   GPIO_Init(GPIOA, &GPIO_InitStructure);
19

20
  //WP Pin
21
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
22
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
23
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
24
   GPIO_Init(GPIOC, &GPIO_InitStructure);
25

26
  //SCK / MISO / MOSI Pins
27
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
28
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
29
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 |GPIO_Pin_7;
30
   GPIO_Init(GPIOA, &GPIO_InitStructure);
31
  
32
    /* Enable GPIOA clock */
33
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC , ENABLE);
34

35
    /* SPI1 Periph clock enable */
36
    RCC_APB1PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
37

38

39
//SPI_struct.
40
  SPI_struct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
41
  SPI_struct.SPI_Mode = SPI_Mode_Master;
42
  SPI_struct.SPI_DataSize = SPI_DataSize_8b;
43
  SPI_struct.SPI_CPOL = SPI_CPOL_Low;
44
  SPI_struct.SPI_CPHA = SPI_CPHA_1Edge;
45
  SPI_struct.SPI_NSS = SPI_NSS_Soft;
46
  SPI_struct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
47
  SPI_struct.SPI_FirstBit = SPI_FirstBit_MSB;
48
  SPI_struct.SPI_CRCPolynomial = 7;
49

50
  //SPI init
51
  SPI_Init(SPI1,  &SPI_struct);
52

53
  //Enable SPI
54
  SPI_Cmd(SPI1 , ENABLE);

Und hier der Sende Versuch:
1
u8 MmcTransferByte (SPI_TypeDef* SPIx , u8 ch)
2
{
3
  SPI_I2S_SendData(SPIx, ch);
4
  while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);
5

6
  return 0;
7
}

Vielleicht hat ja einer ne Idee woran es liegt. Ich stehe gerade aufm 
Schlauch. Im Anhang mal meine gesamte Test Main.c.

Dank schon mal, Fabian.
Angehängte Dateien:
#1219227
Lesenswert?

Hallo,

Bin auch gerade dabei den SPI1 mit dem S65 Display zu verbinden, dabei 
bin ich über deinen Code gestoßen. Bei mir gehts nämlich auch nicht ;)

RCC_APB1PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

Müsste eigentlich einen assert_param Fehler geben wenn du mit DEBUG 
kompelierst. (also das define in der conf.h)

SPI1 hängt am APB2.

Wahrscheinlich wirds dir nichtmehr nützen, aber das Web speichert ja 
lange, dann findet vielleicht ein anderer eine Lösung damit ;)

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