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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren