Forum: Mikrocontroller und Digitale Elektronik stm32 Chip Select geht zu früh auf High


von UDB5Al (Gast)


Angehängte Dateien:

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.

von dummy (Gast)


Lesenswert?

>Weiß jemand woran das liegen kann?

Am Fifo. TXE geht schon hoch während das letzte Byte
noch gesendet wird.

von UDB5Al (Gast)


Lesenswert?

Und gibt es schlaue Abhilfe für das Problem außer delay reinzubastelln?

von Jim Panse (Gast)


Lesenswert?

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.

von Martin K. (martinko)


Lesenswert?

Jim Panse schrieb:
> 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.

zum Beispiel das Busy Flag:

while (SPI2->SR & SPI_SR_BSY)
    ;

Gruß Martin

von Peter D. (peda)


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.

von UDB5Al (Gast)


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.

von Clemens N. (clemens2)


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
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.