STM32 SPI w / DMA conjunto de indicadores

0

Mi software parece estar funcionando como se esperaba, pero el indicador BSY no se está borrando en el registro SPI.

Fondo:

Estoy intentando que SPI trabaje con DMA en el STM32. Después de descubrir que el DMA es exigente sobre qué canal usas para cada periférico, tengo las cosas funcionando como se esperaba. Leí en algún lugar que es importante asegurarse de que el indicador SPI BuSY esté desactivado antes de iniciar otra transferencia. Estoy examinando los registros utilizando ST / LINK v2 y, por el motivo que sea, el indicador SPI BSY se mantiene y, si tengo una declaración IF en mi código para confirmar que está borrada antes de continuar, el código se bloquea. Soy consciente de la "Heisenbug" de observar los registros SPI_SR / DR con un depurador.

Al principio intenté usar dúplex completo con SPI y los dos canales DMA con los pines conectados entre sí y una matriz de TX y RX. Después de la transferencia, la matriz RX es una copia perfecta de la matriz TX. Pensando que el problema podría haber sido la falta de un borde del reloj esperado, desconecté los dos pines, configuré el SPI en TX solamente y comenté todo el código RX DMA y SPI. El problema persiste.

Dos cosas a tener en cuenta son que el indicador BUSY es a menudo lo único establecido en el registro SR. Sin embargo, si deshabilité la verificación del indicador OCUPADO y reinicié la transferencia DMA, en las llamadas subsiguientes a la rutina de servicio de interrupción, los buffers RXNE y TXE parecen cambiar arbitrariamente entre 1 y 0, con el estado esperado de ambos vacíos siendo más común y el SPI_DR parece a veces obtener un valor arbitrario. No veo el conjunto de banderas invadido.

¿Por qué no se borra el indicador BUSY?

    
pregunta Alan Samet

3 respuestas

1

¿Qué es exactamente la limitación de las transferencias SPI? Si está usando DMA directamente (en lugar de ser activado por un temporizador o algo más), tan pronto como el SPI esté libre, el periférico DMA comenzará otra transferencia. Como resultado, se esperaría estar ocupado todo el tiempo.

Según el manual de la serie STM32F1xx, sección 25.3.7 (otras series deben tener un comportamiento similar):

  

Cuando la comunicación no es continua, el indicador BSY está bajo entre cada comunicación.

     

Cuando la comunicación es continua:

     

● en modo maestro, el indicador BSY se mantiene alto durante todas las transferencias

    
respondido por el swineone
1

Significa que debe verificar el indicador de transferencia DMA completa, luego deshabilitar la solicitud SPI DMA while (! DMA_GetFlagStatus (DMA1_FLAG_TC3)); SPI_I2S_DMACmd (SPI1, SPI_I2S_DMAReq_Tx, DISABLE); Yo creo que TXDMAEN: Tx buffer DMA habilitado Cuando se establece este bit, la solicitud DMA se realiza cada vez que se establece el indicador TXE.

    
respondido por el vinh phan
0

Parece que lo he descubierto. Tenía un conjunto de búfer circular y asumí tontamente que el tamaño del búfer enviaría solo la longitud del búfer. Un poco de razonamiento deductivo y me hubiera dado cuenta de que necesitaría un largo para enviar también para que se comporte de esa manera.

¿Hay alguna manera de activarlo en un temporizador sin usar un ISR?

    
respondido por el Alan Samet

Lea otras preguntas en las etiquetas