Gast
#2292605
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...