1. 开发平台:TI TMS320C6678evm板,仿真器Blackhawk XDS560v2-USB Mezzanine Emulator
2. 软件环境:CCS 5.4.0,mcsdk为2_01_02_06
3. 由于项目需要,需要同时使用3个EDMA3通道进行数据传输,其中两个通道完成从DDR3向L2SRAM传输,一个通道完成从L2SRAM向DDR3传输。使用以下程序可以打开两个通道,第三个会报EDMA3_DRV_E_DMA_CHANNEL_UNAVAIL的错误。在网上查阅资料说同sample_c6678_cfg.c文件中sampleInstInitConfig有关,更改其中的值可以改变保留的通道数和可使用通道数。我按照1bit对应一个通道的原则对ownPaRAMSets、ownDmaChannels和ownTccs进行了修改。然后编译工程,发现问题仍然无法解决。网上还有说修改完sampleInstInitConfig后,还要对edma3_lld_rm_sample.ae66进行重新编译,这一步我不知道怎么做然后没有做。
4. 还有在“C:\ti\edma3_lld_02_11_05_02\packages\ti\sdo\edma3\rm\sample\src\platforms\”和"C:\ti\edma3_lld_02_11_05_02\packages\ti\sdo\edma3\drv\sample\src\platforms\"目录下面各有一个sample_c6678_cfg.c文件,请问它们作用一样么,在做修改时只修改一个就可以还是要全部修改。
5. 参考其他解决多通道问题的方案,可以使用两个EDMA3 Instance,我使用了,使用后EDMA3_DRV_requestChannel()编译通过,但是在使用EDMA3_DRV_waitAndClearTcc()函数等待传输完成时,无法完成。
6. 问题比较紧急,希望相关方面的大牛可以给予快速回复。非常感谢!!!
/* ownPaRAMSets */
/* 31 0 63 32 95 64 127 96 */
{0x3FFF0003u, 0x00000000u, 0x00000000u, 0x00000000u,
/* 159 128 191 160 223 192 255 224 */
0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u,
/* 287 256 319 288 351 320 383 352 */
0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u,
/* 415 384 447 416 479 448 511 480 */
0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u},
/* ownDmaChannels */
/* 31 0 63 32 */
{0x00000003u, 0x00000000u},
/* ownQdmaChannels */
/* 31 0 */
{0x00000001u},
/* ownTccs */
/* 31 0 63 32 */
{0x00000003u, 0x00000000u},
hEdma = edma3init(edmaInstance, &edmaResult);
if (edmaResult1 == EDMA3_DRV_SOK) {
printf("hEdma1 edma3init success!\n");
}
else
printf("hEdma1 edma3init failed!\n");
/* Setup for Channel 1*/
tcc0 = EDMA3_DRV_TCC_ANY;
chId0= EDMA3_DRV_DMA_CHANNEL_ANY;
/* Request any DMA channel and any TCC */
result = EDMA3_DRV_requestChannel (hEdma, &chId0, &tcc0, (EDMA3_RM_EventQueue)0, NULL, NULL);
if (result == EDMA3_DRV_SOK)
printf("DMA channel 0: %d\n", chId0);
else
printf("DMA channel 0 request failed!\n");
tcc1= EDMA3_DRV_TCC_ANY;
chId1= EDMA3_DRV_DMA_CHANNEL_ANY;
result1= EDMA3_DRV_requestChannel (hEdma, &chId1, &tcc1, (EDMA3_RM_EventQueue)0, NULL, NULL);
if (result1== EDMA3_DRV_SOK)
printf("DMA channel 1: %d\n", chId0);
else
printf("DMA channel 1 request failed!\n");
tcc2= EDMA3_DRV_TCC_ANY;
chId2= EDMA3_DRV_DMA_CHANNEL_ANY;
result2= EDMA3_DRV_requestChannel (hEdma, &chId2, &tcc2, (EDMA3_RM_EventQueue)0, NULL, NULL);
if (result2 == EDMA3_DRV_SOK)
printf("DMA channel 2: %d\n", chId2);
else
printf("DMA channel 2 request failed! error code : %d\n", result2);