Forum: Mikrocontroller und Digitale Elektronik STM32 SPI Schieberegister löschen


von beginnerequest (Gast)


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...

von ZiZi. (Gast)


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

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.