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)
如何调试该问题?
非常感谢!
我们 使用了 TJA1043、我使用逻辑分析仪捕获 TXD 引脚的信号波形、逻辑分析仪还 丢失了 CAN 工具未收到的数据波。 虽然从软件的角度来看,我添加请求传输成功,并获得保证传输状态。
您好!
您是否使用了 PDK 中的任何示例? 如果需要、您能指出这个例子并在上面分享您所做的更改吗? 此外、您使用的是 TI-EVM 上的定制电路板还是定制电路板。 请同时说明您正在使用的 SDK 版本。
此致、
帕尔特
大家好,帕斯
感谢您的回复! 由于春节假期,很抱歉回复的晚了。
我们使用的 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);
}
}
大家好, 帕斯
我很 期待您的回复! 有新的问题,有时从其他 CAN 设备传输的数据不能通过 TDA4接收.
CAN 总线是 canfd 和500k+2M。
您好!
您多久看到一次此问题? 是否有任何一致的模式可使这种情况发生?
此致、
帕尔特
大家好, 帕斯
问题不经常发生。和 情况是, 当有连续的帧在传输的 canfd 很容易发生。
您能否在失败前后共享 MCAN 寄存器转储?
此致、
帕尔特
大家好,帕斯
如何转储寄存器?
大家好,帕斯
有更新吗? 有时 TDA4无法接收从其他 CAN 器件传输的数据。如何调试?
您好!
您可以使用 CCS 内存浏览器获取转储。
此致、
帕尔特
大家好,帕斯
您可以使用 CCS 内存浏览器获取转储。
---------------- >由于我们的定制板没有布局 JTAG 接口,有没有 其他方法来调试问题?
大家好,帕斯
期待您的回复。 谢谢。我们的硬件 设计图。您有任何建议?
大家好,帕斯
我们发现、 在同样的数据传输场景中、当数据以极高的速度传输到 TDA4时、 TDA4更有可能无法接收特定的数据。这些信息是否有助于解决该问题?
大家好,帕斯
项目即将进入量产阶段。 这一问题已经困扰了我们很长一段时间,而且非常紧迫。 请提供帮助、非常感谢。
您好!
对于故障情况、我们将需要寄存器转储。 如果 JTAG 不可用、您能否打印寄存器并共享转储。
如果我们能得到完整的寄存器转储是最好的,但如果不可能,我们至少需要:MCAN_PSR (对于协议错误)、MCAN_IR (对于此事件引起中断)、MCAN_IE (对于此中断事件已启用)、MCAN_ECR (对于错误计数器)
此致、
帕尔特
大家好,帕斯
非常感谢! 我将尽快重现问题并在出现问题时转储寄存器。
大家好, 帕斯
我 捕获了日志、当中断发生时打印了 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·塔伦