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 大量数据的接收和发送可能会突然不接收或发送数据。
INIT 引脚无中断
一段时间后、我可以再次发送和接收数据
如何解决该问题
尊敬的梁先生/女士:
这听起来时钟可能会中断、导致在不存在时无法通信。 当使用晶体并且电路未进行优化导致器件在晶体和单端时钟模式之间切换时、可能会发生这种情况。
如果在 OSC1引脚和晶体之间有串联阻尼电阻、请尝试增大该值。 该电阻器将降低流过晶体的电流、降低振荡波形的振幅、从而使电路稳定下来。
如果您没有串联电阻、则可以将晶体每侧两个负载电容器的值增加2-4pF。 增加的电容器的电抗与晶体的 ESR 形成了一个更大的分压器、可降低振荡波形的振幅并使电路稳定下来。
请查看 TCAN455x 时钟优化和设计指南 应用手册(链接)以了解更多信息。
尝试增加电阻或电容、然后重新测试。
此致、
Jonathan
你(Jonathan)好
感谢您的建议,
现在、我正在尝试将 RXfifo 增加到64 英寸 MRAMConfiguration。 Rx0NumElements = 64;"
感觉这种现象减少
两者之间是否存在任何连接
Jonathan
尊敬的梁先生/女士:
我仍然不知道你的观察是否与时钟中断有关。 但是、从晶体到单端模式更改的时钟中断将完全独立于任何寄存器配置以及 RX FIFO 中已启用的元素数量。 时钟中断将与 CAN 数据异步。 提高 CAN 消息的频率可能使 CAN 消息与时钟中断同时出现的可能性更大、但这不取决于 RX FIFO 大小。
您如何监控系统和通信? 您是否能够监控各种器件寄存器(如状态、中断、错误计数器和协议状态寄存器)以及 RX FIFO 状态、以跟踪获取/放置索引和 RX 填充级别?
此致、
Jonathan
你(Jonathan)好
我使用了逻辑分析仪来获取 SPI 和 INIT 引脚的工作状态、如图所示
同时我打开了这些中断、但是当发生异常时、它们不会触发
//! @简短的 IR [22] ELO:错误记录溢出
uint8_t ELO:1;
//! @Brief IR [23] EP:已更改 ERROR_PASSIVE 状态
uint8_t EP:1;
//! @简要 IR [24] EW:已更改 ERROR_WARNING 状态
uint8_t Ew:1;
在发生异常期间、我在总线上没有看到任何中断、但没有为 RX0FIFO 满打开 REG
尊敬的梁先生/女士:
您使用晶体作为时钟源吗? 如果是、请尝试我最初的建议、即增大 OSC1和晶振之间串联电阻的值、或者如果串联电阻已在电路中遗漏、则增大 OSC1和 OSC2引脚上电容的电容值。 完成此操作后、查看中断是否仍可观察到。
此致、
Jonathan
你(Jonathan)好
感谢您的答复
我会根据您的建议修改电路、保持联系
尊敬的梁先生/女士:
谢谢、我会等待您的结果。
此致、
Jonathan
你(Jonathan)好
我按照您的建议对电路进行了修改
我用15pF 替换了12pf 电容器、问题仍然存在。
在我增加 rxfifo 后需要注意的一点是 、当我无法接收 CAN 数据时、我可以将数据发送到 CAN
接收中断处理是否需要任何特殊操作
以下是电路设计中的接收中断处理代码和硬件晶体部分
尊敬的梁先生/女士:
感谢使用更大的电容测试时钟配置。 电容过小一直是出现通信问题的常见原因。
只要 MRAM 分配没有问题(例如不同类型的缓冲元件之间的存储器空间重叠)、发送和接收 CAN 消息的能力就应该是独立的。 但是、假设存储器中的 RX 和 TX 缓冲区元素没有重叠、那么增加或减少 RX FIFO 长度应该对 TX 操作没有影响。
在查看中断代码时、您似乎只对处理基于"387" Universal_Min_和"387" Universal_Max_变量以及几个特定 ID 的特定范围的 CAN 消息 ID 感兴趣。 是这样吗?
如果是这样、这样效率很低、TCAN4550可以自行过滤这些消息、防止它们存储在 RX FIFO 中。 这将消除对 MCU 的中断、以处理它不关心的消息。 这还可以防止无用消息填满 RX FIFO、并避免可能阻止存储您所关心的新消息。 请考虑为您关心的消息 ID 创建一些 SID 和 XID 消息过滤器。
这可能是 RX FIFO 已满、它会阻止您接收新消息、直到它们最终被清除并且 RX FIFO 中有额外的空间。
您是否能够在中断期间监控和记录 RX FIFO 填充级别、以查看其是否已满?
如果您尚未阅读以下文档、我建议您查看它们以了解可能对您有所帮助的其他信息。 请考虑为您关心的消息 ID 创建一些 SID 和 XID 消息过滤器。 有关如何执行该操作的其他信息、请参阅以下文档。
TCAN45xx 软件用户指南 (链接)
MCAN 用户手册 (链接)
此致、
Jonathan
你(Jonathan)好
我尝试了一些新的东西 ,我每5毫秒在系统中读取一次中断(地址= h0820)寄存器
在正常操作中、结果如下、820寄存器的值为0x000084e0
当该位不能被接收时、该位820寄存器的值是000084ea
我查阅了手册、并且调试器计算出的位 SPIERR 和 M_CAN_INT 设置为1
如图所示、当 dev_ir_t 时、我查询寄存器0x000c SPIERR = 0x01
接收结果 SPI_ERROR_INTERRUPT = 0x01 Internal_access_active = 0x01 Write_fifo_available = 0x01
似乎 TCAN4550的 SPI 写入数据溢出
以下是我的调试步骤和结果。 如果您有任何问题、请继续沟通并期待您的回复
尊敬的梁先生/女士:
这更多地证明时钟不良。 SPI 接口使用 FIFO 来处理 SPI 时钟频率与由 OSC1和 OSC2引脚提供的数字内核使用的时钟频率之间的频率转换。 如果在 SPI 数据进入 FIFO 时 OSC 时钟以任何方式停止或中断、则数字内核不会将数据从 FIFO 中拉出(由于缺少时钟)、并且 FIFO 将溢出、从而生成 SPI 错误。
这种情况的最常见原因是 OSC2波形上的振幅过大、导致器件切换到单端时钟模式、因为它将此波形的低电平视为"接地"引脚。 正如我之前提到的、增加电容应该会降低振幅、并防止时钟模式切换。
您曾说过将电容增加到了15pF、但可能您需要增大电容。 您是否能够尝试继续增加电容值并重新测试是否能够找到稳定的电平?
您是否可以访问电路板上的 GPIO1引脚、或者它是否未被使用?
此致、
Jonathan
你(Jonathan)好
感谢您的答复。 我们没有使用 GPIO1 。我们将它引入到了 MCU 中。 我需要对它执行什么操作吗? 那么、为什么在异常时我可以发送它
尊敬的梁先生/女士:
我很好奇是否可以通过示波器进行监控、因为如果可以、我们可以使用该示波器通过器件测试模式检测时钟中断。 在测试期间、您的电路板是否允许您在 GPIO1引脚上放置一个示波器探针?
此致、
Jonathan
你(Jonathan)好
我可以使用 MCU 或逻辑分析仪对其进行监控。 请指导我如何监控它、我的另一个问题是为什么它可以发送但不接收
尊敬的梁先生/女士:
我将通过电子邮件向您发送一些有关如何监控 GPIO1引脚的信息。
另一个问题是可以发送但不能接收的原因
假设这是时钟中断问题、器件只能在时钟工作时发送消息、因此它们几乎总是看起来发送正常。 如果时钟在 CAN 消息传输过程中停止并且其他节点检测到不完整或无效的消息帧、则可能会产生传输错误。 但是、当器件具有工作时钟时、更有可能成功完成消息传输。
但是、由于接收消息与本地时钟无关、因此它检测错误的几率更高、因为消息可能会在时钟停止工作时到达。
您是否还可以共享您的完整 MRAM 配置、以便我们验证它在您的元素之间没有重叠的段。 MRAM 只有2KB、如果超出此空间、它将自动回绕并可覆盖其它元素、这些元素有时会产生一些意外错误。
此致、
Jonathan
Jonathan、您好!
这就是支持延锋的 FAE Iris。 梁杰是延锋的客户、我在此跟进此问题。
1.能否详细介绍一下如何通过 GPIO1来监控时钟? 梁表示他们没有收到您的电子邮件。
我们有以下问题:
1.我们是否有一个汇总表、了解 nINT 何时为低电平有效? 我仅在数据表中找到"该引脚是寄存器16'h 0820和16'h0824中所有故障的逻辑或。" 当 nINT 为低电平时、以下寄存器是否包含所有可能的中断请求?
2.如果 h1050存储器中存在中断位、它是否将 nINT 设置为低电平?
当0820寄存器位 SPIERR 为1时、是否可以从 RX FIFO 中读取数据?
4.是否有方法可以清除 SPIERR 中断标志?
谢谢。
Iris、
因为今天和明天都是美国的假日、所以我们预计到下周才能收到答复。 感谢您的耐心。
此致、
Eric Hackett
大家好、Iris、
1. 您能否分享有关如何通过 GPIO1监控时钟的详细信息? 梁表示他们没有收到您的电子邮件。
我已经通过电子邮件向您发送了信息、因此请将其告知 Liang。
1. 我们是否有一个汇总表、说明 nINT 何时为低电平有效? 我仅在数据表中找到"该引脚是寄存器16'h 0820和16'h0824中所有故障的逻辑或。" 当 nINT 为低电平时、以下寄存器是否包含所有可能的中断请求?[/QUOT]是的、nINT 引脚将反映在寄存器0x0820和0x0824中设置的、但未被"屏蔽"导致该位设置 nINT 引脚的任何中断位。 某些中断位无法被屏蔽、并且将始终反映在 nINT 引脚上。
器件的非 CAN 相关中断反映在寄存器0x0820中、并通过设置中断启用寄存器0x0830中的相应位来屏蔽或启用。 "1"使该位能够反映在 nINT 引脚上、"0"则屏蔽或禁止将该位反映在 nINT 引脚上。
与 CAN 相关的中断反映在寄存器0x0824和0x1050中。 请注意、寄存器0x0824只是寄存器0x1050的只读副本、该寄存器是主 CAN 中断寄存器、可用于通过写操作清除中断。 另请注意、所有 CAN 相关寄存器都位于0x10xx 的寄存器地址域中、所有其他器件相关寄存器都位于0x08xx 的寄存器地址空间中。 但是、通过放置 CAN 中断的只读寄存器、MCU 可以在单个2字 SPI 读取中读取器件和 CAN 中断、因为寄存器0x0820和0x0824彼此连续。
默认情况下、所有与 CAN 相关的中断位均被禁用、您需要通过中断启用寄存器0x1054启用它们。
您还需要选择使用 CAN 中断线。 请注意、有两条可用的中断线路(0和1)、可选择性地与 GPIO1和 GPO2引脚一起使用、以允许 MCU 更好地处理中断或确定中断优先级。 默认情况下、所有中断都分配给行0、但您可以在中断线选择寄存器0x1058中配置此选择。 请注意、如果在寄存器0x0820中启用了 CANINT 位、则这对 nINT 引脚是否反映这些中断没有影响、因为 nINT 是全局中断引脚。
最后一步、如果要启用将任何 CAN 中断反映在 nINT、GPIO1或 GPO2引脚上、则需要启用已选择在中断上使用的 CAN 中断线。 这在中断线路使能寄存器0x105C 中完成。 默认情况下、两条 CAN 中断线路都被禁用、因此您需要启用这两条线路中的一条或两条线路才能查看反映在 nINT 引脚上的任何 CAN 中断。
[报价 userid="496606" url="~/support/interface-group/interface/f/interface-forum/1370241/tcan4550-q1-tcan4550-data-sending-and-receiving-exception/5287289 #5287289"]当0820寄存器位 SPIERR 为1时、是否可以从 RX FIFO 中读取数据?
4.是否有方法可以清除 SPIERR 中断标志?
[报价]当在 SPI 读取或写入事务中检测到某种形式的协议错误时、SPIERR 位设置为1。 在片选线路为低电平时、器件将对 SPI 时钟周期数进行计数、以确保精确地是32的倍数。 如果不匹配、则可能出现过少或过大的时钟周期和采样位、这意味着数据不可靠。
如果在写入事务期间发生错误、则器件会忽略写入数据、并且寄存器或存储器值会保留之前的值、因为假设数据无效。
如果在读取事务期间发生错误、则器件已经将数据返回给 MCU、但由于该错误、MCU 可能需要重新读取数据以验证其准确性、因为检测到 SPI 错误。
由于 SPI 事务中的32位字过多或过少、并且与 SPI 标头的 Length 字段不匹配、因此也可能发生 SPI 错误。 状态寄存器0x000C 可以提供与哪些因素导致 SPIERR 位被置位有关的附加信息。 要清除 SPIERR、您需要清除寄存器0x000C 中已设置的位。
如果噪声导致要检测额外的时钟边沿、则只需清除错误位并重新读取寄存器即可。 但是、如果 SPIERR 位持续置位、则可能有较大的协议错误需要解决。
此致、
Jonathan