代码部分如下
/*
* can_DataTx (Internal Function)
*/
static int32_t can_DataTx(Can_INFO *pInfo, CanDev_PDU *pPdu)
{
int32_t ret;
uint32_t target_bit;
uint32_t reg_treqr;
uint32_t reg_arb;
target_bit = 1U << (pPdu->ObjId - 1);
reg_treqr = pInfo->pReg->TREQR;
/* check busy */
if ((reg_treqr & target_bit) == 0) {
/* write IF1ARB */
reg_arb = (ARB_MSGVAL | ARB_DIR);
if (pPdu->Id >0x000007FF) { /* extended Id */
/* ID28-0 */
reg_arb |= (ARB_XTD | (pPdu->Id & 0x1FFFFFFF));
} else { /* standard Id */
/* ID28-18 */
reg_arb |= ((pPdu->Id & 0x000007FF) << 18);
}
pInfo->pReg->IF1ARB = reg_arb;
/* write IF1MCTR */
if (pPdu->Dlc > 8) {
pPdu->Dlc = 8;
}
pInfo->pReg->IF1MCTR = (MCTR_TXIE | MCTR_TXREQ | MCTR_EOB | (uint16_t)pPdu->Dlc);
/* write IF1DTA_L */
if (pPdu->Dlc > 0) {
pInfo->pReg->IF1DTA_L = (((uint32_t)pPdu->Sdu[0]) & 0x000000FFU) |
(((uint32_t)pPdu->Sdu[1] << 8) & 0x0000FF00U) |
(((uint32_t)pPdu->Sdu[2] << 16) & 0x00FF0000U) |
(((uint32_t)pPdu->Sdu[3] << 24) & 0xFF000000U);
}
/* write IF1DTB_L */
if (pPdu->Dlc > 4) {
pInfo->pReg->IF1DTB_L = (((uint32_t)pPdu->Sdu[4]) & 0x000000FFU) |
(((uint32_t)pPdu->Sdu[5] << 8) & 0x0000FF00U) |
(((uint32_t)pPdu->Sdu[6] << 16) & 0x00FF0000U) |
(((uint32_t)pPdu->Sdu[7] << 24) & 0xFF000000U);
}
/* write IF1CMSK (Direction = Write) */
pInfo->pReg->IF1CMSK = (CMSK_W | CMSK_ARB | CMSK_CTR | CMSK_TXREQ | CMSK_DATA);
/* write IF1CREQ */
pInfo->pReg->IF1CREQ = (uint16_t)pPdu->ObjId & 0x00FF;
ret = CanDev_NOERROR;
} else { /* busy */
ret = CanDev_ERROR_BUSY;
}
return ret;
}
reg_treqr & target_bit会一直无效,导致一直卡在busy里面,数据无法发送,写程序计数,发现卡在busy状态就大概为800ms,请问该芯片是有这个问题还是怎样?这是他的芯片例程,我用1ms调用一次该中断,或100ms,80ms都试过,他就是一直会有个800ms的延时,在发送完几帧数据之后