STM32 SPI Schieberegister löschen

Gast #2292605
Lesenswert?
• ▲
▼
Guten Tag,

Vor einige Tage bin ich ganz beschäftigt beim SPI-testen.
Das ist einfach so:
Ein STM32F103R8 will mit einen A/D-Wandler CS5560 sprechen. Da der 
CS5560 nur takten und Daten dazu schickt (in meine SSC-Modus), habe ich 
den SPI als Slave eingestellt.

Es läuft i.O. wenn ich den Microcontroller nach den A/D-Wandler 
einschalte. Aber nicht, wenn die zusammen eingeschaltet wurden, oder 
wenn die nacheinander eingeschaltet wurden: ich kriege einfach paare 
bits von der ehemalige "TWORD".

Beispiel mit 4bits verschoben (S:vom A/D-Wandler geschickt,R: was der 
STM32 zeigt)

1-S: 11111111 11111111 11111111
1-R: xxxx1111 11111111 11111111
2-S: 00000000 00000000 00000000
2-R: 11110000 00000000 00000000
3-S: 11111111 11111111 11111111
3-R: 00001111 11111111 11111111

mein kleinem Test habe ich so codiert:

<pre>
  uint8_t k = 0;
  u8 Data[4],SPI_SLAVE_Buffer_Rx[4];

void SPI1_IRQHandler(void)
{
  SPI_SLAVE_Buffer_Rx[RxIdx++] = SPI_I2S_ReceiveData(SPI1);
  if (RxIdx==3)
  {

    //Daten speichern
    for (k=0;k<3;k++)
    {
      Data[k] = SPI_SLAVE_Buffer_Rx[k];
    }

    //Anzeige
    for (int i=0;i<3;i++)
    {
      for (int j=0;j<8;j++)
      {
        if ((Data[i]>>(7-j))&0x01)
          GPIO_SetBits(GPIOB, MOTOR_ABHEBUNG_PHASE1);
        else
          GPIO_ResetBits(GPIOB, MOTOR_ABHEBUNG_PHASE1);
      }
    }
    GPIO_ResetBits(GPIOB, MOTOR_ABHEBUNG_PHASE1);

  }
}

//jede /CS runterlauf geht diese interrupt:
void EXTI4_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line4) != RESET)
  {
    RxIdx=0;
    EXTI_ClearITPendingBit(EXTI_Line4);     // Clear the EXTI Line 4
  }
}
</pre>


Es scheint einfach: Datenspeichern und dann anzeigen. Mehr tut das 
nicht. Aber ich kann diese Schieberegister einfach nicht löschen.
Ich habe folgende probiert:
SPI_Enable()/Disable(), Read DR Register, Clear Overrun condition. Alles 
hat nichts gebracht.

Vielleicht hat jemand eine Idee oder eine Erfahrung...
Gast #2292761
Lesenswert?
• ▲
▼
Hallo,

aus Deiner Beschreibung wird nicht ganz klar, wer jetzt der
Master und welches der Slave ist.

Wenn A/D Master ist, warum brauchst Du dann 2 Interrupts?

Wenn der STM32 Master ist und der A/D Wandler per Interrupt
"Daten fertig zum abholen" meldet, warum wird dann
der SPI im SPI Interrupt Handler gelesen und nicht im EXTI4 Interrupt?

Das hat aber mit Deinem Prob wahrscheinlich nicht viel zu tun.

Hat der A/D Wandler keinen Reset-Eingang, den Du auf einen GPIO legen 
kannst?


ZiZi

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.