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:
-
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)
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.
-
¿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