C6455EDMA3mcbsp.docx
《C6455EDMA3mcbsp.docx》由会员分享,可在线阅读,更多相关《C6455EDMA3mcbsp.docx(28页珍藏版)》请在冰豆网上搜索。
C6455EDMA3mcbsp
6455的EDMA3+MCBSP
根据6455开发板自带的程序修改而来,调试通过,这个工程包括两个文件Edma_interrupt_example.c和edmaIntDispatcher.c,第一个是初始化的程序,第二个为中断服务子程序。
最后再附带一个FPGA的Verilog程序,用与产生mcbsp的接收数据。
如果想接收更多的数据,修改BUFFSIZE的大小就好了。
希望对你有帮助!
下面是第一个文件内容
/*根据dsk_app.c这个文件修改的mcbsp+edma,调试通过
*/
#include
#include
#include
#include
#include
#include
#include
#defineBUFFSIZE10
#definePING0
#definePONG1
Int16gBufferXmtPing[BUFFSIZE];//TransmitPINGbuffer
Int16gBufferXmtPong[BUFFSIZE];//TransmitPONGbuffer
Int16gBufferRcvPing[BUFFSIZE];//ReceivePINGbuffer
Int16gBufferRcvPong[BUFFSIZE];//ReceivePONGbuffer
volatileUint32intFlag=0;
Uint32passStatus=1;
/*Forwarddeclaration*/
voidtcc1Fxn(void);
voidedmaInit(void);
/*Macrothatgives2CLKdelaycycles*/
#defineWAIT_FOR_2_CLKdo{\
volatileintdelayCnt=2;\
while(delayCnt>0)--delayCnt;\
}while(0)
/*Globalconstants-Numberofwordstotransfer*/
//#defineNumOfWords100
/*Functiondeclarations*/
voidinit_McBSP0(void);
CSL_StatushwSetupVerify(CSL_McbspHwSetup*,
CSL_McbspHwSetup*
);
/*HandlefortheMCBSPinstance*/
CSL_McbspHandlehMcbsp;
/*Createdatabuffersfortransfer*/
//Uint16xmt[NumOfWords];
//Uint16rcv[NumOfWords];
/*Globaldatadefinition*/
CSL_McbspGlobalSetupmcbspGbl={
CSL_MCBSP_IOMODE_TXDIS_RXDIS,
CSL_MCBSP_DLBMODE_OFF,//关闭自环模式
CSL_MCBSP_CLKSTP_DISABLE
};
/*Receivedatasetup*/
CSL_McbspDataSetupmcbspRxData={
CSL_MCBSP_PHASE_SINGLE,
CSL_MCBSP_WORDLEN_8,
1,//framelength
(CSL_McbspWordLen)0,
0,
//CSL_MCBSP_FRMSYNC_IGNORE,//framesincignore
CSL_MCBSP_FRMSYNC_DETECT,
CSL_MCBSP_COMPAND_OFF_MSB_FIRST,
CSL_MCBSP_DATADELAY_1_BIT,
CSL_MCBSP_RJUSTDXENA_RJUST_RZF,
CSL_MCBSP_INTMODE_ON_READY,
//CSL_MCBSP_INTMODE_ON_FSYNC,
CSL_MCBSP_32BIT_REVERS_DISABLE
};
/*Transmitdatasetup*/
CSL_McbspDataSetupmcbspTxData={
CSL_MCBSP_PHASE_SINGLE,
CSL_MCBSP_WORDLEN_8,
1,//每次发送一个元素
(CSL_McbspWordLen)0,
0,
CSL_MCBSP_FRMSYNC_DETECT,
CSL_MCBSP_COMPAND_OFF_MSB_FIRST,
CSL_MCBSP_DATADELAY_1_BIT,//发送时,相对于同步信号延时一个clk
CSL_MCBSP_RJUSTDXENA_DXENA_OFF,
CSL_MCBSP_INTMODE_ON_READY,
//CSL_MCBSP_INTMODE_ON_FSYNC,
CSL_MCBSP_32BIT_REVERS_ENABLE
};
/*Clocksetupdefaults*/
CSL_McbspClkSetupmcbspClock={
CSL_MCBSP_FSCLKMODE_INTERNAL,/*XMTFrame-sync*/
//CSL_MCBSP_FSCLKMODE_INTERNAL,/*RCVFrame-sync*/
CSL_MCBSP_FSCLKMODE_EXTERNAL,
CSL_MCBSP_TXRXCLKMODE_INTERNAL,/*XMTclock*/
//CSL_MCBSP_TXRXCLKMODE_INTERNAL,/*RCVclock*/
CSL_MCBSP_TXRXCLKMODE_EXTERNAL,
CSL_MCBSP_FSPOL_ACTIVE_HIGH,/*XMTFrame-syncactivehigh*/
CSL_MCBSP_FSPOL_ACTIVE_HIGH,/*RCVFrame-syncactivehigh*/
CSL_MCBSP_CLKPOL_TX_RISING_EDGE,/*XMTclockrisingedge*/
//CSL_MCBSP_CLKPOL_RX_FALLING_EDGE,/*RCVclockfallingedge*/
CSL_MCBSP_CLKPOL_RX_RISING_EDGE,/*RCVclockfallingedge*/
0,/*Frame-syncpulsewidth=1bit*/
0x8,/*Frame-syncpulseperiod17clk*/
0x5,/*clkdivideby6*/
CSL_MCBSP_SRGCLK_CLKCPU,
CSL_MCBSP_CLKPOL_TX_RISING_EDGE,/*CLKSpinsignalrisingedge*/
CSL_MCBSP_TXFSMODE_DXRCOPY,
//CSL_MCBSP_TXFSMODE_SRG,
CSL_MCBSP_CLKGSYNCMODE_OFF/*GSYNC=0meansnoclocksynchronisation*/
};
/*Multichannelsetup*/
CSL_McbspMulChSetupmcbspMul={
CSL_MCBSP_PARTMODE_2PARTITION,/*RX*/
CSL_MCBSP_PARTMODE_2PARTITION,/*TX*/
(Uint16)0,/*rxMulChSel*/
(Uint16)0,/*txMulChSel*/
CSL_MCBSP_PABLK_0,/*rxPartABlk*/
CSL_MCBSP_PBBLK_1,/*rxPartBBlk*/
CSL_MCBSP_PABLK_0,/*txPartABlk*/
CSL_MCBSP_PBBLK_1/*txPartABlk*/
};
/*Mcbsphwsetup*/
CSL_McbspHwSetupmyHwSetup={
&mcbspGbl,
&mcbspRxData,
&mcbspTxData,
&mcbspClock,
&mcbspMul,
CSL_MCBSP_EMU_FREERUN,
NULL
};
/*Intcdeclaration*/
CSL_IntcContextintcContext;
CSL_IntcEventHandlerRecordEventHandler[100];
CSL_IntcObjintcObjEdma;
CSL_IntcHandlehIntcEdma;
CSL_IntcGlobalEnableStatestate;
CSL_IntcEventHandlerRecordEventRecord;
CSL_IntcParamvectId;
CSL_Edma3HwDmaChannelSetupdmahwSetup[CSL_EDMA3_NUM_DMACH]=CSL_EDMA3_DMACHANNELSETUP_DEFAULT;
CSL_Edma3HwSetuphwSetup={&dmahwSetup[0],NULL};
/*Globals*/
/*Edmahandle*/
CSL_Edma3HandlehModule;
/*PaRAMsettingsforsets13(receive)and65(receivepingreload)*/
CSL_Edma3ParamSetupgParamSetupRcvPing={//PaRAMSetStructureforreceivepingbuffer
CSL_EDMA3_OPT_MAKE//option-OPT
(CSL_EDMA3_ITCCH_DIS,\
CSL_EDMA3_TCCH_DIS,\
CSL_EDMA3_ITCINT_DIS,\
CSL_EDMA3_TCINT_EN,\
15,CSL_EDMA3_TCC_NORMAL,\
CSL_EDMA3_FIFOWIDTH_NONE,\
CSL_EDMA3_STATIC_DIS,\
CSL_EDMA3_SYNC_A,\
CSL_EDMA3_ADDRMODE_INCR,\
CSL_EDMA3_ADDRMODE_INCR),
(Uint32)0x028c0000,//srcAddr-SRC
CSL_EDMA3_CNT_MAKE(2,BUFFSIZE),//aCntbCnt-(ACNT,BCNT)
(Uint32)&gBufferRcvPing,//dstAddr-DST
CSL_EDMA3_BIDX_MAKE(0,2),//srcDstBidx-(SRCBIDX,DSTBIDX)
CSL_EDMA3_LINKBCNTRLD_MAKE(0x4800,1),//linkBcntrld-(LINK,BCNTRLD)
CSL_EDMA3_CIDX_MAKE(0,0),//srcDstCidx-(SRCCIDX,DSTCIDX)
1//cCnt-CCNT
};
/*PaRAMsettingsforset64(transmitpongreload)*/
CSL_Edma3ParamSetupgParamSetupRcvPong={//PaRAMSetStructureforreceivepongbuffer
CSL_EDMA3_OPT_MAKE//option-OPT
(CSL_EDMA3_ITCCH_DIS,\
CSL_EDMA3_TCCH_DIS,\
CSL_EDMA3_ITCINT_DIS,\
CSL_EDMA3_TCINT_EN,\
15,CSL_EDMA3_TCC_NORMAL,\
CSL_EDMA3_FIFOWIDTH_NONE,\
CSL_EDMA3_STATIC_DIS,\
CSL_EDMA3_SYNC_A,\
CSL_EDMA3_ADDRMODE_INCR,\
CSL_EDMA3_ADDRMODE_INCR),
(Uint32)0x028c0000,//srcAddr-SRC
CSL_EDMA3_CNT_MAKE(2,BUFFSIZE),//aCntbCnt-(ACNT,BCNT)
(Uint32)&gBufferRcvPong,//dstAddr-DST
CSL_EDMA3_BIDX_MAKE(0,2),//srcDstBidx-(SRCBIDX,DSTBIDX)
CSL_EDMA3_LINKBCNTRLD_MAKE(0x4820,1),//linkBcntrld-(LINK,BCNTRLD)
CSL_EDMA3_CIDX_MAKE(0,0),//srcDstCidx-(SRCCIDX,DSTCIDX)
1//cCnt-CCNT
};
voidedmaInit()
{
CSL_Edma3ObjedmaObj;
CSL_Edma3ParamHandlehParamBasic1;
CSL_Edma3ChannelObjchObjXmt,chObjRcv;
CSL_Edma3CmdIntrregionIntr;
CSL_Edma3CmdDraeregionAccess;
CSL_Edma3ChannelHandlehChannelXmt,hChannelRcv;
CSL_Edma3Contextcontext;
CSL_Edma3ChannelAttrchAttrXmt,chAttrRcv;
CSL_Statusstatus;
Uint32i;
/*Intcmoduleinitialization*/
intcContext.eventhandlerRecord=EventHandler;
intcContext.numEvtEntries=10;
CSL_intcInit(&intcContext);
/*EnableNMIs*/
CSL_intcGlobalNmiEnable();
/*Enableglobalinterrupts*/
CSL_intcGlobalEnable(&state);
/*Openingaintchandleforedmaevent*/
vectId=CSL_INTC_VECTID_4;
hIntcEdma=CSL_intcOpen(&intcObjEdma,CSL_INTC_EVENTID_EDMA3CC_INT1,\
&vectId,NULL);
/*Moduleinitialization*/
status=CSL_edma3Init(&context);
if(status!
=CSL_SOK){
printf("Edmamoduleinitializationfailed\n");
return;
}
/*Edmamoduleopen*/
hModule=CSL_edma3Open(&edmaObj,CSL_EDMA3,NULL,&status);
/*SetuptheDRAEmasks
*DRAEenable(Bits0-15)fortheshadowregion1.
*/
regionAccess.region=CSL_EDMA3_REGION_1;
regionAccess.drae=0xFFFFFFFF;
regionAccess.draeh=0xFFFFFFFF;
CSL_edma3HwControl(hModule,CSL_EDMA3_CMD_DMAREGION_ENABLE,®ionAccess);
/*DMAchanel-->PaRAMmapping,queueassignment*/
dmahwSetup[12].paramNum=12;
dmahwSetup[12].que=CSL_EDMA3_QUE_1;
dmahwSetup[13].paramNum=13;
dmahwSetup[13].que=CSL_EDMA3_QUE_1;
CSL_edma3HwSetup(hModule,&hwSetup);
/*---SetupReceiveChanvnel(McBSP1receive,param13)---*/
/*Channelopen*/
chAttrRcv.regionNum=CSL_EDMA3_REGION_1;
chAttrRcv.chaNum=CSL_EDMA3_CHA_REVT0;
hChannelRcv=CSL_edma3ChannelOpen(&chObjRcv,CSL_EDMA3,&chAttrRcv,&status);
/*Setupparameterblock65asEDMAtransmitpingreload*/
hParamBasic1=CSL_edma3GetParamHandle(hChannelRcv,65,NULL);
status=CSL_edma3ParamSetup(hParamBasic1,&gParamSetupRcvPing);
/*Setupparameterblock64asEDMAtransmitpongreload*/
hParamBasic1=CSL_edma3GetParamHandle(hChannelRcv,64,NULL);
CSL_edma3ParamSetup(hParamBasic1,&gParamSetupRcvPong);
/*Setupparameterblock13asEDMAtransmit(startwithcopyofping)*/
hParamBasic1=CSL_edma3GetParamHandle(hChannelRcv,13,NULL);
CSL_edma3ParamSetup(hParamBasic1,&gParamSetupRcvPing);
/*Setupchannelandqueuerelationships*/
CSL_edma3HwChannelSetupParam(hChannelRcv,13);
CSL_edma3HwChannelSetupQue(hChannelRcv,CSL_EDMA3_QUE_1);
/*AssociationofanEDMAeventhandlerwiththeINTCroutine*/
EventRecord.handler=&eventEdmaHandler;
EventRecord.arg=(void*)(hModule);
CSL_intcPlugEventHandler(hIntcEdma,&EventRecord);
/*Enablingeventedma*/
CSL_intcHwControl(hIntcEdma,CSL_INTC_CMD_EVTENABLE,NULL);
/*HookuptheEDMAeventwithancompletioncodefunctionhandler*/
EdmaEventHook(15,tcc1Fxn);
//EdmaEventHook(1,tcc1Fxn);
/*EnableEDMAregioninterrupts*/
regionIntr.region=CSL_EDMA3_REGION_1;
regionIntr.intr=0x0000C000;
regionIntr.intrh=0x00000000;
CSL_edma3HwControl(hModule,CSL_EDMA3_CMD_INTR_ENABLE,®ionIntr);
/*Receiveeventclearandenable,备注用于外部触发使用*/
CSL_edma3HwChannelControl(hChannelRcv,CSL_EDMA3_CMD_CHANNEL_CLEAR,NULL);
CSL_edma3HwChannelControl(hChannelRcv,CSL_EDMA3_CMD_CHANNEL_ENABLE,NULL);
/*ClearCPUinterruptevent72(EVTCLR2)*/
//*((Uint32*)0x1800048)=0x00000100;
/*EnableCPUinterruptevent72(EVTMASK2)*/
//*((Uint32*)0x1800088)=0x00000100;
/*Manuallytriggerthereceivechannel备注,如果手动触发的话,就不要使能通道,即
CSL_edma3HwChannelControl(hChannelRcv,CSL_EDMA3_CMD_CHANNEL_ENABLE,NULL)这句话要注释掉;*/
/*for(i=1;i<=BUFFSIZE;i++)
{
status=CSL_edma3HwChannelControl(hChannelRcv,CSL_EDMA3_CMD_CHANNEL_SET,NULL);
if(status!
=CSL_SOK){
printf("Edmachannelsetcommandfailed\n");
return;
}
}*/
while
(1)
{
//while(!
intFlag);
if(intFlag)
{
intF