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:在接收 CAN 消息时、MCAN_INTERRUPT (h1050) RFON 位和器件中断(h0820) M_CAN_INT 位未设置。

Guru**** 2463330 points
Other Parts Discussed in Thread: TCAN4550, TCAN4550EVM

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1474073/tcan4550-mcan_interrupt-h1050-rfon-bit-and-device-interrupt-h0820-m_can_int-bit-not-set-when-receiving-can-msg

器件型号:TCAN4550

工具与软件:

您好!

我正在使用 i.MX8MM 目标板上的 QNX800/QNX710 TCAN4550驱动器。 目标板有 uboot、可使用 uboot 加载 Linux 和 QNX IFS。

nINT 引脚连接到 GPIO 线路。

执行了以下测试。

1.将 CAN 消息从 Komodo 发送到目标板。

2.在目标板上、每1000ms 打印一次 TCAN4550寄存器。

当我先加载 Linux、然后立即执行关断时、目标板返回到 uboot、然后使用 uboot 加载 QNX800 IFS、执行上述测试、我可以在接收 CAN msg 时看到 RFON 和 M_CAN_INT 位均已设置。

如果我对目标板进行下电上电(关闭电源并再次打开)、然后使用 uboot 加载 QNX800 IFS、执行上述测试、这2个位绝不会在接收 CAN 消息时被设置。

如果我对目标板执行下电上电、然后使用 uboot 加载 QNX710、执行上述测试、我在接收 CAN 消息时可以看到 RFON 和 M_CAN_INT 两个位置位。

所有引脚多路复用均设置相同。 在这两种情况下、我都在 nINT/GPIO 引脚上收到中断。

调节器打印输出


#define TCAN4550_REVISION (0x008)
#define TCAN4550_STATUS (0x00C)
#define TCAN4550_MODE_CONFIG (0x800)
#define TCAN4550_CONTROL (0x1018)
#define TCAN4550_DEVICE_INTERRUPT (0x820)
#define TCAN4550_INTERRUPT_LINE_ENABLE (0x105c)
#define TCAN4550_DEVICE_INTERRUPT_ENABLE (0x830)
#define TCAN4550_MCAN_INTERRUPT (0x1050)
#define TCAN4550_MCAN_INTERRUPT_ENABLE (0x1054)
#define TCAN4550_PROTOCOL_STATUS (0x1044)
#define TCAN4550_RXFIFO0_CONFIG (0x10a0)
#define TCAN4550_RXFIFO0_STATUS (0x10a4)
#define TCAN4550_ERRCNT (0x1040)
#define TCAN4550_TIMESTAMP_CONFIG (0x1020)
#define TCAN4550_TIMESTAMP_CV (0x1024)

(二 配置 TCAN4550后
TCAN4550_NAME = 0x4E414354
TCAN4550_REVISION = 0x00110201
TCAN4550_STATUS = 0x00000008
TCAN4550_MODE_CONFIG = 0x080000A0
TCAN4550_CONTROL = 0x00000000
TCAN4550_DEVICE_INTERRUPT = 0x000004A0
TCAN4550_INTERRUPT_LINE_ENABLE = 0x00000001
TCAN4550_MCAN_INTERRUPT = 0x00010000
TCAN4550_DEVICE_INTERRUPT_ENABLE = 0x809628FF
TCAN4550_MCAN_INTERRUPT_ENABLE = 0x1B860203
TCAN4550_TXFIFO_STATUS = 0x00000000
TCAN4550_RXFIFO0_CONFIG = 0x10200380
TCAN4550_RXFIFO0_STATUS = 0x00000000
TCAN4550_PROTOCOL_STATUS = 0x0000070F
TCAN4550_ERRCNT = 0x00000000
TCAN4550_TIMESTAMP_CV = 0x0000530E
TCAN4550_TIMESTAMP_CONFIG = 0x00000002

**** 很好的例子、当收到 CAN Msg 时
TCAN4550_NAME = 0x4E414354
TCAN4550_REVISION = 0x00110201
TCAN4550_STATUS = 0x00000008
TCAN4550_MODE_CONFIG = 0x080000A0
TCAN4550_CONTROL = 0x00000000
TCAN4550_DEVICE_INTERRUPT = 0x000004A2
TCAN4550_INTERRUPT_LINE_ENABLE = 0x00000001
TCAN4550_MCAN_INTERRUPT = 0x00010001
TCAN4550_DEVICE_INTERRUPT_ENABLE = 0x809628FF
TCAN4550_MCAN_INTERRUPT_ENABLE = 0x1B860203
TCAN4550_TXFIFO_STATUS = 0x00000000
TCAN4550_RXFIFO0_CONFIG = 0x10200380
TCAN4550_RXFIFO0_STATUS = 0x00010001
TCAN4550_PROTOCOL_STATUS = 0x0000070F
TCAN4550_ERRCNT = 0x00000000
TCAN4550_TIMESTAMP_CV = 0x0000CA64
TCAN4550_TIMESTAMP_CONFIG = 0x00000002

_________ 糟糕的情况、当收到 CAN Msg 时
TCAN4550_NAME = 0x4E414354
TCAN4550_REVISION = 0x00110201
TCAN4550_STATUS = 0x00000008
TCAN4550_MODE_CONFIG = 0x080000A0
TCAN4550_CONTROL = 0x00000000
TCAN4550_DEVICE_INTERRUPT = 0x000004A0
TCAN4550_INTERRUPT_LINE_ENABLE = 0x00000001
TCAN4550_MCAN_INTERRUPT = 0x00010000
TCAN4550_DEVICE_INTERRUPT_ENABLE = 0x809628FF
TCAN4550_MCAN_INTERRUPT_ENABLE = 0x1B860203
TCAN4550_TXFIFO_STATUS = 0x00000000
TCAN4550_RXFIFO0_CONFIG = 0x10200380
TCAN4550_RXFIFO0_STATUS = 0x00000000
TCAN4550_PROTOCOL_STATUS = 0x00000708
TCAN4550_ERRCNT = 0x00000000
TCAN4550_TIMESTAMP_CV = 0x0000E800
TCAN4550_TIMESTAMP_CONFIG = 0x00000002

我想知道可能会出什么问题?

谢谢!
邱中卫
QNX

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

    您好、Zhongwei、

    感谢您为用例提供了寄存器数据值、这确实很有用。  请注意、MCAN 可以使用2条中断线将中断位分为不同的中断引脚。  默认情况下、所有中断位都分配给中断线选择寄存器0x1058中的中断线0。  但是、默认情况下、两条 MCAN 中断线路都被禁用、您需要在中断线启用寄存器0x105C 中启用它们、以使其显示为"MCAN 中断"、并反映在 nINT 引脚上。

    还请监控和验证寄存器0x1058和0x105C 的值、以确保两个测试用例都完全启用中断。

    我注意到、在您的"坏情况"中、TCAN4550_RXFIFO0_STATUS = 0x00000000。  在这种情况下、您确定收到了消息吗?  如果器件没有在 RX FIFO 中接收到消息、那么它不会设置 RF0N 中断位、并且您的问题可能不是中断问题。

    此致、

    Jonathan

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

    Jonathan、您好!

    感谢您的答复。  我验证了0x1058 reg 为0x0、0x105c reg 为0x01。   

    在好和坏的情况下、接收 CAN 消息时、我可以确认已触发 nINT/GPIO 中断。 我在中断处理程序中打印出寄存器值。  在坏的情况下、  TCAN4550_RXFIFO0_STATUS 为0x00、 MCAN_INTERRUPT (h1050) RFON 位和器件中断(h0820) M_CAN_INT 位未设置。

    此致、

    中卫

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

    您好、Zhongwei、

    根据您提供的信息、我不知道 RX FIFO 状态寄存器没有报告新消息的原因是什么。  您是否在使用任何筛选器?  

    您能否在两种情况下打印所有器件寄存器的寄存器值、以便我们验证所有寄存器在两种情况下都设置相同、并查看是否存在可能的错误?

    此致、

    Jonathan

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

    您好、Zhongwei、

    感谢您提供注册信息。 我已经查看了配置、但没有看到任何看起来明显的错误会导致此问题的内容。

    我看到设备配置为拒绝所有与 SID 或 XID 过滤器元素之一不匹配的不匹配帧。  我还看到您已经配置了32个 SID 过滤器元素和32个 XID 过滤器元素。  您是否实际上在使用所有这些滤波器元素?  您应该只为实际使用的确切数量的过滤器元素分配内存。  如果分配的内存超过元素数量、则可能会导致错误。

    当接收到一个消息时、器件将开始把消息 ID 与 SID 和 XID 过滤器元素相比较、这两个元素从存储器中的第一个元素开始。  如果它未通过此筛选器、则会检查下一个筛选器元素、并且该过程会重复进行、直到消息通过了一个筛选器元素并被存储、或者没有更多的筛选器元素、然后根据全局筛选器配置寄存器存储或拒绝该消息(在您的情况下、消息会被拒绝)。  

    如果分配的过滤器元素数量超过实际使用的过滤器元素数量、则设备在尝试将传入消息与为过滤器元素分配的 MRAM 内容进行比较时可能会遇到问题、但其中不包含有效的过滤器。

    我怀疑您可能过度分配了 SID 和 XID 过滤器、因为恰好有32个 SID 和32个 XID 过滤器元素并不常见、所以我现在只是在推测。

    我还看到 MCAN 中断寄存器中设置了位29、这表明器件已尝试访问保留地址、这可能与过滤器元素的 MRAM 分配不正确相关、也可能不相关。

    请确认并调整您的过滤器分配、以获得您正在使用的正确数量的过滤器元素。  此外、请确保您要发送到器件的 CAN 消息将通过其中一个过滤器元素、以便存储它。  如果 CAN 消息未通过过滤器、它将根据您的全局过滤器配置寄存器而被拒绝、这也可能是消息未存储在 RX FIFO 0中的原因。

    此致、

    Jonathan

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

    Jonathan、您好!

    我使用16 SID 和 XID 滤波器进行了测试、仍然存在相同的问题。

    当我执行热重启时、情况不错、不会出现这个问题。 仅当我执行冷重启时、发生了糟糕的情况、我才会看到问题发生。   

    MCAN 中断寄存器的位29是由于 I 打印了一些保留寄存器。

    我想知道您以前是否看到过这种类似的情况、nINT 被触发、但 RX FIFO 寄存器显示没有数据、RFON 和 M_CAN_INT 位未设置?  

    感谢您的支持。

    此致、

    中卫

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

    尊敬的 Zhongwei:

    我还没有看到过在消息成功接收到 RX FIFO 中时 RF0N 尚未设置的情况  0. nINT 引脚只是寄存器0x0820和0x0824中已启用位的逻辑或。

    您能否共享16个 SID 和16个 XID 过滤器元素的内容以及作为测试消息发送的 CAN 消息?

    即使 RF0N 位尚未设置、您是否已经在收到消息后尝试读取 RX FIFO 0缓冲器元素的 MRAM 存储器?  我正在尝试验证是否实际收到该消息、以了解问题是 RF0N 位的设置还是消息本身的接收。  如果消息没有存储到内存缓冲区中、则可以解释为什么没有设置 RF0N 位。

    此致、

    Jonathan

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

    尊敬的 Zhongwei:

    如果您可以看到、数据有效载荷为0x3231的 RX 消息将存储在起始地址为0x81C0的第一个 RX FIFO 0存储器缓冲区元素中(在"正常情况"下)。  但是、在"坏情况"下、MEMORY 元素不包含消息、仍然为零值。  这意味着 RX 报文没有被接收到 RX FIFO 0中、因此它没有置位 RF0N 位。

    [报价用户 id="639861" url="~/support/interface-group/interface/f/interface-forum/1474073/tcan4550-mcan_interrupt-h1050-rfon-bit-and-device-interrupt-h0820-m_can_int-bit-not-set-when-receiving-can-msg "]如果我对目标板执行下电上电(关闭电源并再次打开)、然后使用 uboot 加载 QNX800 IFS、执行上述测试、这2个位在接收 CAN 消息时从未设置。

    在下电上电和 uboot 负载之间等待多长时间?

    您是否能够在示波器上监控和捕获 CAN 总线消息?  最好查看 TCAN4550在良好和不良测试用例中是否确认了该消息。

    此致、

    Jonathan

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

    Jonathan、您好!

    对于电源循环之间的等待时间、我测试了立即电源循环和几个小时之间的良好和不良情况。  没有什么区别。

    我确认良好和不良的情况、我可以使用 Saleae 逻辑 分析仪捕获正确的 CAN 总线消息。   

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

    尊敬的 Zhongwei:

    很抱歉、我不清楚、我的问题是在下电上电后在开始重新配置器件寄存器之前等待了多长时间。  本质上、问题是在 SPI 寄存器配置之前、是否为器件分配了足够的上电时间、以便 LDO 电压稳压器可以稳定、晶体可以稳定等。  我已经看到一些问题、在 MCU 上电后"立即"尝试配置寄存器、由于器件尚未准备好开始配置、这会导致寄存器配置不完整。

    如果您可以捕获好和坏情况的 SPI 配置顺序、在比较这些日志时、您是否看到有任何差异?  

    此致、

    Jonathan

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

    Jonathan、您好!

    我尝试了其他方法来隔离问题。  我有一个 Raspberry PI 通过 SPI 连接到 TCAN4550EVM 板。  我尝试读取 TCAN4550寄存器0。  我不会得到正确的数据。  您是否看到捕获的数据有任何问题?

    谢谢!

    中卫  

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

    尊敬的 Zhongwei:

    SPI 使能和时钟之间可能存在一些设置/保持时序问题。  需要在使能引脚转换为低电平后至少28ns 出现第一个上升时钟沿。

    在您的图形中、它看起来在第一个上升时钟边沿和使能转换的同时、但没有足够的分辨率来确定这是否成立。  无论如何、使能引脚变为低电平后的第一个时钟沿都是下降时钟沿、根据 TCAN4550的 SPI 要求、这是不正确的、并且可能会导致 MOSI 数据出现错误和对齐错误。 如果为真、则读取的操作码0x41可能读取为0x20、这是不正确的、并解释为什么没有返回数据。

    如果 TCAN4550将这个第一个上升时钟沿解释为有效、那么如果最后一个边沿也被计数、那么也可能有65个上升时钟边沿、而使能信号为低电平。  时钟信号应具有空闲的低电平值、以帮助防止在事务开始和结束时产生额外的时钟边沿。  如果时钟空闲状态需要为高电平、则它应在使能变为低电平之前转换为低电平、然后保持低电平、直到使能转换回高电平。  此时、可以安全地再次将时钟拉至高电平、因为使能信号已结束 SPI 事务。

    MISO 信号还在与使能信号对应的第一个时钟边沿上转换这一事实也可能表明检测到了一个额外的时钟周期、从而导致 MOSI 数据的对齐错误。

    尝试调整 SPI 驱动器以匹配 TCAN4550的使能和时钟要求图。

    此致、

    Jonathan