工具/软件:TI-RTOS
你(们)好。
我尝试进入整个 EDMA 过程、并尝试在 BBB 上的 AM335x 的片上 DDR 上实施 manuell dma-memcopy。 因此、我使用了位于 "ti\EDMA3_LLD_2_12_04_28\examples\EDMA3_driver\"中的 EDMA_test 部分、并对其稍作更改。 测试数据在 RAM 中成功初始化、EDMA 寄存器中的传输完成位被置位和清零、但 DDR 中的数据仍处于与 EDMA 之前相同的状态。 我在 RTOS 中以任务的形式运行传输。
我认为我仍然错过了一些重要的步骤或犯了一个重大的错误。 感谢你的帮助!
我的代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX_ACount 64
#define MAX_BCOUNT 1
#define MAX_COUNT 1
#define MAX_BUFFATER_SIZE (MAX_ACount* MAX_BCOUNT* MAX_CCOUNT)
#define BUFFERBASEADD 0x83000000
#define BUFFERDEST1 (MAX_BUFFERBASEADD +MAX_BUFFERBACK_COUNT* MAX_COUNT* MAX_SHIFT)
#define BUFFERBADD 0x83000000 #define BUFFERDEST1 (#define BUFFERDEST1)#def
(0x00000002u)
#define OPT_TCC_MASK (0x0003F000u)
#define OPT_TCC_SHIFT (0x0000000Cu)
#define OPT_ITCINTE_SHIFT (0x00000015u)
#define OPT_TCINTE_SHIFT (0x00000014u)
extern EDMA3_DRV_GblConfigParams sampleEdma3GblCfgParams[];
extern void registerEdma3Interrupts (uint32_t edma3Id);
static char * const srcbubuff =(char *) BUFFERBASEADD;
static Flag *= 0
* convistt edma3Id);static char * const char * condtran1 * transfer =
(volatile rischar * 1)
/*用于检查通道2上传输完成情况的标志变量*/
易失性短路 irqRaised2=0;
void *AppSemHandle1=NULL;
//应用程序内存句柄*/
void *AppSemHandle2=INT;
void callback2(UINT32_t TCC,EDMA3_RM_TccStatus,void *AppData );
void callback2(UINT32_t Tccat);void callt.032_t.callt TCC (nL) EDMA3_RM_TccStatus、void * AppData);
void testEDMA (uint32_t acnt、uint32_t bcnt、uint32_t ccnt、
EDMA3_DRV_SyncType syncType)
{
int j = 0、i = 0;
对于(j = 0;j < MAX_BUFFER_SIZE;+j)
{
srcbuffer[j]= 0xFF;
}
对于(j = 0;j < MAX_BUFFER_SIZE;+j)
{
destbuff[j]= 0xAA;
}
EDMA3_DRV_Handle hEdma = 0;
EDMA3_DRV_RESULT edmaResult = EDMA3_DRV_SOK;
hEdma = edma3init (0、&edmaResult);
if (edmaResult!= EDMA3_DRV_Sok)
{
UART_printf ("\n DER init war Oasch!\n");
}
EDMA3_DRV_PaRAMRegs 参数集=
{
0、0、0、0、0、0、 0、0、0、0、0、 0、0
};
Semaphore_Params semParams;
Semaphore_Params_init (semParams);
unsigned char *p =(unsigned char *)&ParamSet;
unsigned int index = 0;
/*清理结构变量的内容*/
对于(index = 0;index < size_ParamSet;index++)
{
p[index]= 0;
}
edmaResult = edma3OsSemCreate (0、&semParams、&AppSemHandle1);
if ((edmaResult!= EDMA3_DRV_SOK)||(AppSemHandle1 = NULL)
){
UART_printf ("初始化应用信标句柄时出错\n");
return;
}
edmaResult = edma3OsSemCreate (0、&semParams、&AppSemHandle2);
if ((edmaResult!= EDMA3_DRV_SOK)||(AppSemHandle2 = NULL)
){
UART_printf ("初始化应用信标句柄时出错\n");
return;
}
if (hEdma)
{
uart_printf ("edma3init()传递了\n");
}
否则
{
uart_printf ("edma3init()失败、错误代码:%d\n"、(int) edmaResult);
}
uint32_t Istpassed = 0U;
uint32_t numenabled_= 0;
uint32_t chid = EDMA3_DRV_DMA_CHANGE_ANY;
uint32_t TCC = EDMA3_DRV_TCC_ANY;
uint32_t BRcnt = 0;
int srcbidx=0、desbidx=0;
int srcidx = 0、desidx = 0;
BRCnt = bcnt;
/*将 B count reload 设置为 B count。 *
BRCnt = bcnt;
/*设置 SRC/DES 索引*/
srcbidx =(int) acnt;
desbidx =(int) acnt;
if (synctype =EDMA3_DRV_SYNC_A)
{
/* A 同步传输模式*/
srccidx =(int) acnt;
desidx =(int) acnt;
}
否则
{
/* AB 同步传输模式*/
srcidx =((int) acnt *(int) bcnt);
desidx =((int) acnt *(int) bcnt);
}
/*通道1*/的设置
TCC = EDMA3_DRV_TCC_ANY;
ChID = EDMA3_DRV_DMA_CHANGE_ANY;
/*请求任何 DMA 通道和任何 TCC */
if (edmaResult = EDMA3_DRV_SOK)
{
edmaResult = EDMA3_DRV_requestChannel (hEdma、&Chid、&TCC、
(EDMA3_RM_EventQueue) 0、&callback1、 空);
}
否则
{
UART_printf ("\n 通道请求失败\n");
}
if (edmaResult =EDMA3_DRV_SOK)
{
/*用传输特定信息填充参数集*
/ ParamSet.srcAddr =(uint32_t)(srcbuff);
paramSet.destAddr =(uint32_t)(destbuff);
/**
*小心!!!
* SRCBIDX/DSTBIDX 的有效值介于–32768和32767之间
* SRCCIDX/DSTCIDX 的有效值介于–32768和32767之间
*/
ParamSet.srcBIdx = srcbidx;
paramSet.destBIdx = desbidx;
ParamSet.srcCIdx = srcidx;
paramSet.destCIdx = srcidx;
*小心!*!*!
* ACNT/CBNT/CCNT 的有效值介于0和65535之间。
* ACNT/CBNT/CCNT 必须大于或等于1。
*数组中的最大字节数(ACNT)为65535字节
*帧中的数组最大数(BCNT)为65535
*块中的最大帧数(CCNT)为65535
*/
ParamSet.aCnt = acnt;
ParamSet.bCnt = bcnt;
ParamSet.ccnt = ccnt;
//对于 AB 同步传输,不使用 BCNTRLD。 */
ParamSet.bCntReload = BRCnt;
ParamSet.linkAddr = 0xFFFFFFu;
/* src 和 dest 处于 INCR 模式*/
ParamSet.opt &= 0xFFFFFFFCu;
/*对 TCC 进行编程*/
ParamSet.op=((TCC << opt_CCT_SHIFT)和 opt_CCD_MASK);
/*启用中间和最终传输完成中断*/
//ParamSet.op=(1 <<OPT_ITCINTE_SHIFT);
ParamSet.opt |=(1 << opt_TCINTEN 位移);
ParamSet.opt |=(1 << 3);
if (synctype =EDMA3_DRV_SYNC_A)
{
ParamSet.opt &= 0xFFFFFFFBu;
}
其他
{
/* AB 同步传输模式*/
ParamSet.opT|=(1 <<OPT_SYNCDIM_SHIFT);
}
/*现在,写入参数集。 //
edmaResult = EDMA3_DRV_setPaRAM (hEdma、Chid、&ParamSet);
if (edmaResult = EDMA3_DRV_Sok)
{
UART_printf ("\n 参数集成功\n");
}
其他
{
UART_printf ("\n 参数集失败\n");
}
}
if (edmaResult =EDMA3_DRV_SOOK)
{/*
需要激活下一个 param*/
if (syncType=EDMA3_DRV_SYNC_A)
{
已连接线缆= bcnt * ccnt;
}
其他
{
/* AB 同步传输模式*/
已连接线缆= ccnt;
}
对于(i = 0;i <已连接、i++)
{
irqRaised1 = 0;
/*
*现在启用上述计算次数的传输。
*
edmaResult = EDMA3_DRV_enableTransfer (hEdma、Chid、
EDMA3_DRV_TRIG_MODE_MANUAL);
if (edmaResult!= EDMA3_DRV_SOK)
{
UART_printf ("EDMA3_TEST:EDMA3_DRV_enableTransfer "
Failed、error code:%d\r\n"、(int) edmaResult);
break;
}
否则
{
UART_printf (
"EDMA3_TEST:EDMA_DRV_enableTransfer 成功、返回代码:%d\r\n"、
(int) edmaResult);
}
edma3OsSemTake (AppSemHandle1、EDMA3_OSSEM_NO_TIMEOUT);
/*等待完成 ISR。 *
while (irqRaised1 = 0U)
{
//等待完成 ISR。 //
//uart_printf ("正在等待中断...\n");
}
/*检查已完成转接的状态*/
如果(irqRaised1 < 0)
{
//发生一些错误,则从 for 循环中断。 /uart_printf
("\r\ndma3_test:发生事件错误!!!\r\n");
/*首先清除错误位*/
edmaResult = EDMA3_DRV_clearBits (hEdma、ChErrorid);
break;
}
}
/*匹配源缓冲区和目标缓冲区。 *
if (EDMA3_DRV_Sok = edmaResult)
{
for (i = 0;i <(acnt * bcnt * ccnt);i++)
{
if (srcbubuff [i]!= destbuff [i])
{
Istpassed = 0U;
UART_printf ("EDMA3_test:数据写入-读取匹配"
在 i =%d\r\n"、i 时失败);
break;
}
if (i ==(acnt * bcnt * ccnt))
{
IstPassed = 1U;
}
/*释放先前分配的信道。 */
edmaResult = EDMA3_DRV_freeChannel (hEdma、Chid);
if (edmaResult!= EDMA3_DRV_Sok)
{
UART_printf ("EDMA3_TEST:EDMA3_DRV_freeChannel()失败,"
"错误代码:%d\r\n"、(int) edmaResult);
}
}
返回 edmaResult
;}
void callback1 (uint32_t TCC、EDMA3_RM_TccStatus、void * AppData)
{
(无效) TCC;
(空) AppData;
开关(状态)
{
案例 EDMA3_RM_Xfer_COMPLETE:
/*传输成功完成*/
irqRaised1 = 1;
中断;
案例 EDMA3_RM_E_CC_DMA_EVT_Miss:
/*传输导致 DMA 事件缺失错误。 */
irqRaised1 =-1;
break;
案例 EDMA3_RM_E_CC_QDMA_EVT_Miss:
/*传输导致 QDMA 事件缺失错误。 */
irqRaised1 =-2;
break;
默认值:
break;
}
edma3OsSemGive (AppSemHandle1);
}
/*回调函数2 */
void callback2 (uint32_t TCC、EDMA3_RM_TccStatus、void * AppData)
{
(无效) TCC;
(空) AppData;
开关(状态)
{
案例 EDMA3_RM_Xfer_COMPLETE:
/*传输成功完成*/
irqRaised2 = 1;
中断;
案例 EDMA3_RM_E_CC_DMA_EVT_Miss:
/*传输导致 DMA 事件缺失错误。 */
irqRaised2 =-1;
break;
案例 EDMA3_RM_E_CC_QDMA_EVT_Miss:
/*传输导致 QDMA 事件缺失错误。 */
irqRaised2 =-2;
break;
默认值:
break;
}
edma3OsSemGive (AppSemHandle2);
}
void testEDMA_wrapper (void)
{
//TaskWrapper
testEDMA (MAX_ACount、MAX_BCOUNT、MAX_CCOUNT、EDMA3_DRV_SYNC_A);
}