Skip to main content
JR2963
Senior II
June 28, 2023
Question

DMA - from SPI to DAC - 16 bit

  • June 28, 2023
  • 2 replies
  • 1404 views

Hi,

I use DMA for transfer data from external flash memory to DAC for playing sounds - in 8 bits mode like that:

1) TIM6  gives impulses to DMA_1 - which transmit  dummy byte to external flash in 8 khz intervals (Fsampling of sound). External flash always response with new sample of sound.

2) Second DMA_2 transfers rx bytes from external mem to DAC (from SPI->DR to DAC->DHR12R1).

All works well, but now I would like to transfer not 8 bits, but 16 (12) bits sounds to DAC.

Is it even possible? MAybe the second DMA had to be set like LL_DMA_PDATAALIGN_BYTE (SPI->DR) from source and LL_DMA_PDATAALIGN_HAL_WORD for destiantion (DAC-DHR12R1)?

This topic has been closed for replies.

2 replies

waclawek.jan
Super User
June 28, 2023

> MAybe the second DMA had to be set like LL_DMA_PDATAALIGN_BYTE (SPI->DR) from source and LL_DMA_PDATAALIGN_HAL_WORD for destiantion (DAC-DHR12R1)?

The names of constants are probably wrong, but that would not work anyway, as the single-port DMA in 'G0 does not assemble/disassemble data, but zero-extends them:

waclawekjan_0-1687943655700.png

You have two options:

- use 16-bit SPI; for that you'd probably need to switch SPI between 8-bit (for commands to memory) and 16-bit mode, or switch memory-facing pins between GPIO and SPI and bit-bang the command

- use memory as a buffer and a third DMA, storing 8-bit data using the second DMA into memory and picking them from memory using the third DMA and storing into DAC. Timing of the third DMA may be tricky, maybe DMAMUX's facilities could be used for that, I am not familiar with DMAMUX.

JW

JR2963
JR2963Author
Senior II
June 28, 2023

Sounds good, the second DMA which now transfers from SPI->DR to DAC, just only redirect to memory e.g. uint16_t tempMem, and after this transfer is done, so some event could tell DMA_3 to transfer from tempMEM to DAC...