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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.