This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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

Part Number: AWR1642BOOST
Other Parts Discussed in Thread: AWR1642

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!