Tiempos STM32 SPI DMA entre marcos de datos y múltiples perfiles DMA

Estoy tratando de configurar la MCU STM32L432 para comunicación SPI (24 MHz, tamaño de datos de 16 bits, solo transmisión maestra), usando 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 un comando de parada o se apaga.

Generé un código usando CubeMx, con la configuración de parámetros adecuada. He estado usando el comando HAL_SPI_Transmit_DMA para enviar los datos. Obtengo las señales SCLK y MOSI correctas, sin embargo, no obtengo los tiempos correctos entre ráfagas sucesivas de SCLK. Mis dos preguntas son:

  1. El tiempo entre las ráfagas SCLK sucesivas es demasiado corto cuando la transmisión DMA circular está habilitada (se muestra en la captura de pantalla) Canal 3 Rosa SCLK, Canal 4 Verde CSNecesitaría que fuera aproximadamente el doble (alrededor de ~200 ns) ¿Dónde puedo controlar el tiempo de esto? Si habilito Normal DMA y coloco el comando HAL_SPI_Transmit_DMA dentro de un ciclo while, obtengo el problema opuesto, la brecha entre las sucesivas ráfagas de SCLK se vuelve demasiado grande, alrededor de 5 us. También intenté usar el software de control de pines NSS usando el pin de escritura, sin embargo, tengo el mismo problema que con el ciclo while, espacios demasiado grandes entre los marcos de datos.

  2. ¿Cómo podría configurar dos perfiles DMA diferentes para operar con un script y llamarlos cuando sea necesario? Necesitaría esto ya que el flujo de bits dataTx2 solo necesita enviarse una vez, por lo que requeriría que DMA se configurara en normal, mientras que dataTx necesitaría enviarse continuamente usando DMA circular.

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

Gracias de antemano,

varkong

Debería poder llamar a las funciones HAL correspondientes para reconfigurar el DMA en cualquier momento, solo el Cubo no generará dos configuraciones al mismo tiempo para usted.
Por cierto, si el esclavo es tan sensible al tiempo, entonces no es SPI real lo que tienes allí. ¿Ha considerado crear la forma de onda requerida de una manera diferente (PWM, golpe de bits,...)?

Respuestas (1)

El problema es que las cosas de SPI DMA que ST proporciona en realidad no se ajustan a su caso de uso aquí. Cuando usa su controlador SPI, se supone que desea enviar los datos tan rápido como lo admita el bus. Esto significa transferencias consecutivas, que es lo que está viendo.

Vea si puede consultar el manual de referencia, encontrar cómo la señal SPI Tx está activando el DMA y ver si ese activador se puede mover a un contador de tiempo. Esto suele ser posible en microcontroladores con todas las funciones. Luego configure un contador de tiempo para que se active en el período que le interesa.

Si puede usar el controlador ST HAL, tendrá que volver a escribirlo para que haga lo que desea.