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.
您好、TI
可以在我们的项目中的 MCU2_0上工作。 有时候有一个问题,我添加了 MCAN_txBufAddReq ()的传输请求,我也获得了 MCAN_getProtocolStatus ()的传输状态,我认为状态表示传输成功,但 CAN 工具和相反 CAN 设备没有收到传输的数据。
从 MCAN_getProtocolStatus()获取的状态是
((mCAN_ERR_code_no_error == protStatus.lastErrCode)||
(MCAN_ERR_CODE_NO_CHANGE = protStatus.lastErrCode)&&
((mcan_ERR_code_no_error == protStatus.dlec)||
(mcan_ERR_code_no_change == protStatus.dlec)&&
(protStatus.busOffStatus == 0u)&&
(0u = protStatus.PXE)
如何调试该问题?
非常感谢!
大家好,帕斯
感谢您的回复! 由于春节假期,很抱歉回复的晚了。
我们使用的 PDK 示例 为 mcan_evm_loopback_app_main_k3.c、并使用定制板。 SDK 版本为 08.02.00.03。
更改了设置、如下所示:
initParams.brsEnable = 0;// 0x1U;
initParams.darEnable = 0;//0x1U;
msgRAMConfigParams.LSS = 0;// APP_MCAN_STD_ID_FILTER_NUM;
*分别将500Kbps 配置为标称位速率和数据位速率*/
bitTimes.nomRatePrescalar = 0xFU;
bitTimes.nomTimeSeg1 = 0x6U;
bitTimes.nomTimeSeg2 = 0x1U;
bitTimes.nomSynchJumpWidth = 0x0U;
bitTimes.dataRatePrescalar = 0x3U;
bitTimes.dataTimeSeg1 = 0x6U;
bitTimes.dataTimeSeg2 = 0x1U;
bitTimes.dataSynchJumpWidth = 0x0U;
删除了以下配置
// stdFiltelem.sfid2 = 0x0U;
// stdFiltelem.sfid1 = 0x4U;
// stdFiltelem.sfec = 0x7U;
// stdFiltelem.SFT = 0x0U;
中断函数如下:
静态空 App_mcanIntr0ISR (uintptr_t arg)
{
AppMcan_Instance * insts =(AppMcan_Instance *) arg;
uint32_t intrStatus;
intrStatus = mcan_getIntrStatus (inst->mcanModAddr);
mcuan_clearIntrStatus (inst->mcanModAddr、intrStatus);
if (((IntrStatus & MCAN_INTR_SRC_TRANS_COMPLETE)||
(IntrStatus 和 MCAN_INTR_SRC_PROTOCOL_ERR_ARB)||
(IntrStatus 和 MCAN_INTR_SRC_BUS_OFF_STATUS)||
(IntrStatus 和 MCAN_INTR_SRC_ERR_PASSIVE)
{
SemaphoreP_post(inst->transferSem );
}
如果(MCAN_IE_RF1NE_MASK ==
(intrStatus 和 MCAN_IE_RF1NE_MASK)
{
SemaphoreP_post(inst->receiverSem);
}
}
大家好, 帕斯
问题不经常发生。和 情况是, 当有连续的帧在传输的 canfd 很容易发生。
您能否在失败前后共享 MCAN 寄存器转储?
此致、
帕尔特
大家好,帕斯
如何转储寄存器?
大家好,帕斯
有更新吗? 有时 TDA4无法接收从其他 CAN 器件传输的数据。如何调试?
您好!
您可以使用 CCS 内存浏览器获取转储。
此致、
帕尔特
大家好, 帕斯
我 捕获了日志、当中断发生时打印了 mcan 寄存器、 日志似乎更多了。 as fllowing
这是正常现象? 为什么有这么多的中断。
[MCU1_0] 12-30 2:26:4.256411 1223.654468 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.MCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.256440 1223.654575 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.256468 1223.654684 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.256496 1223.654796 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.MCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.256524 1223.654902 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.256552 1223.655408 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.MCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.256580 1223.655510 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.256608 1223.655622 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.256637 1223.656422 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.mCAN_PSR=0xd300f MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.256665 1223.656523 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.256693 1223.656631 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.256721 1223.657457 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.MCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.256750 1223.657580 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.256783 1223.657671秒:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.256812 1223.657784 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.mCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.256841 1223.658392 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.MCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.256868 1223.658505 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.256896 1223.658611 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.256932 1223.659399 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.MCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.256960 1223.659508 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.2569881223.659616 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.MCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.257015 1223.660476 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.mCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.257043 1223.662424 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.MCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.257070 1223.662829 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.mCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.257098 1223.662942 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.267187 1223.664752 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.MCAN_PSR=0xd3017 MCAN_ECR=0x0
您好、TI
Fifl 已满且数据丢失后、这是否是丢失 CAN 数据的根本原因?
MCAN_IR = 0x50.MCAN_PSR= 0xd3017 MCAN_ECR= 0x0
MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
大家好,帕斯
我们紧急等待 您的答复。非常感谢。
您好!
看一下寄存器转储、看起来您根本就没有进行传输。 MCAN_PSR 寄存器 MCAN 作为接收器节点运行 Act[4-3]:0x2
您能在您的代码中发送吗? 此外,请采取一个转储的工作案例也和分享。
此致、
帕尔特
大家好, 帕斯
是的,现在问题不是在传输时间,而是在接收。我们目前的问题是,我们不能接收所有的数据,有丢失一个数据帧的可能性。 在寄存器转储、FIFO 已满且数据丢失的情况下、我们应该增加 FIFO 来解决这个问题、对吧?如何提高 FIFO? 只需增大 APP_MCAN_FIFO_0_NUM 的值 &APP_MCAN_FIFO_1_NUM ?
#define APP_MCAN_FIFO_0_START_ADDR (548U)
#define APP_MCAN_FIFO_0_NUM (5U) APP_MCAN_FIFO_1_NUM
#define APP_MCAN_FIFO_1_START_ADDR (748U)
#define (5U)
#define APP_MCAN_RX_BUFF_START_ADDR (948U)
msgRAMConfigParams.rxFIFO0startAddr = APP_MCAN_FIFO_0_START_ADDR;
msgRAMConfigParams.rxFIFO0size = APP_MCAN_FIFO_0_NUM;
msgRAMConfigParams.rxFIFO0waterMark = 3U;
msgRAMConfigParams.rxFIFO0OpMode = 0u;
msgRAMConfigParams.rxFIFO1startAddr = APP_MCAN_FIFO_1_START_ADDR;
msgRAMConfigParams.rxFIFO1size = APP_MCAN_FIFO_1_NUM;
msgRAMConfigParams.rxFIFO1waterMark = 3U;
msgRAMConfigParams.rxFIFO1OpMode = 0u;
msgRAMConfigParams.rxBufStartAddr = APP_MCAN_RX_buff_start_ADDR;
msgRAMConfigParams.rxBufElemSize = MCAN_Elm_size_64BYTES;
msgRAMConfigParams.rxFIFO0ElemSize = MCAN_ELEM_SIZE_64BYTES;
msgRAMConfigParams.rxFIFO1ElemSize = MCAN_Elm_size_64BYTES;
静态空 App_mcanIntr0ISR (uintptr_t arg)
{
AppMcan_Instance * insts =(AppMcan_Instance *) arg;
uint32_t intrStatus;
intrStatus = mcan_getIntrStatus (inst->mcanModAddr);
mcuan_clearIntrStatus (inst->mcanModAddr、intrStatus);
if (((IntrStatus & MCAN_INTR_SRC_TRANS_COMPLETE)||
(IntrStatus 和 MCAN_INTR_SRC_PROTOCOL_ERR_ARB)||
(IntrStatus 和 MCAN_INTR_SRC_BUS_OFF_STATUS)||
(IntrStatus 和 MCAN_INTR_SRC_ERR_PASSIVE)
{
SemaphoreP_post(inst->transferSem );--> >透射完成
}
如果(MCAN_IE_RF1NE_MASK ==
(intrStatus 和 MCAN_IE_RF1NE_MASK)
{
SemaphoreP_post(inst->receiverSem );----------------------------------------------------- >接收数据
}
}
我们的设置代码与参考代码之间的差异
initParams.darEnable = 0;//0x1U;----- >1更改为0
msgRAMConfigParams.LSS = 0;// APP_MCAN_STD_ID_FILTER_NUM;--> >1更改为0
*分别将500Kbps 配置为标称位速率和数据位速率*/ 500K+2M
bitTimes.nomRatePrescalar = 0xFU;
bitTimes.nomTimeSeg1 = 0x6U;
bitTimes.nomTimeSeg2 = 0x1U;
bitTimes.nomSynchJumpWidth = 0x0U;
bitTimes.dataRatePrescalar = 0x3U;
bitTimes.dataTimeSeg1 = 0x6U;
bitTimes.dataTimeSeg2 = 0x1U;
bitTimes.dataSynchJumpWidth = 0x0U;
删除设置
// stdFiltelem.sfid2 = 0x0U;
// stdFiltelem.sfid1 = 0x4U;
// stdFiltelem.sfec = 0x7U;
// stdFiltelem.SFT = 0x0U;
接收功能:
MCAN_getErrCounter (mcanModAddr、&errCounter);
if (/*(0U = errCounter.recErrCnt)&&*/
(0u = errCounter.canErrLogCnt))
{
MCAN_RxFIFOStatus FIFO 状态;
FifoStatus.num =(uint32_t) MCAN_RX_FIFO_NUM_1;
MCAN_getRxFIFOStatus (mcanModAddr、&fifoStatus);
MCAN_readMsgRam (mcanModAddr、
MCAN_MEM_TYPE_FIFO、
FifoStatus.getIdx、
(uint32_t) fifoStatus.num、
&rxMsg);
(void) MCAN_writeRxFIFOAck (mcanModAddr、
(uint32_t) fifoStatus.num、
FIFO 状态.getIdx);
crxparser_recevied(inst->index、rxMsg.id >>18、rxMsg.data、gMcanAppdataSize[rxMsg.dlc]);
}
否则
{
looge ("mcan:接收%d 时出错:rc %d、cel %d!!!\n"、inst->index、errCounter.recErrCnt、errCounter.canErrLogCnt);
}
让我们备份一点。
之前、您发现在尝试传输数据时会出现故障。 这现在起作用了吗?
如果是、您做了哪些更改来使其正常工作?
现在、在接收数据时、故障的频率是多少? 是长时间运行几次、还是每次尝试接收时您都可以看到此问题?
此致、
帕尔特
大家好, 帕斯
让我总结一下我们的问题:
1.在尝试传输数据时失败。
出现问题时我们没有转储寄存器、我们会继续测试、出现故障时转储寄存器
2.在接收数据时发生故障,tda4已经丢失了一个 CAN 数据。
(发生故障时、我们按如下方式转储寄存器。 )APP_MCAN_FIFO_0_NUM 的默认值为5 μ s。
[MCU1_0] 12-30 2:26:4.256868 1223.658505 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.256896 1223.658611 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.256932 1223.659399 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.MCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.256960 1223.659508 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x80.MCAN_PSR=0xd3017 MCAN_ECR=0x0
[MCU1_0] 12-30 2:26:4.2569881223.659616 s:MCAN:APP_mcanIntr0ISR inst->index=0、MCAN_IR =0x50.MCAN_PSR=0xd3017 MCAN_ECR=0x0
从寄存器、接收 FIFO 已满、数据丢失、我认为接收 FIFO 可能会增加到
更大。 我的分析是否正确? 如果需要、如何增加接收 FIFO?
我按如下所示将当前的接收 FIFO 和发送 FIFO 从5修改为8。 这是否正确?(正在测试修改的软件。 我不确定它是否有助于解决问题)
#define APP_MCAN_FIFO_0_START_ADDR (548U)
#define APP_MCAN_FIFO_0_NUM (8U)-->从5更改为8U
#define APP_MCAN_FIFO_1_START_ADDR (748U)
#define APP_MCAN_FIFO_1_NUM (8U)-->从5更 改为8U
#define APP_MCAN_TX_BUFF_SIZE (8U)-->从5更改为8U
#define APP_MCAN_TX_FIFO_SIZE (8U)-->从5 U 更改为8U
问题不是每次测试都发生、但频率约为60%。 如果问题发生、测试将停止。 通常在测试后几分钟或更长时间发生。此问题发生在 OTA 升级测试中、因此 CAN 数据非常大、传输速度非常快。
您好!
问题不是每次测试都发生,但频率约为60%。 如果问题发生、测试将停止。 通常在测试后几分钟或更长时间发生。此问题发生在 OTA 升级测试中、因此 CAN 数据非常大、传输速度非常快。
是的、请尝试增加 FIFO 大小、
我修改了当前接收 FIFO 如下,从5改为8。 这是否正确?(正在测试修改的软件。 我不确定它是否有助于解决问题)
是的、这是增加 FIFO 大小的正确方法、请让我们知道该行为
尝试传输数据时出现故障。
发生问题时我们没有转储寄存器。我们将继续测试、并在发生故障时转储寄存器
请也获取该转储并分享。
此致、
帕尔特
大家好, 帕斯
问题1: 我已 将 FIFO 大小从5增加到15、 接收数据的故障率大大降低。 是否存在此修改的任何其他风险? 该 num 最大值的设置量是多少? 是28吗?
#define APP_MCAN_FIFO_0_START_ADDR (548U)
#define APP_MCAN_FIFO_0_NUM (15U)-->从5更改为8U
#define APP_MCAN_FIFO_1_START_ADDR (748U)
#define APP_MCAN_FIFO_1_NUM (15U)-->从5更 改为8U
问题2:有时 CAN 总线上接收此数据帧的时间可能长于传输成功的日志中所示的时间。详细信息如下。如何分析此类问题?
tda4 CAN 数据传输日志:
接收 id 701和 tarnsfer id 709之间的时间间隔 在1毫秒内
[MCU1_0] 1222.670000 s:===ottedebug=== MCAN:receive in=0,id=701,data=0x10 F9 36 7b!
[MCU1_0] 1222.670316 s:==otadebus=== MCAN:transfer in=0、id=709、data=0x30 0 1 0!
[MCU1_0] 1222.670514 s:==otadebus=== MCAN:传输成功,id=000,DATA=0x709 30 0 1! ACT=0 errPassiv=1 warningStatus=0dlec=0 rbrs=0 rfdf=1 rtdcv=0
CAN 总线数据如下、 id 701到 id 709之间的时间间隔为147ms。
[09:22:22.355] 0x701 10 F9 36 7b
[09:22:22.508] 0x709 30 00 01 00 00 00 00 00
传递函数如下:
int32_t App_mcanImplementation Transfer (candata_t *cd)
{
uint32_t mcanModAddr;
int32_t testStatus = CSL_PASS;
AppMcan_Instance * INSTRUM;
MCAN_ProtocolStatus protStatus;
MCAN_TxBufElement txMsg;
断言(cd);
断言(CD->len<=CANFD_DATA_SIZE);
assert (CD->in<Ary_size (appMcanInsts);
Inst =&appMcanInsts[CD->In];
mcanModAddr = inst->mcanModAddr;
/*初始化要传输的消息*/
txMsg.id =((uint32_t)(CD->id)<< 18u);
txMsg.rtr = 0u;
txMsg.xtd = 0u;
txMsg.esi = 0u;
if (cd->in ==0)
{
txMsg.FDF = 1;
txMsg.brs = 1;// 1u;
}
否则
{
txMsg.FDF = 0;// 1U;
txMsg.brs = 0;// 1u;
}
txMsg.efc = 1u;
txMsg.mm = 0xAAU;
txMsg.dlc = gMcanAppSizeDlc[CD->len];
memcpy (txMsg.data、cd->d、cd->len);
// appLogPrintf ("mcan: transfer in=%d,id=%03x,len=%d!\n",cd->in,cd->id, cd->len);
MutexP_LOCK (inst->transferMutex、MutexP_WAIT_FOREVER);
/*将消息写入 Msg RAM */
MCAN_writeMsgRam (mcanModAddr、
MCAN_MEM_TYPE_BUF、
1u、
txMsg (&T);
/*添加传输请求*/
如果(cd->id=0x709)
appLogPrintf (=========otadebug=== mCAN:transfer in=%d、id=%03x、data=0x%x %x %x %x!\n"、CD->IN、CD->id、CD->d[0]、CD->d[1]、 CD->d[2]、CD->d[3]);
testStatus = MCAN_txBufAddReq (mcanModAddr、1U);
如果(CSL_PASS == testStatus)
{
// appLogPrintf ("Successful MCAN_txBufAddReq、PEND TX SAM now ...\n");
if (SemaphoreP_pend (inst->transferSem、1000)== SemaphoreP_OK)
{
MCAN_getProtocolStatus (mcanModAddr、&protStatus);
/*检查错误*/
if ((((mcan_ERR_code_no_error == protStatus.lastErrCode)||
(MCAN_ERR_CODE_NO_CHANGE = protStatus.lastErrCode)&&
((mcan_ERR_code_no_error == protStatus.dlec)||
(mcan_ERR_code_no_change == protStatus.dlec)&&
(protStatus.busOffStatus == 0u)&&
(0u = protStatus.PXE)
{
// appLogPrintf ("MCAN:%d 成功传输%x",CD->IN,CD->id);
如果(cd->id=0x709)
appLogPrintf ("===otadebug=== MCAN:传输成功,id=%03x,DATA=0x%x %x %x %x %x! Act=%d errPassive=%d warningStatus=%d"
"dlec=%d resis=%d rbrs=%d rfdf=%d PXE=%d tdcv=%d\n"、
cd->in、cd->id、cd->d[0]、cd->d[1]、cd->d[2]、 cd->d[3]、protStatus.act、protStatus.errPassive、protStatus.warningStatus、protStatus.dlec、
protStatus.resi、protStatus.rbrs、protStatus.rfdf、protStatus.PXE、protStatus.tdcv);
}
中断功能:
静态空 App_mcanIntr0ISR (uintptr_t arg)
{
AppMcan_Instance * insts =(AppMcan_Instance *) arg;
uint32_t intrStatus;
intrStatus = mcan_getIntrStatus (inst->mcanModAddr);
mcuan_clearIntrStatus (inst->mcanModAddr、intrStatus);
if (((IntrStatus & MCAN_INTR_SRC_TRANS_COMPLETE)||
(IntrStatus 和 MCAN_INTR_SRC_PROTOCOL_ERR_ARB)||
(IntrStatus 和 MCAN_INTR_SRC_BUS_OFF_STATUS)||
(IntrStatus 和 MCAN_INTR_SRC_ERR_PASSIVE)
{
SemaphoreP_post(inst->transferSem );
}
// IF (MCAN_INTR_SRC_DISCONTED_RX_buff_MSG =
//(IntrStatus 和 MCAN_INTR_SRC_DITGED_RX_buff_MSG)
//{
// gMcanIsrIntr1Flag = 0u;
//}
如果(MCAN_IE_RF1NE_MASK ==
(intrStatus 和 MCAN_IE_RF1NE_MASK)
{
SemaphoreP_post(inst->receiverSem);
}
}
大家好, 帕斯
问题: 我 将 FIFO 大小从5增加到了15, 接收数据的故障率大大降低。 是否存在此修改的任何其他风险? 该 num 最大值的设置量是多少? 是28吗?
#define APP_MCAN_FIFO_0_START_ADDR (548U)
#define APP_MCAN_FIFO_0_NUM (15U)-->从5更改为15U
#define APP_MCAN_FIFO_1_START_ADDR (748U)
#define APP_MCAN_FIFO_1_NUM (15U)-->从5更 改为15U
您好!
因此增加 FIFO 大小没有风险。 但这不是问题的永久解决办法。 增大 FIFO 大小可以降低溢出的风险、但这表明从 FIFO 读取的速率<写入 FIFO 的速率、需要加以解决、否则、在较长时间的运行中、您仍然可能会遇到该问题。
您能分享如何从 FIFO 读取数据吗? 此外、最终能否进行分析并确保在读取 FIFO 时没有额外的延迟?
此致、
帕尔特
大家好, 帕斯
感谢您的回复!
是的、我也怀疑从 FIFO 读取数据的速率<写入 FIFO 的速率是根本原因。
但 FIFO 的最大值是多少?
我已经添加了读取 FIFO 的时间成本记录、用于检查读取 FIFO 的时间是否过长。
如下读取 FIFO 代码:请帮助检查读取 FIFO 的方法是否存在问题、非常感谢。
接收中断发生时、将发布 SemaphoreP_POST (inst->seeiverSem)
if (SemaphoreP_pend (inst->receiverSem、SemaphoreP_WAIT_FOREVER)== SemaphoreP_OK)
{
/*检查错误*/
MCAN_getErrCounter (mcanModAddr、&errCounter);
if (/*(0U = errCounter.recErrCnt)&&*/
(0u = errCounter.canErrLogCnt))
{
MCAN_RxFIFOStatus FIFO 状态;
FifoStatus.num =(uint32_t) MCAN_RX_FIFO_NUM_1;
MCAN_getRxFIFOStatus (mcanModAddr、&fifoStatus);
MCAN_readMsgRam (mcanModAddr、
MCAN_MEM_TYPE_FIFO、
FifoStatus.getIdx、
(uint32_t) fifoStatus.num、
&rxMsg);
(void) MCAN_writeRxFIFOAck (mcanModAddr、
(uint32_t) fifoStatus.num、
FIFO 状态.getIdx);
crxparser_recevied(inst->index、rxMsg.id >>18、rxMsg.data、gMcanAppdataSize[rxMsg.dlc]);
//将 CAN 数据发送到其它功能,如下所示
}
否则
{
looge ("mcan:接收%d 时出错:rc %d、cel %d!!!\n"、inst->index、errCounter.recErrCnt、errCounter.canErrLogCnt);
}
}
void crxparser_reevied (uint8_t cin、uint16_t cid、uint8_t *、uint8_t len)
{
candat_t cd;
cd.in = cin;
cd.id = CID;
cd.len = min (len、sizeof (cd.d));
memcpy (cd.d、dt、cd.len);
如果(cd.id=0x701)
appLogPrintf ("=OTA= MCAN:receive id=%03x、0x%x %x %x!\n"、cd.id、cd.d[0]、cd.d[1]、cd.d[2]、 cd.d[3]);
(void) MailboxP_POST (mailboxHandle、&CD、0);
}
大家好, 帕斯
问题:1. 关于 RX FIFO, 该 num 最大可设置的 RX FIFO 容量是多少?
#define APP_MCAN_FIFO_0_START_ADDR (548U)
#define APP_MCAN_FIFO_0_NUM (18U)-->从5更改为18U
#define APP_MCAN_FIFO_1_START_ADDR (748U)
#define APP_MCAN_FIFO_1_NUM (18U)-->从5更 改为18U
从 FIFO 中读取数据时有什么问题吗?
您好!
很抱歉给您带来不便,是否仍支持此主题?
此致
M·塔伦