DMA y ADC en EDU-CIAA

288 views
Skip to first unread message

Valentin Giova

unread,
Sep 5, 2016, 12:39:52 PM9/5/16
to Embebidos32

Buenos días a todos,

Les escribo a ver si alguien puede darme una mano con el ADC de la EDU-CIAA, ya que vengo rompiendome la cabeza hace varios días.

A partir del ejemplo que hay en LPCOpen, configuré el ADC para tranferir las muestras con DMA por bloques de 1024 muestras. Configuré dos descriptores para poder trabajar con buffer doble, y mientras uno se llena, proceso el otro.
Mi problema está en que no logro sincronizar la velocidad de transferencia del DMA con la frecuencia de sampleo del ADC. El DMA transfiere los bloques de muestras antes que el ADC termine de realizar las conversiones. El DMA llena cada buffer de 1024 y genera la interrupcion mucho antes de lo que el ADC podría realizar esa cantidad de muestras.
Intenté configurar y modificar los diferentes registros manualmente pero tampoco logro sincronizarlos.

Cualquier sugerencia o ayuda será bienvenida.

Muchas gracias!
main.c

Pablo Ledergerber

unread,
Sep 5, 2016, 1:14:28 PM9/5/16
to embeb...@googlegroups.com
Hola Valentin,

No conozco la ciaa pero hace rato que vengo trabajando con los stm32. A mi parecer, el problema puede ser que el dma no este configurado correctamente. Lo mejor seria ver el codigo que hicistes.
Saludos

Pablo
--
-- Recibiste este mensaje porque estás suscripto al Grupo Google Embebidos32. Para postear en este grupo, escribe un email a embeb...@googlegroups.com. Para des-suscribirte, envía un email a embebidos32...@googlegroups.com. Para más opciones, visita el sitio del grupo en https://groups.google.com/d/forum/embebidos32?hl=es
---
Has recibido este mensaje porque estás suscrito al grupo "Embebidos32" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a embebidos32...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.
<main.c>

Pablo Ridolfi

unread,
Sep 5, 2016, 1:48:08 PM9/5/16
to embeb...@googlegroups.com

Hola,

Me parece que está mal LPCOpen, te paso a contar:
- El problema es que el DMA lee el DR del ADC en cualquier momento, no cuando el ADC termina. Por eso las muestras repetidas.
- El UM en la sección 47.7.3 (ADC -> DMA control) dice que el DMA tiene que leer el DR del canal que te interesa, no el GDR, para limpiar el request por DMA.
- Los ADC y DAC están conectados por BREQ al DMA, o sea van por burst. Acá entra en juego el burst size. En la misma sección del UM dice "If the
number of ADC channels is not equal to one of the predefined DMA-supported burst sizes (applicable DMA burst sizes are 1, 4, 8), set the burst size to one." En criollo, quiero leer un solo canal, burst size tiene que estar en 1.

Entonces, el archivo chip/src/gpdma_18xx_43xx.c tiene TODO MAL CONFIGURADO:
- Línea 68, vas a ver GPDMA_BSIZE_4 para ADC0 y para ADC1. Eso tiene que ir en GPDMA_BSIZE_1 (al menos para leer un solo canal).
- Línea 136, address del registro que lee el DMA, decía (&LPC_ADC0->GDR), tiene que decir (&LPC_ADC0->DR[1]) o el ch que corresponda, lo cual es un problema porque tenés que tocar acá si querés cambiar de canal. No sé si hay alguna función que puede modificarla en runtime, sino va a haber que inventar una.

En fin, modificá esas dos cosas en gpdma_18xx_43xx.c y te tendría que andar bien.

Saludos.

Valentin Giova

unread,
Sep 5, 2016, 4:08:02 PM9/5/16
to Embebidos32
Pablo,

Muchas gracias por el aporte. 

Modiqué ambas cosas en el LPCOpen, pero de todos modos sigue sin sucediendo el mismo problema. El DMA sigue transfiriendo las muestras repetidas, sin sincronizarse con el ADC.
Alguna otra idea??

Saludos!

Pablo Ridolfi

unread,
Sep 5, 2016, 4:20:55 PM9/5/16
to embeb...@googlegroups.com
A ver, este es el programa de ejemplo que usamos en TD2, fijate si tenés algo configurado distinto. Acabo de probarlo en mi EDU-CIAA y funciona lo más bien.



--
main.c

Valentin Giova

unread,
Sep 5, 2016, 4:51:51 PM9/5/16
to Embebidos32
En principio me sucede lo mismo con el ejemplo que me acabas de pasar. 
Lo pruebo con un contador de ticks cada x ms. Por mas que modifique la frecuencia de sampleo del ADC, la interrupción de DMA salta con la misma frecuencia. Y en teoría, si por ejemplo bajo la freq de muestreo la interrupción debería suceder en un tiempo mayor.  


Pablo Ridolfi

unread,
Sep 5, 2016, 4:57:32 PM9/5/16
to Embebidos32
Bueno, a mí me funciona bien usándolo desde mi workspace github.com/pridolfi/workspace
Lo único que se me ocurre ahora es que hagas un diff del LPCOpen que está ahí y el que estás usando vos para ver qué más hay de diferente.



El lun., 5 sept. 2016 a las 17:51, Valentin Giova (<valenti...@gmail.com>) escribió:
En principio me sucede lo mismo con el ejemplo que me acabas de pasar. 
Lo pruebo con un contador de ticks cada x ms. Por mas que modifique la frecuencia de sampleo del ADC, la interrupción de DMA salta con la misma frecuencia. Y en teoría, si por ejemplo bajo la freq de muestreo la interrupción debería suceder en un tiempo mayor.  


Reply all
Reply to author
Forward
0 new messages