mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32F4 SPI?


Autor: Bernd (Gast)
Datum:

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.

int16_t SPI_write(uint8_t *data, uint32_t length) {
        uint16_t i;
        volatile uint32_t x;
        x=0xff;
        for (; x!=0; x--);
//      while( !(SPI3->SR & SPI_I2S_FLAG_TXE) ); // wait until transmit complete
//      while( !(SPI3->SR & SPI_I2S_FLAG_RXNE) ); // wait until receive complete
//      while( SPI3->SR & SPI_I2S_FLAG_BSY ); // wait until SPI is not busy anymore
        for (i=0;i<length;i++) {
                SPI3->DR = data[i];
                while( !(SPI3->SR & SPI_I2S_FLAG_TXE) ); // wait until transmit complete
                while( !(SPI3->SR & SPI_I2S_FLAG_RXNE) ); // wait until receive complete
                while( SPI3->SR & SPI_I2S_FLAG_BSY ); // wait until SPI is not busy anymore
        //      x=0x40;
        //      for (; x!=0; x--);
        }
        x=0xAA;
        for (; x!=0; x--);
        return length;
}

int16_t SPI_read(uint8_t *data, uint32_t length) {
        uint16_t i;
        volatile uint32_t x;
        x=0xff;
        for (; x!=0; x--);
//      while( !(SPI3->SR & SPI_I2S_FLAG_TXE) ); // wait until transmit complete
//      while( !(SPI3->SR & SPI_I2S_FLAG_RXNE) ); // wait until receive complete
//      while( SPI3->SR & SPI_I2S_FLAG_BSY ); // wait until SPI is not busy anymore
        for (i=0;i<length;i++) {
                SPI3->DR=0x00; // dummy daten schreiben, dies ist nötig damit empfangen werden kann
                while( !(SPI3->SR & SPI_I2S_FLAG_TXE) ); // wait until transmit complete
                while( !(SPI3->SR & SPI_I2S_FLAG_RXNE) ); // wait until receive complete
                while( SPI3->SR & SPI_I2S_FLAG_BSY ); // wait until SPI is not busy anymore
                data[i]=SPI3->DR;
        //      x=0x40;
        //      for (; x!=0; x--);
        }
        x=0xAA;
        for (; x!=0; x--);
        return length;
}



void init_SPI3(void){

        GPIO_InitTypeDef GPIO_InitStruct;
        SPI_InitTypeDef SPI_InitStruct;

        // enable clock for used IO pins
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);

        /* configure pins used by SPI3
         * PA5 = SCK
         * PA6 = MISO
         * PA7 = MOSI
         */

        /*
         * PC10 = SPI3_SCK
         * PC11 = SPI3_MISO
         * PC12 = SPI3_MOSI
        */
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12; //GPIO_Pin_7 | GPIO_Pin_6 | GPIO_Pin_5;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_25MHz;
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOC, &GPIO_InitStruct);

        GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_SPI3);
        GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_SPI3);
        GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_SPI3);

#if 1
        // enable clock for used IO pins
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);

        /* Configure the chip select pin
           in this case we will use PE7 */
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_25MHz;
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; //UP;
        GPIO_Init(GPIOE, &GPIO_InitStruct);

        GPIOE->BSRRL |= GPIO_Pin_2; // set PE7 high
#endif

        // enable peripheral clock
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);

        /* configure SPI3 in Mode 0 
         * CPOL = 0 --> clock is low when idle
         * CPHA = 0 --> data is sampled at the first edge
         */
        SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // set to full duplex mode, seperate MOSI and MISO lines
        SPI_InitStruct.SPI_Mode = SPI_Mode_Master;     // transmit in master mode, NSS pin has to be always high
        SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b; // one packet of data is 8 bits wide
        SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;        // clock is low when idle
        SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;      // data sampled at first edge
//      SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;        // clock is low when idle
//      SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;      // data sampled at first edge
        SPI_InitStruct.SPI_NSS = SPI_NSS_Soft | SPI_NSSInternalSoft_Set // set the NSS management to internal and pull internal NSS high
        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
        SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;// data is transmitted MSB first
        SPI_Init(SPI3, &SPI_InitStruct);

        SPI_Cmd(SPI3, ENABLE); // enable SPI3
}

Autor: Bernd (Gast)
Datum:

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

Autor: Gaukler (Gast)
Datum:

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

Autor: Bernd (Gast)
Datum:

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.