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.

[参考译文] IWR6843ISK:处理一条 CAN 总线上的多个传感器时出现问题

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

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/1371077/iwr6843isk-issues-when-handling-mutliple-sensors-on-one-can-bus

器件型号:IWR6843ISK

工具与软件:

您好!

我在一条 CAN 总线上连接了多个 ISK、设置以下值后、我能够从传感器接收数据、没有任何问题:

mcanCfgParams->errInterruptEnable = 0U 

mcanCfgParams->dataInterruptEnable = 0U

但是、我现在无法向传感器发送任何数据。 一位 e2e 用户同事在 本主题中提到 、他们发现了一个配置、可以用于发送和接收来自多个传感器的数据。

我想知道需要在配置中设置的确切值。

非常感谢您的任何帮助

 

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

    嗨、Rami、

    感谢您提出在我们的器件上使用 CAN 的问题。 我需要更深入地了解您是如何发送和接收数据的。 当前的 mcanCfgParams、mcanBitTimingParams 和 rxMsgObjectParams 是什么? 接收时、您是轮询 NDAT 寄存器还是 FIFO 状态寄存器的更改?

    您是否已浏览过 《雷达工具箱 CAN 集成指南》中包含的用户指南和示例项目? 在 SDK 3器件的 CAN 集成部分下、有几个有关使用 CAN 驱动程序的有用信息位。 这已经过发送和接收 CAN 数据的测试、尽管仅在具有两个 CAN 节点(包括6843本身)的总线上进行。

    此致、

    Kristien

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

    您好、Kristien、

    感谢您的答复。 以下是我当前使用的设置:

        mcanCfgParams->fdMode                            = 0x1U;
        mcanCfgParams->brsEnable                         = 0x1U;
        mcanCfgParams->txpEnable                         = 0x0U;
        mcanCfgParams->efbi                              = 0x0U;
        mcanCfgParams->pxhddisable                       = 0x0U;
        mcanCfgParams->darEnable                         = 0x1U;
        mcanCfgParams->wkupReqEnable                     = 0x1U;
        mcanCfgParams->autoWkupEnable                    = 0x1U;
        mcanCfgParams->emulationEnable                   = 0x0U;
        mcanCfgParams->emulationFAck                     = 0x0U;
        mcanCfgParams->clkStopFAck                       = 0x0U;
        mcanCfgParams->wdcPreload                        = 0x0U;
        mcanCfgParams->tdcEnable                         = 0x1U;
        mcanCfgParams->tdcConfig.tdcf                    = 0U;
        mcanCfgParams->tdcConfig.tdco                    = 8U;
        mcanCfgParams->monEnable                         = 0x0U;
        mcanCfgParams->asmEnable                         = 0x0U;
        mcanCfgParams->tsPrescalar                       = 0x0U;
        mcanCfgParams->tsSelect                          = 0x0U;
        mcanCfgParams->timeoutSelect                     = CANFD_MCANTimeOutSelect_CONT;
        mcanCfgParams->timeoutPreload                    = 0x0U;
        mcanCfgParams->timeoutCntEnable                  = 0x0U;
        mcanCfgParams->filterConfig.rrfe                 = 0x1U;
        mcanCfgParams->filterConfig.rrfs                 = 0x1U;
        mcanCfgParams->filterConfig.anfe                 = 0x1U;
        mcanCfgParams->filterConfig.anfs                 = 0x1U;
        mcanCfgParams->msgRAMConfig.lss                  = 127U;
        mcanCfgParams->msgRAMConfig.lse                  = 64U;
        mcanCfgParams->msgRAMConfig.txBufNum             = 32U;
        mcanCfgParams->msgRAMConfig.txFIFOSize           = 0U;
        mcanCfgParams->msgRAMConfig.txBufMode            = 0U;
        mcanCfgParams->msgRAMConfig.txEventFIFOSize      = 0U;
        mcanCfgParams->msgRAMConfig.txEventFIFOWaterMark = 0U;
        mcanCfgParams->msgRAMConfig.rxFIFO0size          = 0U;
        mcanCfgParams->msgRAMConfig.rxFIFO0OpMode        = 0U;
        mcanCfgParams->msgRAMConfig.rxFIFO0waterMark     = 0U;
        mcanCfgParams->msgRAMConfig.rxFIFO1size          = 64U;
        mcanCfgParams->msgRAMConfig.rxFIFO1waterMark     = 64U;
        mcanCfgParams->msgRAMConfig.rxFIFO1OpMode        = 64U;
        mcanCfgParams->eccConfig.enable                  = 1;
        mcanCfgParams->eccConfig.enableChk               = 1;
        mcanCfgParams->eccConfig.enableRdModWr           = 1;
        mcanCfgParams->errInterruptEnable                = 1U;
        mcanCfgParams->dataInterruptEnable               = 1U;
        mcanCfgParams->appErrCallBack                    = sblErrStatusCallback;
        mcanCfgParams->appDataCallBack                   = sblDataCallback;

        mcanBitTimingParams.nomBrp     = 0x2U;
        mcanBitTimingParams.nomPropSeg = 0x8U;
        mcanBitTimingParams.nomPseg1   = 0x6U;
        mcanBitTimingParams.nomPseg2   = 0x5U;
        mcanBitTimingParams.nomSjw     = 0x1U;
    
        mcanBitTimingParams.dataBrp     = 0x1U;
        mcanBitTimingParams.dataPropSeg = 0x2U;
        mcanBitTimingParams.dataPseg1   = 0x2U;
        mcanBitTimingParams.dataPseg2   = 0x3U;
        mcanBitTimingParams.dataSjw     = 0x1U;

        /* Setup the receive message object for receiving data packets. */
        rxMsgObject2Params.direction     = CANFD_Direction_RX;
        rxMsgObject2Params.msgIdType     = CANFD_MCANXidType_11_BIT;
        rxMsgObject2Params.msgIdentifier = SBL_CANFD_DATA_MSG_ID;
        rxMsgObj2Handle                  = CANFD_createMsgObject(canHandle, &rxMsgObject2Params, &errCode);
        if (rxMsgObj2Handle == NULL)
        {
            SBL_printf("Error: CANFD create Rx message object failed [Error code %d]\n", errCode);
            return;
        }
        /* Setup the receive message object for receiving terminate packets. */
        rxMsgObject3Params.direction     = CANFD_Direction_RX;
        rxMsgObject3Params.msgIdType     = CANFD_MCANXidType_11_BIT;
        rxMsgObject3Params.msgIdentifier = SBL_CANFD_TERMINATE_MSG_ID;
        rxMsgObj3Handle                  = CANFD_createMsgObject(canHandle, &rxMsgObject3Params, &errCode);
        if (rxMsgObj3Handle == NULL)
        {
            SBL_printf("Error: CANFD create Rx message object failed [Error code %d]\n", errCode);
            return;
        }
    
        /* Setup the receive message object for receiving start packets. */
        rxMsgObject4Params.direction     = CANFD_Direction_RX;
        rxMsgObject4Params.msgIdType     = CANFD_MCANXidType_11_BIT;
        rxMsgObject4Params.msgIdentifier = SBL_CANFD_START_MSG_ID;
        rxMsgObj4Handle                  = CANFD_createMsgObject(canHandle, &rxMsgObject4Params, &errCode);
        if (rxMsgObj4Handle == NULL)
        {
            SBL_printf("Error: CANFD create Rx message object failed [Error code %d]\n", errCode);
            return;
        }

    至于发送数据、我将在微控制器上使用以下代码:

    #include <linux/can.h>
    #include <linux/can/raw.h>
        
    bool sendFrame(const canfd_frame &frame) {
        if (write(sock_, &frame, sizeof(struct canfd_frame)) < 0) {
            return false;
        }
        return true;
    }

    接收时、是否轮询 NDAT 寄存器或 FIFO 状态寄存器的更改?

    不,我不知道你这么说是什么意思。 你想解释一下吗?

    [报价 userid="567309" url="~/support/sensors-group/sensors/f/sensors-forum/1371077/iwr6843isk-issues-when-handling-mutliple-sensors-on-one-can-bus/5236298 #5236298"]您是否仔细阅读了 《雷达工具箱 CAN 集成指南》中包含的用户指南和示例项目?[/QUOT]

    感谢提示、我将查看它。

    再次感谢您的帮助。

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

    嗨、Rami、

    感谢您发送所需的信息! 我需要更多时间来审核您发送的内容、但我明天会向您发送更新。 关于轮询注释、 您在帖子中提到数据和错误中断使能设置为零、这意味着接收消息不会触发中断。 因此、我想您可能一直在使用轮询方法(即持续检查)来监测 NDAT 寄存器(新数据-由缓冲器接收新数据触发)或 FIFO 状态寄存器(当收到消息时、填充级别应增大)。

    此致、

    Kristien

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

    您好、Kristien、

    感谢您提供信息。 我不熟悉 NDAT 和 FIFO 寄存器、但我会进行更深入的了解。

    您检查过我发送给您的代码片段了吗? 您可以提供有关需要更改的内容的有用见解吗?

    谢谢

    Rami

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

    嗨、Rami、

    我仔细看了一下您发送的代码片段、发现没有任何固有的错误、但我们可以研究一些内容。 首先、根据数据位时序参数、我注意到您使用了与标称采样点不同的采样点(62.5%、标称采样点75%)。 采样点减小是否有特定的原因? 许多时序因素(如比特率和采样点)取决于总线拓扑。 例如、随着总线长度的增加、位速率应减小、采样点应增大。 通常建议为数据和标称时序使用87.5%的采样点。

    这也给我带来了另一个问题:您是否已验证以下内容?

    • CAN 线两端都应使用120欧姆的电阻器端接在 CAN 低电平和 CAN 高电平线路之间、以防止阻抗不匹配导致反射
    • 确保所有节点均设置为相同的时序参数、即比特率、传播段、相位段、同步跳转宽度、预分频器、 等等

    如果考虑了之前的注释、我建议将示波器或逻辑分析仪直接连接到 CAN 总线、以查看 信号是否正确传播、即正确的电压电平、位时序、消息确认等

    此致

    Kristien

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

    您好、Kristien、

    很抱歉这么晚才回复。 我通过设置以下值找到了解决方案:

    mcanCfgParams->filterConfig.anfe = 0x3U
    mcanCfgParams->filterConfig.anfs = 0x3U
    感谢您的帮助!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Rami、

    我很高兴我能够提供一些帮助! 为了帮助可能有此问题的其他人、您能否发布适用于您的完整 mcanCfgParams? 与您发布的 mcanCfgParams 相比、您是否只需更改不匹配的帧过滤器 GFC 字段、或者自上次以来软件或硬件设置是否有其他更改?

    此致、

    Kristien