工具/软件:
工具/软件:
大家好、TI 专家、目前我在 Linux 上使用套接字来接收 CAN、但 CAN ID 太多。 我可以在 Linux 而不是 MCU 上为这些 ID 设置硬件过滤吗? 当前 ID 超过200个、软件过滤无法满足要求。 希望尽快回复,谢谢!
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.
工具/软件:
工具/软件:
大家好、TI 专家、目前我在 Linux 上使用套接字来接收 CAN、但 CAN ID 太多。 我可以在 Linux 而不是 MCU 上为这些 ID 设置硬件过滤吗? 当前 ID 超过200个、软件过滤无法满足要求。 希望尽快回复,谢谢!
好的。
您可以参考 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
是、地址为32位、但我们不会在 FLSSA 位字段中直接填充地址。
FLSSA 字段以4字节字(32位)为单位指定。
计算 FLSSA 的公式:
FLSSA=(标准过滤器起始地址−消息 RAM 基址)/4
通常它位于消息 RAM 中的第一个位置、您可以填充0
确保过滤器列表有足够的空间、并考虑到:
每个标准过滤器条目需要4个字节。
MCAN_SIDFC.LSS 字段定义标准过滤器的数量。
地址范围不得与 RX/TX 缓冲器、FIFO 或专用缓冲器等其他部分重叠。
在修改过滤器配置之前、确保 MCAN_CCCR.CCE 设置为1 (配置模式)。
此致
Tarun Mukesh
如果您在 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
这是 TRM https://www.ti.com/lit/zip/spruil1中的代码片段
此致
Tarun Mukesh
可以尝试 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;
这是为了在 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 Takuma Fujiwara 、ó 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 设备的同一电路板正常使用、但函数 m_can_init_ram 未运行、没有要 打印的信息。 [/报价]很高兴听到它看起来正常工作! 当 MCAN 器件开启时、M_can_init_ram 应运行。 引导时会探测 MCAN 驱动程序、但器件本身未导通。 如果之前浏览 dmesg 日志 命令、那么我在补丁中拥有的那些日志可能不会显示。
当 SFT 设置为双 ID 过滤器01或传统过滤器10时、发送设备无法发送帧、可能是由于发送设备出现问题。我尝试了以下实验、在这里我使用命令行中的 devmem2直接对滤波器寄存器进行编程。 请注意、我之前发布的补丁需要首先应用、以设置全局滤波器并启用第一个11位滤波器。 双 ID 和传统过滤器看起来都能正常工作:
也可以将相同的代码硬编码到驱动程序中、或者您可以尝试从器件树属性将其配置。
根据使用的 MCAN 模块实例、具体地址会有所不同、但可以参考 TRM (">www.ti.com/.../spruil1)部分"12.4.4.4.10消息 RAM"以获取正确的地址:
以及 MRAM 的排列方式也在该部分中:
带有寄存器描述:
此致、
Takuma
[/quote]