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.

[参考译文] AM2634:CAN Rx 中断作为消息存储到专用 Rx 缓冲器、但 NDAT1和 NDAT2寄存器中对应于缓冲器的位未设置

Guru**** 2460380 points
Other Parts Discussed in Thread: AM2634, ISO1042-Q1

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1482056/am2634-can-rx-interrupt-is-as-message-stored-to-dedicated-rx-buffer-but-the-bit-corresponding-to-buffer-is-not-being-set-in-ndat1-and-ndat2-registers

器件型号:AM2634
主题中讨论的其他器件: ISO1042-Q1

工具与软件:

您好!

我们将 AM2634与定制设计的硬件配合使用、其中包含 CAN 收发器"ISO1042-Q1 "以及 CCS 版本 12.7.0.00007和 XDS110调试器。

 使用 CAN FD 模式与四个节点通信时、我们面临 CAN 问题、其中3个节点以不同的时间间隔发送数据、一个节点始终接收数据。 一段时间后 、我们将接收中断作为消息存储到专用 Rx 缓冲区中、但在 NDAT1和 NDAT2寄存器中不设置任何位。 我们仅在配置了4个节点(其中3个节点以不同的时间间隔发送、而一个节点仅接受接收)时才会面临此问题。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我有几个问题要从这里开始解答。

    1) 1)使用的是哪个版本的 AM263x MCU+SDK?

    2) 2)您可以下载并使用 CCS 12.8.1吗(12.7.1版上的各种错误修复)

    3)我假设只有接收节点预期会发生此错误?

    4)是否可以提供故障节点 CAN 配置的代码片段?

    5) 5)您能否提供出现故障时 CAN_H/CAN_L 和 CANTX/CANRX 信号的屏幕截图?

    6) 6)平均失效时间是多少?

    7) 7)传输节点数量是否对 TTF 或故障本身有任何影响?

    8) 8)是否可以使用 AM263xLaunchPad 器件替换当前接收器节点并查看错误是否继续发生?

    此致、

    Zackary Fleenor

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    1) 10.00.35

    2)我们尝试了  CCS 12.8.1 、但发现了同样的问题

    3)没有所有节点都收到此错误

    6)每5s 一次

    7)是的、当连接2个以上的节点时、我们会面临问题

    8)不是、这是定制硬件、因此无法连接 launchpad、因为当我们连接 launchpad 时、端接电阻会发生变化

    我现在无法回答其他问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您提供这些信息。

    首先、我建议将更新到 AM263x v10.01.00.31的最新 MCU+SDK -(https://dr-download.ti.com/software-development/software-development-kit-sdk/MD-r5FY9rRaGv/10.01.00.31/mcu_plus_sdk_am263x_10_01_00_31-windows-x64-installer.exe)。

    发送节点是否应该在 RX 缓冲区中接收任何消息?

    CAN_H/CAN_L 和 CANTX/CANRX 的示波器屏幕截图将有助于验证总线上发送的实际数据。

    您能否检查 RX 缓冲区本身的内容、并查看中断时是否存在新数据、即使未设置 NDATx 标志也是如此?

    是否可以共享 CAN 配置的片段?

    为了确认我的理解、当设置仅适用于2个节点时、是单个接收器节点和单个发送器节点。 一旦将第3个发送器节点添加到总线中、每5秒钟、总线上的所有节点都将经历相同的 RX 缓冲区数据接收中断(同时?) 但 NDATx 标志不能反映这一点?

    这是一种有趣的行为、不幸的是、我无法在本地重现此问题。

    此致、

    Zackary Fleenor

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    很抱歉延迟了响应

    1) 1)我们将尝试使用新的 MCU + SDK 版本

    2) 2)发送节点是否应该在 RX 缓冲区中接收任何消息? 有

    3)

    我们在 TRM 中读到,这可能发生在一个错误的情况下,所以为了找到 错误,我们还显示协议状态寄存器,其中包含错误的详细信息,我们发现错误为01 ,通过检查 TRM 我们发现这个错误是由位填充造成的。

    4)仅为了确认我的理解、当设置仅使用2个节点时、这是单个接收器节点和单个发送器节点? 一旦将第3个发送器节点添加到总线中、每5秒钟、总线上的所有节点都将经历相同的 RX 缓冲区数据接收中断(同时?) 但 NDATx 标志不能反映这一点?

    答:在我们的设置中、有4个节点:3个 CAN 节点正在发送和接收数据、1个节点仅接收数据

    节点1正在发送消息 ID 1并接收消息 ID 4和7。

    节点2正在发送消息 ID 4并接收消息 ID 1和7。

    节点3仅发送消息 ID 7。

    节点4正在接收消息 ID 为1、4和7的消息。

    每个节点都出现了一些数据丢失、但每个节点上的数据在特定时间都不相同、即如果节点1上丢失了消息 ID 4、则节点2上此时会正确接收到消息 ID 4。

    对于两个节点(每个节点同时发送和接收)、未发现此问题(即使发生此问题、也很少见)

    5)下面提供了 CAN 配置片段

    --------------------------------------------------------

    void MCAN_SetConfig (bool enableInternalLpbk)

    MCAN_StdMsgIDFilterElement stdFiltElem[APP_MCAN_STD_ID_FILTER_CNT]={0U};
    MCAN_InitParams initParams ={0U};
    MCAN_ConfigParams configParams ={0U};
    MCAN_MsgRAMConfigParams msgRAMConfigParams ={0U};
    MCAN_BitTimingParams bitTimes ={0U};
    uint32_t i;

    gMcanBaseAddr =(uint32_t) AddrTranslateP_getLocalAddr (APP_MCAN_BASE_ADDR);

    /*初始化 MCAN 模块 initParams */
    MCAN_initOperModeParams (&initParams);// brs??
    /* CAN FD 模式和比特率开关已启用*/
    #ifdef FD_mode
    initParams.fdMode = true;
    initParams.brsEnable = true;
    #else
    initParams.fdMode = false;
    initParams.brsEnable = false;
    #endif

    /*初始化 MCAN 模块全局过滤器参数*/
    MCAN_initGlobalFilterConfigParams (&configParams);

    /*初始化 MCAN 模块位时间参数*/
    /*将默认的1Mbps 和5Mbps 配置为标称和数据比特率 RESP */
    MCAN_initSetBitTimeParams (&bitTimes);

    /*初始化 MCAN 模块消息 RAM 参数*/
    mcan_InitMsgRamConfigParams (&msgRAMConfigParams);

    /*初始化要接收 msg 的过滤器元素、应与 tx msg id 相同*/
    // abh:为超过1个 msg ID 生成一个接收 msg ID 的全局数组
    对于(I = 0U;I < APP_MCAN_STD_ID_FILTER_CNT;I++)

    mcan_InitStdFilterElemParams (&stdFiltElm[i]、i);
    }
    /*等待内存初始化发生*/
    while (false == MCAN_isMemInitDone (gMcanBaseAddr))
    {}

    /*将 MCAN 置于软件初始化模式*/
    MCAN_setOpMode (gMcanBaseAddr、MCAN_OPERATION_MODE_SW_init);
    while (MCAN_OPERATION_MODE_SW_init!= MCAN_getOpMode (gMcanBaseAddr))
    {}

    /*初始化 MCAN 模块*/
    MCAN_init (gMcanBaseAddr、&initParams);
    /*配置 MCAN 模块 Globabal Filter */
    MCAN_CONFIG (gMcanBaseAddr、&configParams);
    /*配置位时序*/
    MCAN_setBitTime (gMcanBaseAddr、&bitTimes);
    /*配置消息 RAM 段*/
    MCAN_msgRAMConfig (gMcanBaseAddr、&msgRAMConfigParams);
    /*设置扩展 ID 掩码*/
    MCAN_setExtIDAndMask (gMcanBaseAddr、APP_MCAN_EXT_ID_MASK);

    /*配置标准 ID 过滤器元素*/
    对于(I = 0U;I < APP_MCAN_STD_ID_FILTER_CNT;I++)

    MCAN_addStdMsgIDFilter (gMcanBaseAddr、i、&stdFiltElem[i]);
    }
    if (TRUE =enableInternalLpbk)

    MCAN_lpbkModeEnable (gMcanBaseAddr、MCAN_LPBK_MODE_INTERNAL、TRUE);
    }

    /*将 MCAN 退出软件初始化模式*/
    MCAN_setOpMode (gMcanBaseAddr、MCAN_OPERATION_MODE_NORMAL);
    while (MCAN_operation_mode_normal!= MCAN_getOpMode (gMcanBaseAddr));

    返回;
    }

    --------------------------------------------------------

    void mcan_InitMsgRamConfigParams (MCAN_MsgRAMConfigParams.
    *msgRAMConfigParams)

    int32_t status;

    MCAN_initMsgRamConfigParams (msgRAMConfigParams);

    /*配置用户所需的 msg ram 参数*/
    /* msgRAMConfigParams->LSS = APP_MCAN_STD_ID_FILTER_CNT;
    msgRAMConfigParams->LSE = APP_MCAN_EXT_ID_FILTER_CNT;
    msgRAMConfigParams->txBufCnt = APP_MCAN_TX_BUFF_CNT;
    msgRAMConfigParams->txFIFOCnt = APP_MCAN_TX_FIFO_CNT;
    //选择缓冲区/FIFO 模式
    msgRAMConfigParams->txBufMode = MCAN_TX_MEM_TYPE_BUF;
    msgRAMConfigParams->txEventFIFOCnt = APP_MCAN_TX_EVENT_FIFO_CNT;
    msgRAMConfigParams->rxFIFO0Cnt = APP_MCAN_FIFO_0_CNT;
    msgRAMConfigParams->rxFIFO1Cnt = APP_MCAN_FIFO_1_CNT;
    //选择 FIFO 阻塞模式
    msgRAMConfigParams->rxFIFO0OpMode = MCAN_RX_FIFO_OPERATION_MODE_BLOCKING;
    msgRAMConfigParams->rxFIFO1OpMode = MCAN_RX_FIFO_OPERATION_MODE_BLOCKING;
    */
    ////// 照原样更改 mcan 配置////////////////////////////////////////////

    msgRAMConfigParams->flssa =(uint32_t) 0u;
    msgRAMConfigParams->LSS = APP_MCAN_STD_ID_FILTER_CNT;
    msgRAMConfigParams->flesa =(uint32_t) 0u;
    msgRAMConfigParams->LSE =(uint32_t) 0U;//APP_MCAN_STD_ID_FILTER_CNT;


    msgRAMConfigParams->txStartAddr =(uint32_t) 0u;
    msgRAMConfigParams->txBufCnt =(uint32_t) 32u;
    msgRAMConfigParams->txFIFOCnt =(uint32_t) 0u;
    msgRAMConfigParams->txBufMode =(uint32_t) 0u;

    ///基于互联网的活动 FIFO 可选字段
    msgRAMConfigParams->txEventFIFOStartAddr =(uint32_t) 0u;
    msgRAMConfigParams->txEventFIFOCnt =(uint32_t) 0u;
    msgRAMConfigParams->txEventFIFOWaterMark =(uint32_t) 0u;

    //fifo 0和1 //起始地址应指定
    msgRAMConfigParams->rxFIFO0StartAddr =(uint32_t) 0u;
    msgRAMConfigParams->rxFIFO0Cnt =(uint32_t) 0u;
    msgRAMConfigParams->rxFIFO0WaterMark =(uint32_t) 0u;
    msgRAMConfigParams->rxFIFO0OpMode =(uint32_t) 0u;
    msgRAMConfigParams->rxFIFO1StartAddr =(uint32_t) 0u;
    msgRAMConfigParams->rxFIFO1Cnt =(uint32_t) 0u;
    msgRAMConfigParams->rxFIFO1WaterMark =(uint32_t) 0u;
    msgRAMConfigParams->rxFIFO1OpMode =(uint32_t) 0u;

    msgRAMConfigParams->rxBufStartAddr =(uint32_t) 0u;
    msgRAMConfigParams->rxBufElemSize = MCAN_Elem_SIZE_64BYTES;
    msgRAMConfigParams->rxFIFO0ElemSize = MCAN_Elem_Size_64BYTES;
    msgRAMConfigParams->rxFIFO1ElemSize = MCAN_Elem_SIZE_64BYTES;
    msgRAMConfigParams->txBufElemSize = MCAN_Elem_Size_64BYTES;


    状态= MCAN_calcMsgRamParamsStartAddr (msgRAMConfigParams);
    DebugP_ASSERT (STATUS = CSL_PASS);

    返回;
    }

    --------------------------------------------------------

    空 MCAN_initGlobalFilterConfigParams (MCAN_ConfigParams * configParams)

    if (configParams!= NULL)

    /*初始化 MCAN 配置参数*/
    configParams->monEnable =(uint32_t) false;
    configParams->asmEnable =(uint32_t) false;
    configParams->tsPrescalar =(uint32_t) 0xFU;
    configParams->tsSelect =(uint32_t) false;
    configParams->timeoutSelect = MCAN_TIMEOUT_SELECT_CONT;
    configParams->timeoutPreload =(uint32_t) 0xFFFFU;
    configParams->timeoutCntEnable =(uint32_t) false;
    /*接受不匹配的帧并拒绝远程帧*/
    configParams->filterConfig.rfs =(uint32_t) true;
    configParams->filterConfig.rfe =(uint32_t) true;
    configParams->filterConfig.anfe =(uint32_t) 2U;// MCAN_RX_FIFO_NUM_1;
    configParams->filterConfig.anfs =(uint32_t) 2U;//MCAN_RX_FIFO_NUM_1;
    }

    返回;
    }

    --------------------------------------------------------

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您分享这些附加信息。

    位填充是 CAN 标准的一部分。 它规定、在相同逻辑电平的每5个连续位后、第6位必须为补码。 这是通过提供上升沿来确保网络正在进行的同步所必需的。 此外、它还可确保位流不会被误解为错误帧或标记消息结束的帧间空间(7位隐性序列)。 所有 CAN 节点都会自动删除额外的位。

    如果在 CAN 报文内的总线上观察到一个相同逻辑电平的6位序列(SOF 与 CRC 域之间)、则  信号  将其检测为位填充错误、也称为填充错误。

    此时、要取得任何额外进展、需要提供 CAN_H/CAN_L 和 CAN_TX/CAN_RX 的示波器屏幕截图。

    您是否还可以提供2节点配置和4节点配置的 CAN 总线连接的原理图详细信息?

    此致、

    Zackary Fleenor

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    1) 1)示波器截图究竟是什么意思?

    2)我无法与您分享确切的原理图、但我们在 CAN 总线上提供了20个节点、总线两端都有120欧姆终端电阻器(b/w P 和 N)。 在该总线上、我们连接了两个和四个节点、其他节点与总线断开连接。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是否可以将示波器探头连接到 CAN_H/CAN_L 和 CAN_RX/CAN_TX 信号以了解信号完整性?

    是否有可能实施分裂端接以提供额外的滤波和共模电压的稳定?

    您能否测量 CAN_H 和 CAN_L 之间的电阻? (应介于45W 和65W 之间、以考虑 CAN 标准中的容差、两个端接电阻器的并联阻抗以及许多并联节点的输入电阻)。

    我还想分享一些 TI 拥有的文档、以了解与此问题具体相关的其他信息。

    控制器局域网物理层要求- https://www.ti.com/lit/an/slla270/slla270.pdf

    调试控制器局域网(CAN)物理层的基础知识- https://www.ti.com/lit/an/slyt529/slyt529.pdf

    CAN 总线连接的关键间距- https://www.ti.com/lit/an/slla279a/slla279a.pdf

    此致、

    Zackary Fleenor

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我们尝试了不同的方法来解决这个问题、所以当我们禁用了 brs 并在所有4个节点上启用了发送和接收功能时、我们在看到5到10分钟后也没有遇到这个错误、所以我认为这个问题与硬件/物理问题无关

    .

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    很高兴听到您取得了一些进展。

    那么、您禁用了 BRS (比特率切换)、您是否仍在使用 CAN-FD 操作 FDOE = 1?

     任何给定节点上的 CAN 收发器是否支持 CAN-FD?

    以下陈述具体做了什么?

    在所有4个节点上启用传输和接收

    谢谢。此致、

    Zackary Fleenor