2 votos

Tiempo del DMA SPI de STM32 entre tramas de datos y perfiles múltiples del DMA

Estoy tratando de configurar el MCU STM32L432 para la comunicación SPI (24 MHz, tamaño de datos de 16 bits, solo transmisión maestra), utilizando DMA.

El dispositivo esclavo es un chip amplificador de 32 canales. Necesito enviar una cadena específica de bits solo una vez al principio, para configurar los registros en el dispositivo esclavo, y luego enviar continuamente otra cadena de bits para que el esclavo sepa que debe seguir muestreando y ciclando a través de sus 32 canales, hasta que reciba una orden de detención o se apague.

He generado un código usando CubeMx, con los parámetros apropiados configurados. He estado utilizando el comando HAL_SPI_Transmit_DMA para enviar los datos. Estoy recibiendo las señales SCLK y MOSI correctas, sin embargo, no estoy obteniendo los tiempos correctos entre las ráfagas de SCLK sucesivas. Mis dos preguntas son:

  1. El tiempo entre las ráfagas de SCLK sucesivas es demasiado corto cuando se habilita la transmisión DMA circular (mostrado en la captura de pantalla) Canal 3 Pink SCLK, Canal 4 Green CS Necesitaría que fuera aproximadamente el doble de grande (alrededor de ~200 ns). ¿Dónde puedo controlar el tiempo de esto? Si habilito el DMA normal y coloco el comando HAL_SPI_Transmit_DMA dentro de un bucle while, obtengo el problema opuesto, la brecha entre las ráfagas de SCLK sucesivas se vuelve demasiado grande, alrededor de 5 us. También he intentado usar el control de pin NSS por software usando writepin, sin embargo, obtengo el mismo problema que al usar el bucle while, brechas demasiado grandes entre los marcos de datos.

  2. ¿Cómo podría configurar dos perfiles de DMA diferentes para operar dentro de un mismo script, y llamarlos cuando sea necesario? Necesitaría esto ya que los datos de la secuencia de bits dataTx2 solo necesitan ser enviados una vez, por lo que requeriría que DMA se establezca en normal, mientras que dataTx necesita ser enviado continuamente utilizando DMA circular.

El código se puede encontrar aquí: https://github.com/varkong/SPI-DMA-Ver-C/tree/master/Src

Gracias de antemano,

varkong

1voto

dchanson Puntos 29

El problema es que el material de DMA SPI de stock que proporciona ST en realidad no se ajusta a tu caso de uso aquí. Cuando utilizas su controlador SPI, asume que quieres enviar los datos tan rápido como el bus lo permita. Esto significa transferencias consecutivas, que es lo que estás viendo.

Ve si puedes revisar el manual de referencia, encontrar cómo la señal Tx SPI está activando el DMA y ver si esa activación se puede mover a un contador de tiempo. Esto suele ser posible en microcontroladores completos. Luego configura un contador de tiempo para que se active en el período que te interesa.

Si puedes utilizar el controlador HAL de ST en absoluto, tendrás que reescribirlo para que haga lo que deseas.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X