stm32 Chip Select geht zu früh auf High

Gast #3207211
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:
Gast #3207223
Eben, das Das TXE macht schon, was es soll. In diesem Fall ist ein 
anderes Flag dein Freund. So viele Kanditaten gibt es zum Glück auch 
nicht mehr.
#3207236
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
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
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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.