Quantcast
Viewing all articles
Browse latest Browse all 262198

CCS/AWR1642BOOST: Is there an demo on AWR164 to send and recieve classic can frame?

Part Number:AWR1642BOOST

Tool/software: Code Composer Studio

I tried to use Can-fd to send classic can frame, my configure is as below:

    /***设置CAN驱动参数,初始化mcanCfgParams***/
    memset (CanCfgParams, sizeof (CANFD_MCANInitParams), 0);
    CanCfgParams->fdMode          = 0x1U;  /***打开CANFD操作***/
    CanCfgParams->brsEnable       = 0x1U;  /***允许设置比特率***/
    CanCfgParams->txpEnable       = 0x0U;  /***关闭传输暂停***/
    CanCfgParams->efbi            = 0x0U;  /***FEdge滤波关闭***/
    CanCfgParams->pxhddisable     = 0x0U;  /***协议异常处理开启***/
    CanCfgParams->darEnable       = 0x0U;  /***启用自动重传***/
    CanCfgParams->wkupReqEnable   = 0x1U;  /***唤醒请求开启***/
    CanCfgParams->autoWkupEnable  = 0x1U;  /***自动唤醒开启***/
    CanCfgParams->emulationEnable = 0x0U;  /***仿真/调试 挂起关闭***/
    CanCfgParams->emulationFAck   = 0x0U;  /***仿真/调试 挂起不等待   idle/immediate影响***/
    CanCfgParams->clkStopFAck     = 0x0U;  /***时钟停止不等待idle/immediate影响***/
    CanCfgParams->wdcPreload      = 0x0U;  /***Message RAM看门狗启动值***/
    CanCfgParams->tdcEnable       = 0x1U;  /***发送延迟补偿开启***/
    CanCfgParams->tdcConfig.tdcf  = 0U;    /***发送延迟补偿窗口长度***/
    CanCfgParams->tdcConfig.tdco  = 8U;    /***发射机时延补偿抵消***/
    CanCfgParams->monEnable       = 0x0U;  /***关闭总线监视模式***/
    CanCfgParams->asmEnable       = 0x0U;  /***正常CAN操作***/
    CanCfgParams->tsPrescalar     = 0x0U;  /***时间戳计数器预定标器***/
    CanCfgParams->tsSelect        = 0x0U;  /***超时源选择***/
    CanCfgParams->timeoutSelect   = CANFD_MCANTimeOutSelect_CONT; /***超时源选择为连续操作模式***/
    CanCfgParams->timeoutPreload  = 0x0U;  /***超时计数器的启动值***/
    CanCfgParams->timeoutCntEnable= 0x0U;  /***禁用超时计数器***/
    CanCfgParams->filterConfig.rrfe        = 0x1U; /***拒绝所有带有29位扩展ID的远程帧***/
    CanCfgParams->filterConfig.rrfs        = 0x1U; /***拒绝所有带有11位标准ID的远程帧***/
    CanCfgParams->filterConfig.anfe        = 0x1U; /***接受不匹配的扩展帧到RX FIFO1中***/
    CanCfgParams->filterConfig.anfs        = 0x1U; /***接受不匹配的标准帧到RX FIFO1中***/
    CanCfgParams->msgRAMConfig.lss         = 127U; /***标准消息ID筛选元素的数量***/
    CanCfgParams->msgRAMConfig.lse         = 64U;  /***标准扩展ID筛选元素的数量***/
    CanCfgParams->msgRAMConfig.txBufNum    = 32U;  /***专用TX Buffer数目***/
    CanCfgParams->msgRAMConfig.txFIFOSize  = 0U;   /***传输TX FIFO大小***/
    CanCfgParams->msgRAMConfig.txBufMode   = 0U;   /***TX Buffer操作类型设置为FIFO***/
    CanCfgParams->msgRAMConfig.txEventFIFOSize         = 32U;  /***事件FIFO大小:32个TX EVENT FIFO元素***/
    CanCfgParams->msgRAMConfig.txEventFIFOWaterMark    = 0U;   /***避免一个TX EVENT FIFO溢出***/
    CanCfgParams->msgRAMConfig.rxFIFO0size             = 32U;   /***接收RX FIFO0大小***/
    CanCfgParams->msgRAMConfig.rxFIFO0OpMode           = 0U;   /***接收RX FIFO0操作模式:阻塞模式***/
    CanCfgParams->msgRAMConfig.rxFIFO0waterMark        = 0U;   /***避免一个RX FIFO溢出***/
    CanCfgParams->msgRAMConfig.rxFIFO1size             = 20U;  /***接受RX FIFO1大小***/
    CanCfgParams->msgRAMConfig.rxFIFO1waterMark        = 1U;  /*避免RX FIFO溢出*/
    CanCfgParams->msgRAMConfig.rxFIFO1OpMode           = 0U;   /***RX FIFO1操作模式:阻塞模式***/
    CanCfgParams->eccConfig.enable         = 1;    /***开启ECC***/
    CanCfgParams->eccConfig.enableChk      = 1;    /***开启ECC检查***/
    CanCfgParams->eccConfig.enableRdModWr  = 1;    /***开启读写改操作***/
    CanCfgParams->errInterruptEnable   = 1U;   /***启用错误中断***/
    CanCfgParams->dataInterruptEnable  = 1U;   /***启用数据中断***/
    CanCfgParams->appDataCallBack      = mcal_CanCallback;  /***启用回调函数***/
    CANFD_init(&CanCfgParams, &sErrCode);

but with this config, I can only recieve standard frame with ID = 1, other standard frame can't trigger rx interrupt. I want to recieve serveral particular ID, how can I confige the CanFD?

2. in canCallback(mcal_CanCallback as shown up), I have some reieve code:

code1:
         if(0 == CANFD_getData(
                        sRxMsgObjHandle,
                        &uReciveMsgId,
                        &sRxFrameType,
                        &sRxIdType,
                        &RxDataLength,
                        &RxData[0],
                        &sErrCode)){
                ...
        }

&
code2:

          if(0 == CANFD_getData(
                        sRxMsgObjHandle,
                        &uReciveMsgId,
                        0
                        0,
                        &RxDataLength,
                        &RxData[0],
                        &sErrCode)){
                ...
        }

with code 1: I send standard frame with ID = 1 from PC, uReciveMsgId = 0 (NOT MATCH THE ID I SEND!);

with code 2: I send standard frame with ID = 1 from PC, uReciveMsgId = 1 (MATCH THE ID I SEND!);

I went into CANFD_getData() function in canfd.c, and found:

            /* Get the message Identifier */
            if(rxBuffElem.xtd == 1U)
            {
                /* Received frame with Extended ID */
                *id = (uint32_t)(rxBuffElem.id);
                *idType = CANFD_MCANXidType_29_BIT;
            }
            else
            {
                /* Received frame with Standard ID */
                *id = (uint32_t)((rxBuffElem.id >> 18U) & 0x7FFU);
                *idType = CANFD_MCANXidType_11_BIT;
            }

in both code 1 and code 2, rxBuffElem.id = 0x40004, xBuffElem.xtd == 0, but have gone through the code above, *id in code 1 is 0, and *id in code 2 is 1!!!! which makes the wrong result.

Is there an bug in canfd.c?? 3Q!

3. Is there an demo on AWR1642 to send and recieve standard classic can frame with filter? 3Q!


Viewing all articles
Browse latest Browse all 262198

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>