mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 SPI2 hängt sich auf


Autor: ArtF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe ein Problem beim STM32 und komme nicht weiter. Der STM32 läuft mit 
72MHz und an der SPI2 Schnittstelle ist nichts weiter dran, als nur ein 
FM25H20 Fram (/W ist via pull-up an Vcc). Habe in der STM32 config SPI 
und SPI2 freigegeben, GPIOB eingeschaltet und SPI2 am APB1 ebenfalls 
aktiviert. Leider hängt sich der uC in der Leseroutine nach 3 Bytes auf 
und gibt davor nur 0xFF aus, obwohl der FRAM theoretisch mit 0x55 und 
0xAA abwechselnd beschrieben wird. Habe schon fremden Code für Flash 
Ansteuerung angesehen, abgesehen von paar Unterschieden bei 
Initialisierung, finde ich nichts besonderes. Hier sind die Routinen:
void 
spi2_config (void) {
  
  GPIO_InitTypeDef GPIO_InitStructure;

  /* Configure SPI2 pins: SCK, MISO and MOSI ---------------------------------*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  
  /* Configure Slave Select Pin --------------------------------------------*/
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  // set slave select to high  
  GPIO_WriteBit(GPIOB, GPIO_Pin_12, 1);
}

void 
spi2_init (void) {
  
  SPI_I2S_DeInit(SPI2);
  spi2_config ();
   
  SPI_InitTypeDef  SPI_InitStructure;

  /* SPI2 configuration ------------------------------------------------------*/
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_Init(SPI2, &SPI_InitStructure);
  
  SPI_CalculateCRC(SPI2, DISABLE);
  SPI_Cmd(SPI2, ENABLE);
}


///////////////////////////////////////////////////////////////////////////////
// enable FRAM
///////////////////////////////////////////////////////////////////////////////
void 
FRAM_enable (void) {
    //SPI_SSOutputCmd(SPI2, ENABLE);
    GPIO_WriteBit(GPIOB, GPIO_Pin_12, 0);
}

///////////////////////////////////////////////////////////////////////////////
// disable FRAM
///////////////////////////////////////////////////////////////////////////////
void 
FRAM_disable (void) {
    //SPI_SSOutputCmd(SPI2, DISABLE);
    GPIO_WriteBit(GPIOB, GPIO_Pin_12, 1);
}

///////////////////////////////////////////////////////////////////////////////
// initialize FRAM
///////////////////////////////////////////////////////////////////////////////
void 
FRAM_init (void) {

  // set write enable latch
  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET);
  
  FRAM_enable();
  SPI_I2S_SendData(SPI2, 0x06);    
  FRAM_disable();
}

///////////////////////////////////////////////////////////////////////////////
// Write Byte to Fram
///////////////////////////////////////////////////////////////////////////////
void 
FRAM_write_byte (unsigned char b) {
  
  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET);
  SPI_I2S_SendData(SPI2, b);
}

///////////////////////////////////////////////////////////////////////////////
// Write Byte to Fram
///////////////////////////////////////////////////////////////////////////////
unsigned char 
FRAM_read_byte (void) {
    
  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE)==RESET);
  return SPI_I2S_ReceiveData(SPI2); 
}



void 
FRAM_Test () {
   
    unsigned char mod_byte= 2;
    unsigned int limit = 0;
    unsigned char byte = 0;
    
    // write data to fram
    FRAM_enable();

    // write address -> start address is 0
    FRAM_write_byte (0x02); // write memory data command
    FRAM_write_byte (0x00); // addr
    FRAM_write_byte (0x00); // addr
    FRAM_write_byte (0x00); // addr
    
    for (limit = 0; limit < 200; limit++) {
        if (mod_byte % 2) {
            FRAM_write_byte (0xAA);
        }
        else {
            FRAM_write_byte (0x55);
        }
        mod_byte++;
    }

    FRAM_disable(); 

    // read data from fram
    FRAM_enable();
    printf("\r\nread data from FRAM\r\n");
    FRAM_write_byte (0x03); // read memory data command
    FRAM_write_byte (0x00); // addr
    FRAM_write_byte (0x00); // addr
    FRAM_write_byte (0x00); // addr
    
    for (limit = 0; limit < 200; limit++) {
        byte = FRAM_read_byte();
        printf("%#X ", byte); // nach 0x55 0x55 0x55 läuft der uC nicht weiter
    }
    FRAM_disable();
/**/
}

Die Funktion FRAM_Test () wird auf jeden Fall erst aufgerufen, nach dem 
SPI und Fram in main initialisiert werden. Jemand noch eine Idee, was 
ich übersehen/vergessen konnte?

Autor: Daniel R. (zerrome)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
müsste der MISO Pin nicht irgendwie als Eingang definiert werden?
Zudem würde ich da den Pullup für aktivieren.

Viele Grüße

Daniel

Autor: ArtF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die sind definiert wie in den Beispielen, als Alternativ Function Pins.

Autor: Daniel R. (zerrome)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auszug aus der FW Lib 3.4.0

  if(SPIy_Mode == SPI_Mode_Master)
  {
    /* Confugure MISO pin as Input Floating  */
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  }



besser wäre aber meiner Meinung nach:

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

Also Input mit Pullup, anstelle von Floating...

Mag mich aber auch irren, bin neu bei den STM32.

Hast Du denn mal das SPI so ausprobiert ob es geht, oder Dir die Signale 
angeschaut?

Viele Grüße

Daniel

Autor: Alfred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Füge folgendes ein:
SPI_InitStructure.SPI_CRCPolynomial = 7;
Warum 7 ? weiß ich auch nicht....

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.