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:回送 ACK 数据、时序等式和 GLOBALERR 时出现问题

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/940690/tcan4550-problem-with-sending-back-ack-data-timing-isue-and-globalerr

器件型号:TCAN4550

您好!

我们将 TCAN4550用于定制板上的项目。 设置就像这样、一个板正在发送数据、另一个板正在侦听。

因此、发送的电路板需要 ACK 数据。 但存在一个问题。 当接收 器获得数据时、它应该立即发回 ACK、但它通常在90-100ms 范围内发送、这太大。

因此、通信 工作正常、如果我查看寄存器状态、除 GLOBALERR 之外的所有内容都是清零的、我 不知道这与它有没有关系。  

代码是 根据您的示例创建的。 (TCAN4550_DEMO)。

if (MsgHeader.ID = 0x6A9)//示例说明如何根据接收到的地址执行操作

   if (Rx_DATA[0]= 0x10)
   {
     速度=(rx_data[3] <<8)| rx_data[2];
     header.ID = 0x255;
     TX_DATA[0]= 0x01;
     TX_DATA[1]= 0x10;
     TX_DATA[2]= 0x00;
     TX_DATA[3]= 0x00;
     TX_DATA[4]= 0x00;
     TX_DATA[5]= 0x00;
     TX_DATA[6]= 0x00;
     TX_DATA[7]= 0x00;
      

     TCAN4x5x_MCAN_WriteTXBuffer (0、&HEADER、TX_DATA);//此行会将 TX_DATA 和 HEADER 写入 TX FIFO 1
     TCAN4x5x_MCAN_TransmitBufferContents (0);//请求发送 TX 缓冲区1
   }

您能不能帮助我 为什么会出现这样的延迟、什么意思是 GLOBALLERR?

谢谢你

SEBA。

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

    您好、SEBA、

    根据 CAN 标准的定义、接收器将在总线上来自不同传输节点的消息完成后立即发送 ACK 脉冲。  这必须在消息之后的立即位周期内、如果接收节点在总线上未发送 ACK 脉冲、则发送节点将考虑到消息出现故障、增加发送错误计数器、然后尝试再次发送消息。  接收器节点还将增加其接收错误计数器。

    在 TCAN4550中、如果 CAN FD 控制器已无误地接收到消息并且不可能存在90-100mS 延迟、则它会在硬件中处理此 ACK 脉冲。  也许我们使用 ACK 术语来表示两个不同的东西。  您是否希望接收节点将消息发送回原始传输节点、作为其收到消息的"确认"?  如果是、则可以理解90-100mS 的延迟、这将是 MCU 固件例程的结果。

    GLOBALERR 是寄存器0x0820和0x0824中所有故障的逻辑或、因此如果它被置位、那么也有另外一个故障位被置位。  您能否同时读取寄存器0x0820和0x0824、以便我们可以查看哪个故障会设置 GLOBALERR 标志?

    此致、

    Jonathan

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

    你好、Jonathan

    感谢您的快速回复。  我对 ACK 的解释完全 错误、我的意思是 将消息广播 回发送器。 很抱歉造成误解。 正如您所建议的、我还认为这是一个与固件相关的问题。 您是否有一些技巧、如何缩短此时间? 可能使用滤波器吗?

    关于 GLOBALERR 中断我查看了所有寄存 器、您是正确的、M_CAN_INT 被触发(0x01)、原因是缓冲区中出现了一条新消息。
    此致。
    Sebastijan Cvirn
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sebastijan、

    我认为 ACK 消息是您的意思、看起来您的系统通常正常工作。  响应延迟可能有一些改进空间、但遗憾的是、这是 TCAN4550中由于 SPI 接口而难以管理的少数几个领域之一。

    由于我对您的系统要求和架构没有任何具体的详细信息、因此我只能用一般性的术语来说明。  但以下是需要考虑的一些想法:

    1. 您是使用硬件中断例程、还是轮询状态寄存器和中断寄存器以确定何时接收到新消息?
      1. 如果您轮询寄存器、则应考虑使用硬件中断引脚、以便减少 SPI 总线开销、并在设置中断引脚后立即触发响应。
      2. 如果您已经在使用中断信号、请考虑将 GPIO1或 GPO2引脚中的一个引脚用作专用的 MCAN 消息中断线路、该线路允许您将 RX 消息与可能的中断标志的其余部分分离。  这可以让您的中断例程立即开始读取 RX 消息、而不是花时间解码中断寄存器值、并确定可能来自众多不相关标志的中断标志的原因。
    2. 最显著的延迟将来自在 TCAN4550中读取和写入数据所需的 SPI 开销和时间。
      1. 使用尽可能快的 SPI 频率。  唯一的限制是、如果使用的时钟频率小于20Mhz、它必须小于18MHz、或者小于晶体频率约1MHz。  这是为了确保数据能够在数字内核时钟域和 SPI 时钟域之间无误地传递。  但是、减少 SPI 位时间将使总延迟减小成比例。
      2. 使用 SPI 突发读取和写入从 RX/TX 消息缓冲器进行读取和写入。  如果您每次读取一个32位字、则每个 SPI 事务的一半是地址和直接开销、这会增加显著延迟。  但是、如果执行突发读取/写入、则只会在第一个事务上传递初始起始地址和开销位、而事务的其余部分仅与数据相关。
    3. 接收节点是否配置为将消息回传到发送节点、或者是否只需发送确认消息而不发送在请求时或在收到原始消息后必须生成的任何特定数据负载?
      1. 如果只需要一条确认消息、那么您可能已经在特定的 TX 缓冲区中存储了一条特定的消息、并且一旦您从接收到的消息中看到中断标志、 MCU 可以立即向该特定 TX 缓冲器发出发送请求并在总线上发回一条消息。  这可能是最快的响应方式、但消息数据有效载荷必须预加载到 TX 缓冲器中。 但这样可以消除所有 SPI 总线开销以及读取 RX 缓冲区或 RX FIFO、在 MCU 中处理消息、然后在 TX 缓冲区中重新加载新消息、然后发出发送请求所需的时间。
      2. 如果您需要在响应消息中传递有意义的数据有效载荷、请使用 SPI 突发模式填充缓冲器、并考虑使用可能的最小数据有效载荷。
      3. 减少 MCU 代码中的开销、以最快速度响应和处理接收到的消息并发送响应消息。

    4. 这可能不适用于您的双板系统、但在较大的系统中、由于选择了消息标识符、您可能会遇到延迟。  在 CAN 中、消息在接收最高优先级的 ID 最低的优先级系统中传输。  如果总线上有大量流量、您应该使用可能的最低 ID 值来确保它在系统中获得适当的优先级。

    我希望这能为您提供一些关于如何优化系统以更快响应的想法。

    此致、

    Jonathan

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

    您好、Jonathan、

    感谢您的回答和提示。 我将稍微介绍一下系统:

    我们将架构用作主节点、而其他节点为从节点。 主器件正在发送消息(向其他节点请求数据)、并在100ms 内收到确认消息。 数据大约每8-10ms 从主器件发送一次。 TCAN4550通常在1m 以内响应、这非常完美。 我使用外部中断、然后读取数据、这与您在示例中的做法相同。 但是、正如您可以看到的、数据之间存在一些差距(底部图片)。 我缩小了此间隙的数量、将此参数降低到1或2:

    "MRAMConfiguration.Rx0NumElements= 1;// RX0元素数量"

    我也尝试设置筛选器、但我没有成功、您能帮我解决这个问题吗?

    我希望让筛选器仅使用两条消息:ID-0x6A8和 ID-0x6A9

    关于筛选器的问题-如果消息在筛选器之外、它是否会触发中断?

    缩放的图片:您可以看到、先是请求、然后是应答、中间是我希望消除的较大间隙。

    此致。

    塞巴斯蒂扬

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

    您好、Sebastijan、

    您可以通过几种不同的方法来构建您的滤波器、但下面有一个建议。 我无法自己在硬件中测试它、但如果需要、我可以进行测试。 但是,让我们看看这是否足以让您朝正确的方向移动。

    有关滤波器的其他信息,请在《TCAN45xx 软件用户指南》中详细说明。

    https://www.ti.com/lit/ug/sllu270/sllu270.pdf

    第4.2节介绍消息 RAM 配置、第4.2.3节讨论了我认为是您想要的11位标准 ID 滤波器(SID 滤波器)。

    有关博世 M_CAN FD 控制器的更多信息,请访问博世网站上的以下链接。 复制 TCAN4550数据表中有关 M_CAN 的所有信息是不切实际的、尤其是因为博世对其进行了详细的记录。 本用户指南是 TCAN4550数据表和软件用户指南的重要补充资源。
    https://www.bosch-semiconductors.com/ip-modules/can-ip-modules/m-can/

    但一般来说、您需要创建一个32位字的标准 ID 滤波器元素、并将其写入 MRAM 配置的 SID 滤波器元素部分。 SID 过滤器元素的详细信息如下:

    SID 过滤器滤芯

    名称

    说明

    SFT

    标准滤波器类型

    [31:30]

    SFEC

    标准滤波器元件配置

    [29:27]

    SFID1

    标准过滤器 ID 1

    [26:16]

    保留

    保留

    [15:11]

    SFID2

    标准过滤器 ID 2.

    [10:0]

    SFT

    值(二进制)

    说明

    2000年2月

    范围筛选器:接受从 SFID1到 SFID2的所有 ID

    2'B01.

    双 ID 滤波器:同时匹配 SFID1和 SFID2 (ID 必须完全匹配)

    2010年2月10日

    经典滤波器:SFID1是滤波器、SFID2是掩码。 掩码中的0对应于“无关”。 请参阅下面的更多信息

    2'B11.

    滤波器元件已禁用:此滤波器将不匹配。

    SFEC

    值(二进制)

    说明

    3'b000

    禁用过滤器滤芯。 不执行任何操作、不匹配任何操作

    3'b001

    存储在 Rx FIFO 0中

    3'b010.

    存储在 Rx FIFO 1中

    3'b011

    拒绝消息。 不会设置中断、只会忽略消息。

    3'B100

    设置为优先级消息(中断)、消息存储位置取决于其他过滤器或默认行为

    3'B101.

    设置为优先级(中断)并存储在 FIFO 0中

    3'B110

    设置为优先级(中断)并存储在 FIFO 1中

    3'B111.

    存储到 Rx 缓冲器或作为调试消息。 如果使用此方法、则忽略 SFT、并将 SFID1用作滤波器。 SFID2[10:9]描述了消息的存储位置、SFID2[5:0]描述了要放置消息的 Rx 缓冲器(必须在 Rx 缓冲器配置中)

    最终 SID 过滤器滤芯

    名称

    说明

    SFT

    标准滤波器类型

    [31:30]

    2000年2月

    SFEC

    标准滤波器元件配置

    [29:27]

    3'B101.

    SFID1

    标准过滤器 ID 1

    [26:16]

    11'b110101000

    保留

    保留

    [15:11]

    5'b00000

    SFID2

    标准过滤器 ID 2.

    [10:0]

    11'b11010101001

    这将使最终 SID 滤波器元素= 0x2EA806A9

    现在、您必须使用 SID 过滤器元素数量和标准消息 ID 过滤器列表的起始地址(32位字地址)配置标准 ID 过滤器配置(SIDFC)寄存器。 以便 M_CAN 知道在收到消息时从何处查找 SID 过滤器列表的起始位置以及列表中有多少个过滤器。 搜索始终从列表中的第一个 SID 过滤器元素开始,因此,如果您有多个过滤器,则应在 MRAM 中以优先顺序的方式对它们排序,以加快过滤器的处理。 SIDFC 寄存器配置详细信息如下:

    标准 ID 滤波器配置(地址0x1084)

    名称

    说明

    保留

    保留

    [31:24]

    LSS[7:0]

    列表大小标准

    [23:16]

    FLSSA[15:2]

    过滤器列表标准起始地址

    [15:2]

    保留

    保留

    [1:0]

     

    LSS[7:0]列表大小标准

    值(二进制)

    说明

    0

    无标准消息 ID 过滤器

    1-128.

    标准消息 ID 过滤器元素的数量

    >128

    大于128的值被解释为128

    FLSS[15:2]过滤器列表标准起始地址

    值(二进制)

    说明

    标准消息 ID 过滤器列表的起始地址(32位字地址)

     

    如果您使用的是 TCAN4550_DEMO 代码的变体、则可以使用以下结构来保存设置:

     

    TCAN4x5x_SID_SFEC_VALUES

    TCAN4x5x_SID_SFT_Values

    TCAN4x5x_MRAM_Config

    TCAN4x5x_MCAN_SID_Filter

     

     

    typedef 枚举

      //! 禁用过滤器。 如果该筛选器与数据包匹配、则不执行任何操作

      TCAN4x5x_SID_SFEC_DISABLED        = 0x0、

     

      //! 如果滤波器与传入消息匹配、则将其存储在 RX FIFO 0中

      TCAN4x5x_SID_SFEC_STORERX0        = 0x1、

     

      //! 如果滤波器与传入消息匹配、则将其存储在 RX FIFO 1中

      TCAN4x5x_SID_SFEC_STORERX1        = 0x2、

     

      //! 如果筛选器与传入消息匹配、则拒绝数据包(不要存储、不通知 MCU)

      TCAN4x5x_SID_SFEC_REJECTMATCH    = 0x3、

     

      //! 存储在默认位置、但如果筛选器与传入消息匹配、则设置高优先级消息中断

      TCAN4x5x_SID_SFEC_PRIORITY        = 0x4、

     

      //! 如果滤波器与传入的消息匹配、则将其存储在 RX FIFO 0中并设置高优先级消息中断

      TCAN4x5x_SID_SFEC_PRIORITYSTORERX0 = 0x5、

     

      //! 如果滤波器与传入的消息匹配、则将其存储在 RX FIFO 1中并设置高优先级消息中断

      TCAN4x5x_SID_SFEC_PRIORITYSTORERX1 = 0x6、

     

      //! 如果滤波器与传入消息匹配、则将其存储在 RX 缓冲器中进行调试。 如果选择了 SFT、则忽略它。

      TCAN4x5x_SID_SFEC_STORERXBUFORDEBUG = 0x7

    } TCAN4x5x_SID_SFEC_VALUES;

     

    typedef 枚举

      //! 禁用过滤器。 此滤波器不匹配

      TCAN4x5x_SID_SFT_DISABLED          = 0x3、

     

      //! 经典滤波器、其中 SFID1用作要匹配的 ID、SFID2用作适用于 SFID1的位掩码

      TCAN4x5x_SID_SFT_Classic          = 0x2、

     

      //! 双 ID 滤波器、其中 SFID1和 SFID2都保存了可以匹配的 ID (必须完全匹配)

      TCAN4x5x_SID_SFT_DUALID            = 0x1、

     

      //! 距离滤波器。 SFID1保存起始地址、SFID2保存结束地址。 之间的任何地址都将匹配

      TCAN4x5x_SID_SFT_RANGE            = 0x0

    } TCAN4x5x_SID_SFT_VALUES;

     

    您应该能够使用新值简单地修改 TCAN4x5x_MCAN_SID_Filter 元素。 这是在 main.c 文件中的演示代码中编写的代码:

          /* Setup (设置)过滤器,此过滤器将把 ID 为0x055的任何邮件标记为优先级信息*/

          TCAN4x5x_MCAN_SID_Filter SID_ID ={0};

          SID_ID.SFT = TCAN4x5x_SID_SFT_Classic;                                  // SFT:标准滤波器类型。 配置为经典滤波器

          SID_ID.SFEC = TCAN4x5x_SID_SFEC_PRIORITYSTORERX0;                 //标准滤波器元件配置,将其作为优先级消息存储在 RX FIFO 0中

          SID_ID.SFID1 = 0x055;                                                               // SFID1 (经典模式滤波器)

          SID_ID.SFID2 = 0x7FF;                                                               // SFID2 (经典模式掩码)

          TCAN4x5x_MCAN_WriteSIDFilter (0、&SID_ID);                               //写入 MRAM

    您应该能够按照所需设置进行如下修改:

          /*设置过滤器,此过滤器将把 ID 为0x6A8或0x6A9的任何邮件标记为优先级信息*/

          TCAN4x5x_MCAN_SID_Filter SID_ID ={0};

          SID_ID.SFT = TCAN4x5x_SID_SFT_RANGE;                                    // SFT:范围滤波器类型。 配置为距离滤波器

          SID_ID.SFEC = TCAN4x5x_SID_SFEC_PRIORITYSTORERX0;                 //标准滤波器元件配置,将其作为优先级消息存储在 RX FIFO 0中

          SID_ID.SFID1 = 0xA68;                                                               // SFID1 (范围滤波器起始 ID)

          SID_ID.SFID2 = 0xA69;                                                               // SFID2 (范围滤波器结束 ID)

          TCAN4x5x_MCAN_WriteSIDFilter (0、&SID_ID);                               //写入 MRAM

     

    代码将配置 SID 过滤器元素,作为以下函数的一部分:

     

    TCAN4x5x_MRAM_Configure (TCAN4x5x_MRAM_Config * MRAMConfig)

    我希望这是清楚和有益的。 如果您仍有疑问、请告诉我。

    此致、

    Jonathan

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

    您好、Jonathan、

    感谢您的详细解释。

    我尝试了你的建议、我认为我已经检查了三次了、但它没有达到预期的效果。

    我的过滤器设置为:

    /*配置默认 CAN 数据包过滤设置*/
    TCAN4x5x_MCAN_Global_Filter_Configuration GFC ={0};
    GFC.RRFE = 1;//拒绝远程帧(TCAN4x5x 不支持此功能)
    GFC.RRFS = 1;//拒绝远程帧(TCAN4x5x 不支持此功能)
    GFC.ANFE = TCAN4x5x_GFC_Accept_Int_RXFIFO0;//如果传入消息与过滤器不匹配、则默认行为是接受到 RXFIO0以接收扩展 ID 消息(29位 ID)
    GFC.ANFS = TCAN4x5x_GFC_Accept_Int_RXFIFO0;//如果传入的消息与过滤器不匹配、则默认行为是接受到 RXFIO0以接收标准 ID 消息(11位 ID)

    TCAN4x5x_MCAN_SID_Filter SID_ID ={0};
    SID_ID.SFT = TCAN4x5x_SID_SFT_RANGE;// SFT:标准滤波器类型。 配置为经典滤波器
    SID_ID.SFEC = TCAN4x5x_SID_SFEC_PRIORITYSTORERX0;//标准滤波器元件配置,将其作为优先级消息存储在 RX FIFO 0中
    SID_ID.SFID1 = 0x6A8;// SFID1 (经典模式滤波器)
    SID_ID.SFID2 = 0x6A9;// SFID2 (经典模式掩码)
    TCAN4x5x_MCAN_WriteSIDFilter (0、&SID_ID);//写入 MRAM

    TCAN4x5x_MCAN_EnableProtectedRegisters ();//首先使受保护的寄存器可访问
    TCAN4x5x_MCAN_ConfigureCCCRRegister (&cccrConfig);//启用 FD 模式和位速率切换
    TCAN4x5x_MCAN_ConfigureGlobalFilter (&GFC);//配置全局过滤器配置(默认 CAN 消息行为)
    TCAN4x5x_MCAN_ConfigureNominalTiming_Simple (&TCANNomTiming);//设置标称/仲裁位时序
    TCAN4x5x_MCAN_ConfigureDataTiming_Simple (&TCANDataTiming);//设置 CAN FD 时序
    TCAN4x5x_MRAM_CLEAR ();//清除所有 MRAM (向所有 MRAM 写入0)
    TCAN4x5x_MRAM_Configure (&MRAMConfiguration);//设置与 MRAM 配置相关的适用寄存器
    TCAN4x5x_MCAN_DisableProtectedRegisters ();//禁用受保护的写入并使器件退出初始化模式

    在第一个阶段、我认为我没有设置正确的内容、但随后我转到调试器并开始观察寄存器。

    我正在寻找您建议的 SID 元素:

    这将使最终 SID 滤波器元素= 0x2EA806A9

    这是调试器的图片。

    您可以看到一切都是正确的。

    但是、当我开始观察系统和消息时、系统会在收到不需要的消息时跳转至中断、请查看图片。

    RXMsgHeader.ID = PDR (PDR = 0x6A8)  

    RXMsgHeader.ID = 0x560 (不需要的消息)

    我不知道我到底是怎么做的、您是否有线索?  

    此致。

    塞巴斯蒂扬

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

    您好、Sebastijan、

    我认为全局滤波器配置地址0x1080中的 ANFS[1:0]和 ANFE[1:0]位字段可能设置错误。  默认情况下、它们设置为2'b00、这意味着它们将接受任何与滤波器不匹配的消息帧、并将它们放置到 RX FIFO 0中。  如果在接受所有不匹配的帧并将其存储到 RX FIFO 0中的同时接受一条经过过滤的报文、并将其存储到 RX FIFO 0中、那么您仍将接收每条报文并为每条报文获得一个中断。

    您可以将这些位字段更改为2'B10或2'B11、这将拒绝与过滤器不匹配的任何消息帧。  或者、您也可以对其进行设置、使过滤的消息进入一个存储位置、例如 RX FIFO 0或 RX 缓冲区、这可以被视为高优先级消息、并且任何不匹配的消息都可以定向到不同的位置、例如 RX FIFO 1。  

    尝试检查 GFC 寄存器、确保 ANFS 和 ANFE 设置为"拒绝"不匹配的消息、然后重试您的测试。  

    此致、

    Jonathan

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

    您好、Jonathan、

    非常感谢您的回答。 它帮助很大、但我必须添加少量更改。

    我根据您的建议设置寄存器:

    GFC.ANFE = TCAN4x5x_GFC_reject;
    GFC.ANFS = TCAN4x5x_GFC_reject;

    但在该设置中也出现了问题:

    MRAMConfiguration.SIDNumElements = 2;
    MRAMConfiguration.XIDNumElements = 0;

    我必须将这个 XIDNumElements 从零更改为1、如果它被设置为零、则过滤无效。

    MRAMConfiguration.SIDNumElements = 2;
    MRAMConfiguration.XIDNumElements = 1;

    结果令人惊叹、它的速度有多快。

     

    正如您在图片上看到的、没有像以前那样的差距。 现在、我甚至可以将 FIFO 增加到5个单元、它不会影响速度。

    现在我有最后一个问题。

    系统将随开发而发展、当然、新的东西将通过 CAN 发送。 现在只能接受两条消息、并且设置了过滤器、它允许 在 SFID1和 SFID2之间发送消息。 如果我要设置具有5个或10个具有完全不同 ID 的元素的筛选器、如何正确设置它?

    很抱歉、有很多问题、但产品明年将大规模生产、必须正常工作:)

    此致

    SEBA

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

    您好、Sebastijan、

    我很高兴您在 XID 元素设置方面取得了一些良好的进展和良好的捕捉。  由于您只询问了11位 ID、我只关注 SID、但 SID 和 XID 滤波器的概念是相同的。

    对于其他筛选器、您有一些选项可供您使用、具体取决于您需要多少个筛选器以及您想要筛选的 ID。  TCAN4550使用由博世开发的 M_CAN FD 控制器、您可以在博世网站上找到 M_CAN 用户手册、其中更详细地介绍了 M_CAN 功能。  TCAN4550包含寄存器映射和最相关的信息、但完全复制博世已记录的信息是不切实际的、并且应将 M_CAN 用户手册用作 TCAN4550数据表的补充。  您可以在以下链接中找到它。  第2.4.5和2.4.6节讨论了滤波器元件。

    https://www.bosch-semiconductors.com/media/ip_modules/pdf_2/m_can/mcan_users_manual_v330.pdf

    您可以拥有多达128个 SID 过滤器元素和64个 XID 过滤器元素,并且您可以始终创建尽可能多的过滤器,以容纳您需要过滤的所有 ID。  收到消息后、器件将开始使用存储在存储器中的第一个滤波器评估消息、然后继续执行列表中的所有滤波器、直到其中一个滤波器匹配、或者没有 mare 滤波器。  如果其中一个筛选条件匹配、则设备将根据筛选条件设置存储或拒绝消息。  如果没有匹配的滤波器、器件将根据我们之前讨论过的 GFC 非匹配帧设置来存储或拒绝消息。

    您还可以使用三种不同的滤波器类型。  

    从 ID1到 ID2的距离滤波器、其中 ID2 >= ID1

    2. ID1或 ID2的双 ID 滤波器

    3、经典滤波器、其中 ID1 =滤波器、ID2 =掩码。  如果您的邮件具有公共位、例如包含一些公共位但不一定在连续范围内的一系列邮件、这将非常有用。  

    我已经为您建议了一个范围滤波器、因为您有连续的 ID、但我可以使用双 ID 或两个经典滤波器来完成相同的滤波。  当您需要扩展设计时、我建议您评估 ID 以确定最合适的滤波器类型。  您还可以为每个滤波器使用不同的滤波器类型、因此您可以根据需要使用一些 Range、Dual 和 Classic 滤波器。  如果最好组织某些消息的读取并将其优先于其他消息、也可以使用筛选器将消息存储到单独的位置、例如 RX FIFO 0、RX FIFO 1和 RX 缓冲器。  例如、如果您有一些较高优先级的报文、您可以始终将其过滤到 RX FIFO 0中、然后其他较低优先级的报文可以过滤到 RX FIFO1中。  这将使您能够确保当您接收到 RX FIFO 0和1中的新消息时、您的 MCU 可以始终读回 RX FIFO 0中的较高优先级的消息、然后再读回 RX FIFO 1中的较低优先级的消息。  这只是一个可以执行的操作示例。  但是、您可以保持简单、并且只需按照您的操作将所有内容过滤到单个 RX FIFO 中。

    我希望这是清楚的。

    此致、

    Jonathan

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

    您好、Jonathan、

    感谢您的所有帮助!

    此致。

    SEBA

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

    不用客气。  如果您有其他问题、请随时联系我们。  祝您开发顺利!

    此致、

    Jonathan