Using DMA to transfer a Struct variable

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Anonymous
Not applicable

Hi everyone,

   

I need to transfer a struct variable composed of two fields (uint8,uint16) towards an SPI interface.

   

I tried to use a DMA channel and only one TD, configured to transfer 1 byte per burst with increment of the source address.

   

With this configuration, if I set the struct variable as: (0x0F,0xFFFF) I see on the oscilloscope: 0x0F,0X00FF.

   

Even using 3 byte per burst the result is the same.

   

Is it needed to use a dedicate TD for each field of the Struct variable or I need to configure the DMA channel and the TD in a different way ?

   

 

   

Thanks in advance

0 Likes
2 Replies
Bob_Marlowe
Level 10
Level 10
First like given 50 questions asked 10 questions asked

A struct in C can be seen as a sequence of bytes (uint8). When you handle it just like that and use the sizeof(struct MyStructure) macro to calculate the number of bytes to transfer nothing can go wrong.

   

The SPI interface may go wrong when you send data faster than they are clocked out of the interface. I do not know how you are checking the FIFO in your DMA-process. I doubt that the supplied interrupt routines wotk together with DMA.

   

I would suggest to set the TX-Buffer-size to a sufficient value and send the structure as a whole (array of bytes) to the SPI and let it be handled by the internal interrupts.

   

Bob 

0 Likes
Anonymous
Not applicable

 I think the GCC compiler paded with extra bytes inside structures.  

   

You can verify this checking the address of the first and the second element of the structure.

   

I can't remember if you have to use the attribute "align" or "pack". you can find it in the GCC help manual.

0 Likes