Hallo,
ich mache gerade erste Gehversuche mit der SPI im STM32F100RB (Discover
Board).
Dabei habe ich beim Debuggen mit Coocox das Problem, dass beim
SPI-Empfangen immer nur 0x00 empfangen wird. Ich habe MISO und MOSI der
SPI1 verbunden, sodass ich eigentlich das Datenbyte empfangen sollte,
das ich auch zum Anstoßen des Clocks verwende.
Hier mein Code:
1 | /* Master Definition */
|
2 | #define _SPI_C_
|
3 |
|
4 | /* Includes */
|
5 | #include "stm32f10x.h"
|
6 | #include "spi.h"
|
7 |
|
8 | /* Functions */
|
9 | void SPI_Init(void)
|
10 | {
|
11 | /* enable clock for SPI */
|
12 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
|
13 |
|
14 | /* init SPI1 */
|
15 | SPI1->CR1 |= SPI_CR1_MSTR;
|
16 | SPI1->CR2 |= SPI_CR2_SSOE;
|
17 | }
|
18 |
|
19 | void SPI_Enable(void)
|
20 | {
|
21 | SPI1->CR1 |= SPI_CR1_SPE;
|
22 | }
|
23 |
|
24 | void SPI_Disable(void)
|
25 | {
|
26 | SPI1->CR1 &= ~SPI_CR1_SPE;
|
27 | }
|
28 |
|
29 | void SPI_WriteByte(uint8_t data_c)
|
30 | {
|
31 | SPI1->DR = data_c;
|
32 | while ((SPI1->SR & SPI_SR_TXE) == 0x00);
|
33 | }
|
34 |
|
35 | uint8_t SPI_ReadByte(void)
|
36 | {
|
37 | uint8_t result_c = (uint8_t)(SPI1->DR);
|
38 | SPI1->DR = 0xAA;
|
39 | while (((SPI1->SR) & SPI_SR_RXNE) == (uint16_t)RESET)
|
40 | {
|
41 | ;
|
42 | }
|
43 |
|
44 | result_c = (uint8_t)(SPI1->DR);
|
45 |
|
46 | return result_c;
|
47 | }
|
48 |
|
49 | #undef _SPI_C_
|
Die Initialisierung der entsprechenden GPIOs sieht so aus:
1 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
|
2 |
|
3 | /* SPI Pins on PA */
|
4 | GPIOA->CRL |= GPIO_CRL_MODE4_1 | GPIO_CRL_CNF4_1;
|
5 | GPIOA->CRL |= GPIO_CRL_MODE5_1 | GPIO_CRL_CNF5_1;
|
6 | GPIOA->CRL |= GPIO_CRL_CNF6_1;
|
7 | GPIOA->CRL |= GPIO_CRL_MODE7_1 | GPIO_CRL_CNF7_1;
|
Hat jemand eine Idee, woran das liegen kann?
Danke schonmal im VOrraus.