stm32 Chip Select geht zu früh auf High

Gast #3207211
Lesenswert?
• ▲
▼
Ich benutze auf einem stm32f103 SPI2 um mit einem EEPROM zu 
kommunizieren. Die Chip-Select Leitung steuere ich per "Hand". Mir ist 
aufgefallen, dass der Chip entgegen meiner Erwartung disabled wird 
(siehe Screenshot).
1
void SPI_WriteByte (unsigned char Byte) {
2
        // enable chip
3
        GPIOB->BRR   = GPIO_Pin_12;
4
        // write data to out-reg
5
  SPI2->DR = Byte;
6

7
  //Wait until the transmit buffer is empty
8
  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
9
        // disable Chip
10
        GPIOB->BSRR = GPIO_Pin_12;
11
}
Weiß jemand woran das liegen kann? Ich habe die Vermutung, dass im 
Status TXE zu früh zurückgesetzt wird, sobald der STM mit Senden anfängt 
und nicht mit Senden fertig ist.
Angehängte Dateien:
#3207236
Lesenswert?
• ▲
▼
UDB5Al schrieb:
> Ich habe die Vermutung, dass im
> Status TXE zu früh zurückgesetzt wird

Vermutungen sind ganz böse. Laß sie sein.

Was sagt denn das Datenblatt, wann TXE gesetzt wird?
Und löscht es sich automatisch oder muß man es vor dem Senden 
rücksetzen?
Und gibt es noch andere Statusbits?

Es gibt keinen Grund, Angst vor Datenblättern/Manuals zu haben.
Gast #3207268
Lesenswert?
• ▲
▼
Ok, hat sich erledigt. BSY habe ich bereits ausprobiert nur halt zuerst 
dummerweise auf RESET gepollt.....
So geht es wunderbar:
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == SET);
Der Vorschlag von Martin K. funktioniert auch.

Vielen Dank.
#3207352
Lesenswert?
• ▲
▼
Hi,

es gibt ncoh ein weiteres Flag; nämlich das RXNE. Wenn das SPI Module 
sendet & der TX Buffer ist leer wird das TXE Flag "aktiv"; gleichzeitig 
mit dem Senden werden aber auch Daten empfangen. Ist der Empfangsvorgang 
fertig, dann wird RXNE "aktiv". Bei den Beispielen in der StdLib ist das 
so umgesetzt - keine Ahnung, warum dort das BSY Flag nicht verwendet 
wird...
1
uint8_t sFLASH_SendByte(uint8_t byte)
2
{
3
  /*!< Loop while DR register in not emplty */
4
  while (SPI_I2S_GetFlagStatus(sFLASH_SPI, SPI_I2S_FLAG_TXE) == RESET);
5

6
  /*!< Send byte through the SPI1 peripheral */
7
  SPI_I2S_SendData(sFLASH_SPI, byte);
8

9
  /*!< Wait to receive a byte */
10
  while (SPI_I2S_GetFlagStatus(sFLASH_SPI, SPI_I2S_FLAG_RXNE) == RESET);
11

12
  /*!< Return the byte read from the SPI bus */
13
  return SPI_I2S_ReceiveData(sFLASH_SPI);
14
}

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.