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.

[参考译文] TCAN1146-Q1:CAN FD 帧和 FRAME_CNT 不变

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1587861/tcan1146-q1-can-fd-frame-and-frame_cnt-unchanged

器件型号: TCAN1146-Q1

大家好、团队:

  我想在使用 tcan1146 检测到 CAN FD 帧后测试将 FRAME_CNTx 增加 1 的功能。 步骤如下:

(1) 设置 MODE_CNTRL(0x10)= 0x81、启用选择性唤醒和睡眠模式
(2) 设置 SW_CONFIG_1 (0x44)= 0x50、因此位 7 (SW_FD_PASSIVE) 为零、CAN FD 将计为错误帧

此时、我使用另一个 MCU 板向 CAN 总线发送 CAN FD 帧、但 tcan1146 FRAME_CNTx (SW_CONFIG_2) 未添加 1

  我想知道此测试过程中出现任何错误的地方吗? 我们应该注意什么? 谢谢!

此致、

FED

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

    嗨 Fed、

    写入 SW_CONFIG_1(和任何其他选择性唤醒配置寄存器)将清除 SWCFG 位、因此选择性唤醒将被禁用。

    正确的序列是首先配置所有 SW 配置寄存器、确保最后一步设置 SWCFG = 1、然后将 MODE_CNTRL 寄存器设置为 0x81。

    此致、

    Sean

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

    谢谢你、Sean。

    选择性唤醒 初始化过程参考了应用手册“选择性唤醒如何实现局部联网“、因此、初始化序列应该正确、并且  可以生成唤醒中断。

    现在我想知道测试 FRAME_CNTx 是否要求 tcan1146 处于睡眠模式?

    此外、如何设置 测试环境? 例如、我是否需要另外两个器件来发送和接收 CANFD 数据? 然后、这个 tcan1146 可以在 CAN 总线上获取 CANFD 数据。

    谢谢。此致、

    FED

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

    嗨 Fed、  

    否、帧错误计数器不需要器件处于睡眠模式。 它 可以在任何模式下监控总线。

    您只需要另一个节点来发送 CAN FD 数据、总线上的节点数量无关紧要。

    此致、

    Sean

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

    谢谢你、Sean

    下图显示了我的测试设备环境:

     引用应用手册“选择性唤醒如何实现局部联网“的 SW 初始化代码

    void TCAN1146_SW_Init (void)

    uint8_t wdata = 0;

    wdata = 0x00;
    SPI_DataInOut (LPSPICOM1、REG_SW_CONFIG_4、(uint8_t *)&wdata、NULL);

    wdata = 0x00;
    SPI_DataInOut (LPSPICOM1、REG_SW_ID1、(uint8_t *)&wdata、NULL);
    wdata = 0x00;
    SPI_DataInOut (LPSPICOM1、REG_SW_ID2、(uint8_t *)&wdata、NULL);
    wdata = 0x04;
    SPI_DataInOut (LPSPICOM1、REG_SW_ID3、(uint8_t *)&wdata、NULL);
    wdata = 0x8c;
    SPI_DataInOut (LPSPICOM1、REG_SW_ID4、(uint8_t *)&wdata、NULL);

    wdata = 0x00;
    SPI_DataInOut (LPSPICOM1、REG_SW_ID_MASK1、(uint8_t *)&wdata、NULL);
    wdata = 0x00;
    SPI_DataInOut (LPSPICOM1、REG_SW_ID_MASK2、(uint8_t *)&wdata、NULL);
    wdata = 0x00;
    SPI_DataInOut (LPSPICOM1、REG_SW_ID_MASK3、(uint8_t *)&wdata、NULL);
    wdata = 0x00;
    SPI_DataInOut (LPSPICOM1、REG_SW_ID_MASK4、(uint8_t *)&wdata、NULL);

    WDATA = 0x11;
    SPI_DataInOut (LPSPICOM1、REG_SW_ID_MASK_DLC、(uint8_t *)&wdata、NULL);

    wdata = 0x01;
    SPI_DataInOut (LPSPICOM1、REG_SW_DATA_7、(uint8_t *)&wdata、NULL);
    wdata = 0x00;
    SPI_DataInOut (LPSPICOM1、REG_SW_DATA_6、(uint8_t *)&wdata、NULL);
    wdata = 0x00;
    SPI_DataInOut (LPSPICOM1、REG_SW_DATA_5、(uint8_t *)&wdata、NULL);
    wdata = 0x00;
    SPI_DataInOut (LPSPICOM1、REG_SW_DATA_4、(uint8_t *)&wdata、NULL);
    wdata = 0x00;
    SPI_DataInOut (LPSPICOM1、REG_SW_DATA_3、(uint8_t *)&wdata、NULL);
    wdata = 0x00;
    SPI_DataInOut (LPSPICOM1、REG_SW_DATA_2、(uint8_t *)&wdata、NULL);
    wdata = 0x00;
    SPI_DataInOut (LPSPICOM1、REG_SW_DATA_1、(uint8_t *)&wdata、NULL);
    wdata = 0x00;
    SPI_DataInOut (LPSPICOM1、REG_SW_DATA_0、(uint8_t *)&wdata、NULL);

    wdata = 0x50;
    SPI_DataInOut (LPSPICOM1、REG_SW_CONFIG_1、(uint8_t *)&wdata、NULL); //SW_FD_PASSIVE = 0

    wdata = 0xFE;
    SPI_DataInOut (LPSPICOM1、REG_SW_CONFIG_3、(uint8_t *)&wdata、NULL);

    wdata = 0x80;
    SPI_DataInOut (LPSPICOM1、REG_SW_CONFIG_4、(uint8_t *)&wdata、NULL);

    WDATA = SPI_REG_MODE_CNTRL_SW_ENABLE | SPI_REG_MODE_CNTRL_SLEEP;
    SPI_DataInOut (LPSPICOM1、REG_MODE_CNTRL、(uint8_t *)&wdata、NULL);
    }

    DEVA 和 DEVB 会将 CANFD 数据相互发送、但 FRAME_CNT  始终为 0、 我希望在检测到 CANFD(作为错误帧)时 FRAME_CNT 会增加。

    请帮助我分析原因,谢谢。

    此致、

    FED

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

    嗨 Fed、

    寄存器的配置看起来不错。 当您在 Deva 和 DEVB 上发送 CAN FD 数据时、您发送多少个帧? 您是不断发送多个 CAN FD 帧、还是仅发送 1 帧?

    如数据表中所示、错误计数器会在一些情况下递减或复位、

    如果您仅发送 1 个 CAN FD 帧、然后是其他传统 CAN 帧、则错误计数器将递减。 或者、如果在发送 CAN FD 帧后让总线在 tSILENCE 内空闲、则计数器会复位。 如果您未在总线空闲之前立即读取寄存器值、则可能会看到错误计数器为 0。

    此外、如果您使用 DEVA 和 DEVB 发送 CAN FD 帧作为第一帧、然后立即读取错误计数器、也会看到它不会递增。 上电或 tSILENCE 之后总线空闲后、第一个帧只会将总线偏置从 GND 更改为 2.5V。 收发器不会将其视为错误。 这是因为器件的 内部时钟可能具有频率差值、在该频率差值下、它无法在首次启动时对 CAN 帧进行解码。 它必须“学习“如何锁定到 CAN 帧上。 根据 ISO 标准、500K 允许需要 4 个帧、1Mbps 允许需要 8 个帧。

    我建议首先发送有效的 CAN 帧(传统 CAN)、 确保错误计数器 为 0、然后开始为此测试发送 CAN FD 帧。

    如果它无法解决您的问题、请告诉我。

    此致、

    Sean

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

    感谢 Sean 的耐心指导。

    完成今天的测试后、FRAME_CNT 已可以更改。

    我改变了测试方法,昨天 Deva 发送 CANFD 的速度很慢;

    如今、Deva 使用一个周期为 100ms 的计时器来连续发送 CANFD。  在发送过程中读取 FRAME_CNT、我 可以看到 FRAME_CNT 正在增加、 直至达到 FRAME_CNT_THRESHOLD。

    如果停止发送 CANFD、FRAME_CNT 将立即复位、但 我不确定它是否是由于 tSILENCE  到期 而导致复位。

    现在,我有一个想法。 是否可以更改 tSILENCE  的持续时间或禁用 tSILENCE 

    谢谢。此致、

    FED

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

    嗨 Fed、

    tSILENCE 持续时间无法更改或禁用。 这是 ISO11898-2 标准的一项要求、最低要求为 0.6s、因此您可能会在 CAN 通信停止后立即感到它复位。

    此致、

    Sean

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

    好的、我理解。 谢谢你、Sean。

    此致、

    FED