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.