您好、TI!
我试图使用 BCDMA 向 SPI 发送单字节数据,但收到传输失败错误。 创建了指向 MCSPI1_CH0_TX 的 TR 15描述符作为 TRD 的目标地址。
ptr->daddr = 0x20110138U;
我尝试的序列如下所示:
1) TR 初始化:
静态 void App_udmaTrpdInit (UDMA_ChHandle chHandle、
uint32_t chIdx、
uint8_t * trpdMem、
const void *destBuf、
const void * srcBuf、
uint32_t 长度)
{
CSL_UdmapTR15 *ptr;
uint32_t cqRingNum = uDMA_chGetCqRingNum (chHandle);
/*使 TRPD 具有 TR15 TR 类型*/
UdmaUtils_makeTrpdTr15 (trpdMem、1U、cqRingNum);
/*设置 TR */
PTR = UdmaUtils_getTrpdTr15Pointer (trpdMem、0U);
ptr->flags = CSL_FMK (UDMAP_TR_FLAGS_TYPE、CSL_UDMAP_TR_FLAGS_TYPE_4D_BLOCK_MOVE_repacking_INDIRECTION);
ptr->flags |= CSL_FMK (uDMAP_TR_FLAGS_STATIC、0U);
ptr->flags |= CSL_FMK (uDMAP_TR_FLAGS_EOL、CSL_UDMAP_TR_FLAGS_EOL_MATCH_SOL_EOL);
ptr->flags |= CSL_FMK (uDMAP_TR_FLAGS_EVENT_SIZE、CSL_UDMAP_TR_FLAGS_EVENT_SIZE);
if (0u == chIdx)
{
ptr->flags |= CSL_FMK (UDMAP_TR_FLAGS_TRIGGER0、CSL_UDMAP_TR_FLAGS_TRIGGERONE);
}
否则
{
/*为通道1设置全局触发*/
ptr->flags |= CSL_FMK (UDMAP_TR_FLAGS_TRIGGER0、CSL_UDMAP_TR_FLAGS_TRIGGER0);
}
ptr->flags |= CSL_FMK (UDMAP_TR_FLAGS_TRIGGER0_TYPE、CSL_UDMAP_TR_FLAGS_TRIGGER_TYPE_ALL);
ptr->flags |= CSL_FMK (uDMAP_TR_FLAGS_trigger1、CSL_UDMAP_TR_FLAGS_TRIGGER_NONE);
ptr->flags |= CSL_FMK (uDMAP_TR_FLAGS_trigger1_TYPE、CSL_UDMAP_TR_FLAGS_TRIGGER_TYPE_ALL);
ptr->flags |= CSL_FMK (uDMAP_TR_FLAGS_CMD_ID、0x25U);/*这将在 TR 响应中返回*/
ptr->flags |= CSL_FMK (UDMAP_TR_FLAGS_SA_INDIRECT、0U);
ptr->flags |= CSL_FMK (uDMAP_TR_FLAGS_DA_INDIRECT、0U);
ptr->flags |= CSL_FMK (uDMAP_TR_FLAGS_EOP、1U);
ptr->icnt0 = 1U;//acNT
ptr->icnt1 = 1U;// BCNT
ptr->icnt2 = 1U;// CCNT
// ptr->icnt3 = 1U;
ptr->DIM1=1U;//SBIDX 应为4
// ptr->dim2 =(ptr->icnt0 * ptr->icnt1);//SCINDX
// ptr->dim3 =(ptr->icnt0 * ptr->icnt1 * ptr->icnt2);
ptr->addr =(uint64_t) udma_defaultVirtToPhyFxn (srcBuf、0U、NULL);//源地址
ptr->fmtflags = 0x00000000U;/*线性寻址,每个字节*/
ptr->dicnt0 = 1U;// ACNT
ptr->dicnt1 = 1U;// BCNT
ptr->dicnt2 = 1U;// CCNT
// ptr->dicnt3 = 1U;
ptr->dim1 = 0u;//DBINDX 应为1
// ptr->ddim2 =(ptr->dicnt0 * ptr->dicnt1);//DCINDX
// ptr->ddim3 =(ptr->dicnt0 * ptr->dicnt1 * ptr->dicnt2);
ptr->daddr = 0x20110138U; //目标地址
/*执行高速缓存写回*/
CacheP_WB (trpdMem、udma_test_TRPD_size、CacheP_TYPE_ALLD);
返回;
}
2) 排队和取消排队:
trpdMem =&gUdmaTestTrpdMem[0U];
trpdMemPhy =(uint64_t) udma_defaultVirtToPhyFxn (trpdMem、0U、NULL);
RetVal = udma_ringQueueRaw (udma_chGetFqRingHandle (chHandle0)、trpdMemPhy);
DebugP_ASSERT (uDMA_SOK == RetVal);
while (1)
{
SPI0_CHCONFG = 0X281523E1;
SPI0_CHCNTRL = 0x00000101; // SPI1_CH0通道启用
ClockP_usleep (100);
RetVal = udma_ringDueRaw (udma_chGetCqRingHandle (chHandle0)、&pDesc);
if (udma_sok == RetVal)
{
/*检查 TR 响应状态*/
CacheP_inv (trpdMem、udma_test_trpd_size、CacheP_TYPE_ALLD);
trRespStatus = UdmaUtils_getTrpdTr15Response (trpdMem、1U、0U);
DebugP_ASSERT (CSL_UDMAP_TR_RESPONSE _STATUS_COMPLETE = trRespStatus);
中断;
}
}
谢谢、此致
Anjan.