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.

[参考译文] TDA4VM:如何在 A72 Linux 上设置 HW CAN 过滤器?

Guru**** 2392905 points
Other Parts Discussed in Thread: TDA4VM

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1492612/tda4vm-how-to-set-hw-can-filter-on-a72-linux

器件型号:

工具/软件:

工具/软件:

大家好、TI 专家、目前我在 Linux 上使用套接字来接收 CAN、但 CAN ID 太多。 我可以在 Linux 而不是 MCU 上为这些 ID 设置硬件过滤吗? 当前 ID 超过200个、软件过滤无法满足要求。 希望尽快回复,谢谢!

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

    您好:

    根据我的理解、您已经通过套接字 CAN 使用了软件滤波器、但有许多 CAN ID、因此您需要写入 HW 寄存器、以具有 CAN ID 的范围、而不是 SW 中的各个 CAN ID。 我是对的吗?

    我是否也可以知道这个 SDK 的版本是在哪个版本上?

    此致

    Tarun Mukesh

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

    是的、SDK 版本为0806、现在软件无法正常工作、因此我需要使用硬件过滤器来从海量帧数据中过滤预期的 CANFD 帧。 我认为可以编写 MCAN 寄存器、但我不知道如何设置。 您是否有关于此问题的文档或代码示例? 如果你有一个更好的方式,请告诉我,兄弟。 谢谢您!

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

    好的。

    您可以参考 TRM 中的部分  

    这是 MCAN 寄存器中 MCAN_SIDFC 寄存器的配置

    使用 SFEC (标准过滤器元素配置)寄存器中的 SFT (标准过滤器类型)或 EFT (扩展过滤器类型)字段。

    对于区段过滤器、设置 SFT = 1。

    配置范围:

    SFID1:将其设置为 CAN ID 范围的下限。

    SFID2:将其设置为 CAN ID 范围的上限。

    启用过滤器:

    配置 SFEC 以指定匹配帧会发生什么情况(例如、存储在 FIFO 0、FIFO 1或拒绝中)。

    SFEC = 1:存储在 Rx FIFO 0中。

    SFEC = 2:存储在 Rx FIFO 1中。

    示例

    要过滤0x200至0x2FF 的 CAN ID、请执行以下操作:

    SFID1 = 0x200

    SFID2 = 0x2FF

    SFT = 1 (区段过滤器)

    SFEC = 1 (存储在 Rx FIFO 0中)

    此致

    Tarun Mukesh

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

    在表中 ,bits 15-2 被设置 过滤器列表起始 addr ,但 addr 为32bits, 无法理解!  

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

    是、地址为32位、但我们不会在 FLSSA 位字段中直接填充地址。

    FLSSA 字段以4字节字(32位)为单位指定。

    计算 FLSSA 的公式:

    FLSSA=(标准过滤器起始地址−消息 RAM 基址)/4

    通常它位于消息 RAM 中的第一个位置、您可以填充0

    确保过滤器列表有足够的空间、并考虑到:

    每个标准过滤器条目需要4个字节。

    MCAN_SIDFC.LSS 字段定义标准过滤器的数量。

    地址范围不得与 RX/TX 缓冲器、FIFO 或专用缓冲器等其他部分重叠。

    在修改过滤器配置之前、确保 MCAN_CCCR.CCE 设置为1 (配置模式)。

    此致

    Tarun Mukesh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当我设置寄存器时,我发现 candump 没有打印任何结果,发送者显示它正在正常发送。只需发送 canfd 帧 ID 0x111
    M_CAN_WRITE (cdevM_CAN_GFC0x3f);
    M_CAN_WRITE (cdevM_CAN_SIDFC1<<16); //仅一个滤波器
    //  
    m_can_fifo_write_no_off (cdevstart0x891107ff);  //id:0x111 mask :0x7ff
    0x891107ff ==== 1000 1001 0001 0001 0000 0111 1111 1111
     
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当我设置 m_can_write (cdev、 M_can_gfc、 0x0)时、所有 FAME ID 都将由 candump 打印。这表示 sidfc 或 筛选器值   0x891107ff    是否设置不正确。   请帮助我兄弟,谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引述 userid="589200" url="~/support/processors-group/processors/f/processors-forum/1492612/tda4vm-how-to-set-hw-can-filter-on-a72-linux/5749446 #5749446"]
    M_CAN_WRITE (cdevM_CAN_GFC0x3f);
    M_CAN_WRITE (cdevM_CAN_SIDFC1<<16); //仅一个滤波器
    //  
    [/报价]

    如果您在 GFC 中写入0x3F 所有消息、则它将拒绝所有消息  

    您只需将所有 GFC 提及为0x0。  

    [引述 userid="589200" url="~/support/processors-group/processors/f/processors-forum/1492612/tda4vm-how-to-set-hw-can-filter-on-a72-linux/5749613 #5749613"]  0x891107ff    设置不正确

    滤波器配置错误。 您需要接收的 CAN ID 范围是多少?

    此致

    Tarun Mukesh

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

    如图所示 ,0x3f 将拒绝所有不匹配的帧 ,  

     我只想在 ID 0x111上接收。  你能给我正确的价值吗?

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

    您好:

    在 Rx 缓冲区中接收消息

    sfid2 = 0x0U
    sfid1 = 0x111U;
    sfec = 0x7U;
    SFT = 0x0U
    如果您编写此配置、您可以接收 CAN ID 消息。
      
    此致
    Tarun Mukesh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     您能给我提供 这个文档链接吗?

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

    这是 TRM https://www.ti.com/lit/zip/spruil1中的代码片段

    此致

    Tarun Mukesh

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

    sfid2  =  0x0U

    sfid1  =  0x111U;
    sfec  =  0x7U;
    sft  =  0x0U; 谢谢、但 还要打印所有帧 ID、 是否确定 GFC 可以设置为 ox0?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    可以尝试 GFC=0x30吗? 我相信,如果你保持 GFC 为0x0 ,它接受所有的消息到你的 CAN Rx FIFO。

    [引述 userid="589200" url="~/support/processors-group/processors/f/processors-forum/1492612/tda4vm-how-to-set-hw-can-filter-on-a72-linux/5749747 #5749747"]

    sfid2  =  0x0U

    sfid1  =  0x111U;
    sfec  =  0x7U;
    SFT  =  0x0U;  
    [/报价]

    这是为了在 Rx 缓冲区中包含 Rx 消息、而不是在 Rx FIFO 中包含 FIFO

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

    GFC 被设置为0x30、candump 没有打印 ID、并且发送方可以、只发送具有多个不同 ID 的标准帧。     、我只需要使用 socketCan 在 Linux 上重新生成 canfd 帧、在/ti-processor-sdk-linux-rt-j7-evm-08_06_01_02/board-support/linux-RT-5.10.162+gitAUTOINC+02a1d48fd7-g02a1d48fd7/drivers/net/can/m_m_c.linux 中修改了 一些寄存器、那么我是否可以使这些步骤正常? 然而,在 MRAM 的开头设置 sidfc reg 和写入过滤器元素并不起作用 !μ s

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

    尊敬的 Mingzhen:

    我在浏览 E2E 时看到了此主题。 我过去已经通过实验在使用与 TDA4VM 相同 CAN 驱动程序的另一个 SoC 上设置了一个硬件可以通过 Linux 进行滤波。

    下面是 Linux 驱动程序中的一个补丁、该补丁将过滤器设置为仅接受从0x3到0x7FF 的消息 ID:

    e2e.ti.com/.../0001_2D00_Experimental_2D00_hardware_2D00_MCAN_2D00_message_2D00_filter.patch

    我保存了一些示例日志、其中我展示了可以将 ID 介于0x3之间的 CAN 消息发送到0x7FF (具体而言、我在日志中尝试了 ID 123和3)、我表明没有收到 CAN ID 0、1和2:

    e2e.ti.com/.../example_5F00_log_5F00_linux_5F00_hardware_5F00_can_5F00_filter.txt

    如果这对我有帮助、请告诉我。

    此致、

    Takuma

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

    Hi 、ó n

       正如您的补丁程序显示、我的代码几乎与您的代码相同、我认为问题应该在其他地方。 目前、我正在度假、稍后将进行测试。 感谢您的帮助!

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

       您是否尝试过发送 Canfd 帧? 您可以将其设置为类似  IP 链路设置 CAN1类型 CAN 比特率500000采样点0.8 dbitrate 2000000 dsample-point 0.8 fd 重启 ms 1000、我会这样设置、但当 GFC 设置为0x30时、无论 CAN 还是 CANFD、我都无法接收应该匹配的帧 ID。

       发送端使用 CANFD 收集设备发送帧。   谢谢!   

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

    尊敬的 Mingzhen:

    我还没有使用 CAN-FD 完成测试。 我需要收集过去用于实验的内容、以便下周进行测试、看看 CAN-FD 是否与正常 CAN 相同。  

    此致、

    Takuma

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

       大家好、Takuma Fujiwara、非常感谢。 我现在已经测试了你的补丁,所有类型的硬件过滤器都可以正常使用,通过使用相同的板与不同的 CAN 设备,但函数 m_can_init_ram 没有运行,没有信息要 打印。 当 SFT 设置为双 ID 过滤器01或传统过滤器10时、发送设备无法发送帧、可能是由于发送设备出现问题。

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

    尊敬的 Mingzhen:

    我现在已经测试了您的补丁、所有类型的硬件过滤器都可以通过使用具有不同 CAN 设备的同一电路板正常使用、但函数 m_can_init_ram 未运行、没有要 打印的信息。 [/报价]

    很高兴听到它看起来正常工作! 当 MCAN 器件开启时、M_can_init_ram 应运行。 引导时会探测 MCAN 驱动程序、但器件本身未导通。 如果之前浏览 dmesg 日志 命令、那么我在补丁中拥有的那些日志可能不会显示。  

    当 SFT 设置为双 ID 过滤器01或传统过滤器10时、发送设备无法发送帧、可能是由于发送设备出现问题。

    我尝试了以下实验、在这里我使用命令行中的 devmem2直接对滤波器寄存器进行编程。 请注意、我之前发布的补丁需要首先应用、以设置全局滤波器并启用第一个11位滤波器。 双 ID 和传统过滤器看起来都能正常工作:


    e2e.ti.com/.../devmem2_5F00_for_5F00_filtering_5F00_dual_5F00_id_5F00_and_5F00_classic_5F00_filter.txt 

    也可以将相同的代码硬编码到驱动程序中、或者您可以尝试从器件树属性将其配置。

    根据使用的 MCAN 模块实例、具体地址会有所不同、但可以参考 TRM (">www.ti.com/.../spruil1)部分"12.4.4.4.10消息 RAM"以获取正确的地址:

    以及  MRAM 的排列方式也在该部分中:

    带有寄存器描述:

    此致、

    Takuma

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

    感谢你的帮助。 问题已经解决。 此函数未运行、并且 dmesg 操作的结果没有调试信息。