我是使用DSP 6678, EVM板子, CCS版本5.4
如下面的函式, 我設定2組PaRAM Set, 要使用link transfer傳輸byteCount大小的資料,
BIDX = 32640, 第一組PaRAM(下面那組)傳輸小於32640剩餘的資料, 傳輸完會Link到上面那組PaRAM, 傳輸32640的倍數資料,
上面那組的TCC uiChannel2 = uiChannel+1;
能否幫我查看是那裡錯了, 它只會傳下面那組小於32640的資料, 不會傳上面那個PaRAM資料,
或是有Link傳輸的範例可以參考嗎? 謝謝
void Memcpy_DMA_Modify2(unsigned int dstAddress, unsigned int srcAddress, unsigned int byteCount)
{
CSL_TpccRegs* EDMACCRegs;
unsigned int uiChannel, uiChannel2, uiChannelShift, ACNTSize, uiBCNT, BIDX = 32640;//32512 32768
volatile Uint32 * TPCC_ESR;
volatile Uint32 * TPCC_IPR;
volatile Uint32 * TPCC_ICR;
EDMA_CC_Channel_Num CC_channel;
CC_channel = TC_channel_Table[0];
EDMACCRegs= gpEDMA_CC_regs[CC_channel>>16];
uiChannel = CC_channel&0xFF;
if(uiChannel<32)
{
TPCC_ESR= &EDMACCRegs->TPCC_ESR;
TPCC_IPR= &EDMACCRegs->TPCC_IPR;
TPCC_ICR= &EDMACCRegs->TPCC_ICR;
uiChannelShift= uiChannel;
}
else
{
TPCC_ESR= &EDMACCRegs->TPCC_ESRH;
TPCC_IPR= &EDMACCRegs->TPCC_IPRH;
TPCC_ICR= &EDMACCRegs->TPCC_ICRH;
uiChannelShift= uiChannel - 32;
}
ACNTSize = byteCount%BIDX;
if(ACNTSize != 0)
{
//second PaRAM
byteCount -= ACNTSize;
unsigned int srcAddress2 = srcAddress + ACNTSize;
unsigned int dstAddress2 = dstAddress + ACNTSize;
uiChannel2 = uiChannel+1;
uiBCNT = byteCount/BIDX;
if(uiBCNT>65535)
uiBCNT= 65535;
if(uiBCNT != 0)
{
EDMACCRegs->PARAMSET[uiChannel2].OPT=
CSL_EDMA3_OPT_MAKE(CSL_EDMA3_ITCCH_DIS, //Intermediate transfer completion chaining
CSL_EDMA3_TCCH_DIS, //Transfer complete chaining
CSL_EDMA3_ITCINT_DIS, //Intermediate transfer completion interrupt
CSL_EDMA3_TCINT_EN, //Transfer complete interrupt
uiChannel2, //Transfer complete code(TCC): 6-bit code sets the relevant bit in the chaining enable register(CER) for chaining or in the interrupt pending register(IPR) for interrupts.
CSL_EDMA3_TCC_NORMAL, //TCC mode
CSL_EDMA3_FIFOWIDTH_NONE, //FIFO Width
CSL_EDMA3_STATIC_DIS, //keep PARAM uncharged
CSL_EDMA3_SYNC_A, //A synchronization
CSL_EDMA3_ADDRMODE_INCR, //Destination address mode //1
CSL_EDMA3_ADDRMODE_INCR); //Source address mode //1
EDMACCRegs->PARAMSET[uiChannel2].SRC= GLOBAL_ADDR(srcAddress2);
EDMACCRegs->PARAMSET[uiChannel2].SRC_DST_BIDX= CSL_EDMA3_BIDX_MAKE(BIDX, BIDX); //BIDX range from -32768 to 32767
EDMACCRegs->PARAMSET[uiChannel2].LINK_BCNTRLD= CSL_EDMA3_LINKBCNTRLD_MAKE(0xFFFF, 0); //0xFFFF is specified a null link
EDMACCRegs->PARAMSET[uiChannel2].SRC_DST_CIDX= CSL_EDMA3_CIDX_MAKE(0,0);
EDMACCRegs->PARAMSET[uiChannel2].CCNT= 1;
EDMACCRegs->PARAMSET[uiChannel2].A_B_CNT= CSL_EDMA3_CNT_MAKE(BIDX, uiBCNT); //BCNT is between 1 to 65535
EDMACCRegs->PARAMSET[uiChannel2].DST= GLOBAL_ADDR(dstAddress2);
}
EDMACCRegs->PARAMSET[uiChannel].OPT=
CSL_EDMA3_OPT_MAKE(CSL_EDMA3_ITCCH_DIS, //Intermediate transfer completion chaining
CSL_EDMA3_TCCH_DIS, //Transfer complete chaining
CSL_EDMA3_ITCINT_DIS, //Intermediate transfer completion interrupt
CSL_EDMA3_TCINT_EN, //Transfer complete interrupt
uiChannel, //Transfer complete code(TCC): 6-bit code sets the relevant bit in the chaining enable register(CER) for chaining or in the interrupt pending register(IPR) for interrupts.
CSL_EDMA3_TCC_NORMAL, //TCC mode
CSL_EDMA3_FIFOWIDTH_NONE, //FIFO Width
CSL_EDMA3_STATIC_DIS, //keep PARAM updated
CSL_EDMA3_SYNC_A, //AB synchronization
CSL_EDMA3_ADDRMODE_INCR, //Destination address mode //1
CSL_EDMA3_ADDRMODE_INCR); //Source address mode //1
EDMACCRegs->PARAMSET[uiChannel].SRC= GLOBAL_ADDR(srcAddress);
EDMACCRegs->PARAMSET[uiChannel].SRC_DST_BIDX= CSL_EDMA3_BIDX_MAKE(0, 0); //BIDX range from -32768 to 32767
EDMACCRegs->PARAMSET[uiChannel].LINK_BCNTRLD= CSL_EDMA3_LINKBCNTRLD_MAKE(0x4020, 0); //0xFFFF is specified a null link
EDMACCRegs->PARAMSET[uiChannel].SRC_DST_CIDX= CSL_EDMA3_CIDX_MAKE(0,0);
EDMACCRegs->PARAMSET[uiChannel].CCNT= 1;
EDMACCRegs->PARAMSET[uiChannel].A_B_CNT= CSL_EDMA3_CNT_MAKE(ACNTSize, 1);
EDMACCRegs->PARAMSET[uiChannel].DST= GLOBAL_ADDR(dstAddress);
//Manually trigger the EDMA//
(*TPCC_ESR)= 1<<(uiChannelShift);
//wait for completion//
while(0==((*TPCC_IPR)&(1<<(uiChannelShift))));
//clear completion flag//
(*TPCC_ICR)= 1<<(uiChannelShift);
}
}