Forum: Mikrocontroller und Digitale Elektronik STM32 103RB und Probleme mit SPI1


von Jean P. (fubu1000)


Angehängte Dateien:

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.

von Jean P. (fubu1000)


Lesenswert?

push ;-)

Achso und ich nutze die EWARM-libs.

Thx und gruß.

von Michael B. (bubi)


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

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.