32-Bit DMA Transfer Not Correctly Functioning

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
已解决

32-Bit DMA Transfer Not Correctly Functioning

跳至解决方案
4,283 次查看
nathanb_
Contributor III

Hello All,

I'm currently trying to do a DMA transfer into an eDMA register related to an SPI transfer and it does not seem to be correctly working for some reason.  This is on a Vybrid VF6XX processor.

If I manually do:

//DMA30_EEI, DMA30_CEEI, DMA30_CERQ = ignore,  DMA30_SERQ = enable SPI DMA

*(uint32_t*)0x40098018 = (30<<24) + 0x808080;

Then the SPI launches no problem

If I use another DMA channel to transfer the memory into 0x40098018, the SPI does not start.

uint32_t test[1];

test[0] = (30<<24) + 0x808080;

transferDescriptor.SRC_ADDR  = (uint32_t)((uint32_t *)&(test[0]));

transferDescriptor.DST_ADDR  = (uint32_t) (0x40098018);

transferDescriptor.SRC_WIDTH = 4;

transferDescriptor.SRC_MODULO = 0;

transferDescriptor.SRC_OFFSET = 0;

transferDescriptor.DST_MODULO = 0;

transferDescriptor.DST_OFFSET = 0;

transferDescriptor.DST_WIDTH = 4;

transferDescriptor.LOOP_BYTES = 4;

transferDescriptor.LOOP_COUNT = 1;

transferDescriptor.LOOP_SRC_OFFSET = 0;

transferDescriptor.LOOP_DST_OFFSET = 0;

dma_request_enable(transferChannel);

dma_transfer_submit(transferChannel, &transferDescriptor, NULL);

If I use the same DMA channel and do an 8-bit transfer instead of 32-bit transfer, the SPI DOES start.

uint8_t test[1];

test[0] = (30);

transferDescriptor.SRC_ADDR  = (uint32_t)((uint32_t *)&(test[0]));

transferDescriptor.DST_ADDR  = (uint32_t) (0x4009801b);

transferDescriptor.SRC_WIDTH = 1;

transferDescriptor.SRC_MODULO = 0;

transferDescriptor.SRC_OFFSET = 0;

transferDescriptor.DST_MODULO = 0;

transferDescriptor.DST_OFFSET = 0;

transferDescriptor.DST_WIDTH = 1;

transferDescriptor.LOOP_BYTES = 1;

transferDescriptor.LOOP_COUNT = 1;

transferDescriptor.LOOP_SRC_OFFSET = 0;

transferDescriptor.LOOP_DST_OFFSET = 0;

dma_request_enable(transferChannel);

dma_transfer_submit(transferChannel, &transferDescriptor, NULL);

Does anyone know what's going on here?  I need to be able to do this with a 32-bit DMA transfer instead of an 8-bit DMA transfer, so that I can also modify another 32-bit register with an incremented offset.

Thanks everyone.

0 项奖励
回复
1 解答
3,828 次查看
CommunityBot
Community Manager
This an automatic process.

We are marking this post as solved, due to the either low activity or any reply marked as correct.

If you have additional questions, please create a new post and reference to this closed post.

NXP Community!

在原帖中查看解决方案

0 项奖励
回复
8 回复数
3,829 次查看
CommunityBot
Community Manager
This an automatic process.

We are marking this post as solved, due to the either low activity or any reply marked as correct.

If you have additional questions, please create a new post and reference to this closed post.

NXP Community!
0 项奖励
回复
3,829 次查看
timesyssupport
Senior Contributor II

Hello Nathan,

Is this issue being encountered when running Linux, or MQX? Or, is MQX running alongside MQX?

Regards,

Timesys Support

0 项奖励
回复
3,829 次查看
nathanb_
Contributor III

Hello Timesys,

Linux is running on the A5

MQX is running on the M4

MQX is setting up and running the DMA transfer

The issue occurs whether or not Linux is running (if I sit in u-boot, the same thing happens)

Thanks,

Nathan

0 项奖励
回复
3,829 次查看
alejandrolozan1
NXP Employee
NXP Employee

Hi,

Just to clarify, you are trying to modify the configuration of a DMA module with a DMA transfer from a different one, correct?

I wonder if just linking channels or the scatter gather feature may help. Is there a restriction to use that?

Best Regards,

Alejandro

0 项奖励
回复
3,829 次查看
nathanb_
Contributor III

Alejandro,

You are correct.  Yes I am trying to modify the config of a DMA module with a DMA transfer from a different module.

Linking channels with an 8-bit transfer and a 32-bit transfer would work for us, I think.  I don't believe we have any restrictions.  We just need a way to set DMAx_TCDn_DADDR and DMAx_SERQ from another DMAy transfer.

Thanks again.

0 项奖励
回复
3,829 次查看
alejandrolozan1
NXP Employee
NXP Employee

Hi,

We have examples for scatter-gather and channel linking for other architectures. Please refer to the attached examples. The DMA module and DMA MUX is quite similar and it should be very easy to migrate the configuration to Vybrid.

I hope it helps,

Alejandro

3,829 次查看
nathanb_
Contributor III

I am using an interrupt to do it at the moment now.  I will investigate moving it to a channel linked DMA when I get a chance.


Thanks.

0 项奖励
回复
3,829 次查看
karina_valencia
NXP Apps Support
NXP Apps Support

timesyssupport​ are you able to help here?

0 项奖励
回复