当下216 2021-06-19 11:41 采纳率: 0%
浏览 8

MB9BF506RCAN通讯发送数据隔一段时间有800ms的间隔无法发送数据

代码部分如下

/*
 *  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的延时,在发送完几帧数据之后

  • 写回答

1条回答 默认 最新

  • 有问必答小助手 2021-06-23 16:27
    关注

    你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答

    本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。

    ​​​​因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。

    评论

报告相同问题?

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题