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!