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.

[参考译文] TCAN4550:TCAN4550待机模式

Guru**** 2535750 points
Other Parts Discussed in Thread: TCAN4550EVM, TCAN4550

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/995439/tcan4550-tcan4550-standby-mode

器件型号:TCAN4550

你好

我通过 有线连接将 TCAN4550EVM 连接到我的板。

我正在尝试使用 Linux 驱动程序代码制作固件(从最新版本开始.. 5.12.xxx)。

我的板不使用 Linux、但我找不到其他驱动程序源代码、

我使电路板的驱动程序是指 Linux 源代码。

我想手动控制 CAN 总线启动/停止。

当处于停止状态时、我希望 CAN 总线忽略所有信号。 (不要做出反应或重新侦察)

希望 CAN 总线从新的通信数据包接收器启动信号开始。

我制作了我的固件源、如 Linux 代码流- m_CAN_start()/ m_CAN_stop()

static void m_can_start(struct net_device *dev)
{
	struct m_can_classdev *cdev = netdev_priv(dev);

	/* basic m_can configuration */
	m_can_chip_config(dev);

	cdev->can.state = CAN_STATE_ERROR_ACTIVE;

	m_can_enable_all_interrupts(cdev);
}

static void m_can_stop(struct net_device *dev)
{
	struct m_can_classdev *cdev = netdev_priv(dev);

	/* disable interrupts */
	m_can_write(cdev, M_CAN_IR, IR_ALL_INT);
	m_can_write(cdev, M_CAN_IE, 0);

	/* disable all interrupts */
	m_can_disable_all_interrupts(cdev);

	/* Set init mode to disengage from the network */
	m_can_config_endisable(cdev, true);

	/* set the state as STOPPED */
	cdev->can.state = CAN_STATE_STOPPED;
}

启动时间 TCAN 寄存器控制、如 m_CAN_start()函数代码。

和停止时间设置、如 m_CAN_STOP()

根据 Linux 代码、TCAN 设置为始终正常模式。 我设置相同。

但是、当 TCAN 保持停止状态时、如果 CAN 总线中有数据包通信、

TCAN (我认为 M_CAN 可能)存储该数据包。

在提供一个 START 信号之后、TCAN 通过早期接收的数据包生成 RX 中断

但我希望从新数据包开始。

然后、我尝试在停止状态下更改待机模式

对于待机模式、我将寄存器 h0800设置为 0x08000642

在待机状态下、我检查 了0x1018 (CCCR)、它是0x19 (时钟关闭)

但是、即使处于待机模式、如果 CAN 总线在停止状态(待机模式)下通信数据包

TCAN 在启动时仍会产生 RX 中断

问题1. 根据数据表的表1模式概述、CAN TX/RX 在待机模式下处于关闭状态。

      但是、我认为它仍然有效、因为 TCAN 在启动时通过早期的数据包生成中断。

      当数据包恢复为标准状态时、为什么 TCAN (M_CAN)会生成中断?

问题2. 我希望在停止状态时忽略所有信号。 我该怎么做?

谢谢你

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

    您好、DH、

    我知道您正在尝试为 TCAN4550编程一个有效禁用模式。 这听起来与内置的待机或睡眠模式不同。 当器件处于睡眠模式时、当它检测到 CAN 总线上的活动时、它将自动更改为待机模式、并且将生成一个中断来通知 MCU 此状态变化。 我认为这不是您的用例所需要的。  

    避免从某个(或所有)消息产生中断的一种方法是将筛选器配置为忽略具有特定 ID 的消息。 使用此函数、可以重新配置 MRAM、以接受禁用阶段中不接受任何消息。 节点准备好再次接收后、可以将 MRAM 重新配置为总线数据所需的滤波器配置。  

    这听起来是否是适用于您的用例的有效解决方案? 请告诉我、您是否希望在此器件的 MRAM 配置方面获得帮助。 下面我将链接一些资源:
    《TCAN4550软件用户指南》
    TCAN4550演示代码 (C 驱动程序、可能比 Linux 代码更易读)

    此致、
    Eric Schott

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

    谢谢 Eric。

    我还没有解决这个问题、因为我不得不做另一个项目。

    在过去的几天中、我使用 TCAN4550制作了电路板、我正在尝试使用电路板

    今天、我尝试了您使用 ID 筛选器的建议。

    我尝试了两种方法、使用 CFC 或 SIDFC/XIDFC。

    但是、即使 fiter 也设置为拒绝所有数据包、但它仍然在开始前通过早期通信数据包生成中断。

    我尝试过如下操作:

    CFC 在开始前设置0x3f、并在开始状态时更改为0x0。

    按摩柱塞滤清器设置如下所示

    标准:(0x3<<27)|0x7ff

    扩展 F0:(0x3<<29)

    扩展 F1:0x1ffffffff

    当它处于启动状态时、它被更改为0x0。

    我认为滤波器组是正确的。 因为如果我没有将滤波器设置更改为在开始状态下接受、那么所有通信数据包都不会生成任何中断。

    我以这种方式进行了测试:

    1) 1)系统启动、首先是停止状态。 (禁用中断/启用过滤器集)

    2) 2)使用外部发生器生成 CAN (FD)数据包(大约数千个)

    3) 3)停止生成数据包。

    4) 4)电路板设置为启动状态。 (启用中断/禁用滤波器集)

    5) 5)电路板启动时没有任何通信数据包、我认为它不应生成任何接收中断。

      但是、早期通信数据包生成的中断。

       其中一些在 RAM 中被正确读取。

       (但在几个数据包通信后、发生 IR.RF0L。 之后、IR.RF0L 始终由通信数据包生成)

       如果我在滤波器启动时没有更改它的设置、那么滤波器就会工作、并且不会生成任何中断。

    如果我做了一些错误或有其他想法、请给我建议。

    谢谢你。

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

    您好、DH、

    我正在查看您的回复、并将在明天再次提供更多信息。  

    同时、您是否能够检查 TCAN4550在配置为拒绝所有 CAN 帧时报告的中断是什么? 其他一些事件、例如错误帧检测、可能会触发中断。

    此外、为了确认、当器件处于睡眠模式时、滤波器不会生效。 无论滤波器配置如何、CAN 总线上的任何活动都将唤醒器件。 TCAN4550不支持允许选择性唤醒(也称为局部联网)的功能。

    此致、
    Eric Schott

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

    再次感谢 Eric。

    很抱歉、这个问题似乎是由于对 CAN 总线自动重发缺乏了解。
    早期通信数据包未完成、这仍然是重新传输状态。
    当系统进入开始状态时、这些重传的组字节将产生中断。

    真正的前置器件是 SPI 速度。 我认为。
    在开始状态之前发送了大约数千个数据包。
     当系统进入启动状态时、这些数据包将重新传输至较短的间隔。
    发生 IR.RF0N 中断的数据包前几个数据包正常处理。
    但是、之后 会发生 IR.RF0L、并保持该条件。
    IR.RF0L 发生一次后未清除。

    我认为 SPI 总线速度太慢、无法在短时间间隔内处理传入的数据包。
    主机无法快速读取 FIFO、数据包 occred 溢出中断。
    我已经使用了最大速度(18MHz)、但这还不够。

    我早期的电路板使用了与 CAN 总线集成的 SoC
    该板没有这样的问题、因为 SoC 能够处理所有重错过的数据包

    我能否复位 CAN 总线以防止重新传输数据包?

    或者、我能否获得其他建议来解决此问题?

    谢谢你

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

    DH、

    重新传输是否由于错误而发生? 寄存器0x1018中有一个位可以禁用自动重发送、该寄存器中有6个位、将其设置为1将禁用自动重发送。

    此致、

    Eric Hackett