Forum: Mikrocontroller und Digitale Elektronik STM32F4 SPI?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Bernd (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hi,

gibt's beim STM32F4 eigentlich irgendetwas besonderes zu beachten bei 
SPI Master?

Ich kämpfe hier bereits seit gestern das ich das Eval Board als Master 
mit einem Slave zum Laufen bekomme. Mit einem FTDI Chipsatz klappt es 
ohne weitere Probleme.

Hab hier schon so ziemlich alles mögliche probiert, wenn's nicht bald 
klappt werf ich das STM32F4 Discovery Board wohl in die Tonne und geh 
wieder zum FTDI zurück.

1
int16_t SPI_write(uint8_t *data, uint32_t length) {
2
        uint16_t i;
3
        volatile uint32_t x;
4
        x=0xff;
5
        for (; x!=0; x--);
6
//      while( !(SPI3->SR & SPI_I2S_FLAG_TXE) ); // wait until transmit complete
7
//      while( !(SPI3->SR & SPI_I2S_FLAG_RXNE) ); // wait until receive complete
8
//      while( SPI3->SR & SPI_I2S_FLAG_BSY ); // wait until SPI is not busy anymore
9
        for (i=0;i<length;i++) {
10
                SPI3->DR = data[i];
11
                while( !(SPI3->SR & SPI_I2S_FLAG_TXE) ); // wait until transmit complete
12
                while( !(SPI3->SR & SPI_I2S_FLAG_RXNE) ); // wait until receive complete
13
                while( SPI3->SR & SPI_I2S_FLAG_BSY ); // wait until SPI is not busy anymore
14
        //      x=0x40;
15
        //      for (; x!=0; x--);
16
        }
17
        x=0xAA;
18
        for (; x!=0; x--);
19
        return length;
20
}
21
22
int16_t SPI_read(uint8_t *data, uint32_t length) {
23
        uint16_t i;
24
        volatile uint32_t x;
25
        x=0xff;
26
        for (; x!=0; x--);
27
//      while( !(SPI3->SR & SPI_I2S_FLAG_TXE) ); // wait until transmit complete
28
//      while( !(SPI3->SR & SPI_I2S_FLAG_RXNE) ); // wait until receive complete
29
//      while( SPI3->SR & SPI_I2S_FLAG_BSY ); // wait until SPI is not busy anymore
30
        for (i=0;i<length;i++) {
31
                SPI3->DR=0x00; // dummy daten schreiben, dies ist nötig damit empfangen werden kann
32
                while( !(SPI3->SR & SPI_I2S_FLAG_TXE) ); // wait until transmit complete
33
                while( !(SPI3->SR & SPI_I2S_FLAG_RXNE) ); // wait until receive complete
34
                while( SPI3->SR & SPI_I2S_FLAG_BSY ); // wait until SPI is not busy anymore
35
                data[i]=SPI3->DR;
36
        //      x=0x40;
37
        //      for (; x!=0; x--);
38
        }
39
        x=0xAA;
40
        for (; x!=0; x--);
41
        return length;
42
}
43
44
45
46
void init_SPI3(void){
47
48
        GPIO_InitTypeDef GPIO_InitStruct;
49
        SPI_InitTypeDef SPI_InitStruct;
50
51
        // enable clock for used IO pins
52
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
53
54
        /* configure pins used by SPI3
55
         * PA5 = SCK
56
         * PA6 = MISO
57
         * PA7 = MOSI
58
         */
59
60
        /*
61
         * PC10 = SPI3_SCK
62
         * PC11 = SPI3_MISO
63
         * PC12 = SPI3_MOSI
64
        */
65
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12; //GPIO_Pin_7 | GPIO_Pin_6 | GPIO_Pin_5;
66
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
67
        GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
68
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_25MHz;
69
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
70
        GPIO_Init(GPIOC, &GPIO_InitStruct);
71
72
        GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_SPI3);
73
        GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_SPI3);
74
        GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_SPI3);
75
76
#if 1
77
        // enable clock for used IO pins
78
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
79
80
        /* Configure the chip select pin
81
           in this case we will use PE7 */
82
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
83
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
84
        GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
85
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_25MHz;
86
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; //UP;
87
        GPIO_Init(GPIOE, &GPIO_InitStruct);
88
89
        GPIOE->BSRRL |= GPIO_Pin_2; // set PE7 high
90
#endif
91
92
        // enable peripheral clock
93
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
94
95
        /* configure SPI3 in Mode 0 
96
         * CPOL = 0 --> clock is low when idle
97
         * CPHA = 0 --> data is sampled at the first edge
98
         */
99
        SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // set to full duplex mode, seperate MOSI and MISO lines
100
        SPI_InitStruct.SPI_Mode = SPI_Mode_Master;     // transmit in master mode, NSS pin has to be always high
101
        SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b; // one packet of data is 8 bits wide
102
        SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;        // clock is low when idle
103
        SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;      // data sampled at first edge
104
//      SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;        // clock is low when idle
105
//      SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;      // data sampled at first edge
106
        SPI_InitStruct.SPI_NSS = SPI_NSS_Soft | SPI_NSSInternalSoft_Set // set the NSS management to internal and pull internal NSS high
107
        SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64; //256; //128; //SPI_BaudRatePrescaler_256; //SPI_BaudRatePrescaler_32; //SPI_BaudRatePrescaler_16; // should be 5 mhz;;; SPI_BaudRatePrescaler_4; // SPI frequency is APB2 frequency / 4
108
        SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;// data is transmitted MSB first
109
        SPI_Init(SPI3, &SPI_InitStruct);
110
111
        SPI_Cmd(SPI3, ENABLE); // enable SPI3
112
}

von Bernd (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Problem dank Logicanalyzer gelöst... hätt ich früher machen sollen.

von Gaukler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
... und das Problem war?

von Bernd (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Puffer waren mit falschen Werten gefüllt, im Oszilloskop hab ich nur 
gesehen das Werte gesetzt wurden aber nicht welche (ist n etwas älteres 
Oszi).
Dachte mir es läge am Timing oder so, dabei wurden halt die falschen 
Werte geschrieben.
Stundenlang hab ich die falschen Dinge vermutet.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.