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 数据。 但存在一个问题。 当接收 器获得数据时、它应该立即发回 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 的解释完全 错误、我的意思是 将消息广播 回发送器。 很抱歉造成误解。 正如您所建议的、我还认为这是一个与固件相关的问题。 您是否有一些技巧、如何缩短此时间? 可能使用滤波器吗?
您好、Sebastijan、
我认为 ACK 消息是您的意思、看起来您的系统通常正常工作。 响应延迟可能有一些改进空间、但遗憾的是、这是 TCAN4550中由于 SPI 接口而难以管理的少数几个领域之一。
由于我对您的系统要求和架构没有任何具体的详细信息、因此我只能用一般性的术语来说明。 但以下是需要考虑的一些想法:
我希望这能为您提供一些关于如何优化系统以更快响应的想法。
此致、
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