TCAN4550-Q1: 加载完驱动之后,中断计数一直在增加,直到系统禁用该中断

Part Number: TCAN4550-Q1
Other Parts Discussed in Thread: TCAN4550

我们使用的是NVIDIA Jetson Thor平台,通过SPI拓展CAN,具体电路如下:

image.png

VSUP已经链接到了12V,并将R9电阻取消焊接,

使用的驱动代码是:

m_can - drivers/net/can/m_can - Linux source code (v6.8.12) - Bootlin Elixir Cross Referencer

设备树配置如下:

spi@810c590000 {
                        status = "okay";
                        spi@0 {
                                status = "okay";
                                compatible = "ti,tcan4x5x";
                                reg = <0x0>;
                                #address-cells = <1>;
                                #size-cells = <1>;
                                spi-max-frequency = <10000000>;
                                bosch,mram-cfg = <0x0 0 0 16 0 0 1 1>;
                                clocks = <&tcan4x5x_clk>, <&tcan4x5x_clk>;
                                clock-names = "hclk", "cclk";
                                interrupt-parent = <&gpio_aon>;
                                interrupts = <TEGRA264_AON_GPIO(DD, 4) IRQ_TYPE_LEVEL_LOW>;
                                //device-state-gpios = <&gpio3 21 GPIO_ACTIVE_HIGH>;
                                //device-wake-gpios = <&gpio1 15 GPIO_ACTIVE_HIGH>;
                                reset-gpios = <&gpio_aon TEGRA264_AON_GPIO(DD, 3) GPIO_ACTIVE_HIGH>;
                                controller-data {
                                        nvidia,enable-hw-based-cs;
                                        nvidia,rx-clk-tap-delay = <0x10>;
                                        nvidia,tx-clk-tap-delay = <0x0>;
                                };
                        };

加载驱动之后的日志如下:

[  109.198684] irq: IRQ398: trimming hierarchy from :bus@0:pmc@c800000
[  109.201510] tcan4x5x spi0.0: Detected TCAN device version generic
[  109.201669] tcan4x5x spi0.0: ----plink----tcan4x5x_clear_interrupts ----
[  109.203484] tcan4x5x spi0.0: ----plink----tcan4x5x_clear_interrupts ----
[  109.204219] tcan4x5x spi0.0: m_can device registered (irq=398, version=32)
[  109.204225] tcan4x5x spi0.0 can4: TCAN4X5X successfully initialized.

 

操作如下:

nvidia@tegra-ubuntu:~$ sudo modprobe can
[sudo] password for nvidia:
nvidia@tegra-ubuntu:~$ sudo modprobe can-raw
nvidia@tegra-ubuntu:~$ sudo insmod m_can.ko
nvidia@tegra-ubuntu:~$ sudo insmod tcan4x5x.ko
nvidia@tegra-ubuntu:~$ sudo ip link set can4 type can bitrate 500000
nvidia@tegra-ubuntu:~$ sudo ip link set up can4
nvidia@tegra-ubuntu:~$ sudo ip link set down can4

 

当通过IP link打开can总线之后,dmesg日志会一直输出下述内容:

[  155.365846] ----plink---- m_can_open ----
[  155.383143] tcan4x5x spi0.0: ----plink----tcan4x5x_clear_interrupts ----
[  157.480670] tcan4x5x spi0.0: ECR=0x00000000 (TEC=0, REC=0)
[  157.480683] ----plink---- m_can_isr ----
[  157.480687] tcan4x5x spi0.0: ----plink---- m_can_interrupt_handler ----
[  157.480787] tcan4x5x spi0.0: ----plink----tcan4x5x_clear_interrupts ----
[  157.481023] tcan4x5x spi0.0: ISR triggered: IR=0x00000000 PSR=0x0000070f

[  159.578596] tcan4x5x spi0.0: ECR=0x00000000 (TEC=0, REC=0)
[  159.578608] ----plink---- m_can_isr ----
[  159.578612] tcan4x5x spi0.0: ----plink---- m_can_interrupt_handler ----
[  159.578721] tcan4x5x spi0.0: ----plink----tcan4x5x_clear_interrupts ----
[  159.578965] tcan4x5x spi0.0: ISR triggered: IR=0x00000000 PSR=0x0000070f

[  161.675261] tcan4x5x spi0.0: ECR=0x00000000 (TEC=0, REC=0)
[  161.675273] ----plink---- m_can_isr ----
[  161.675276] tcan4x5x spi0.0: ----plink---- m_can_interrupt_handler ----
[  161.675707] tcan4x5x spi0.0: ----plink----tcan4x5x_clear_interrupts ----
[  161.676621] tcan4x5x spi0.0: ISR triggered: IR=0x00000000 PSR=0x0000070f

[  163.773759] tcan4x5x spi0.0: ECR=0x00000000 (TEC=0, REC=0)
[  163.773780] ----plink---- m_can_isr ----
[  163.773787] tcan4x5x spi0.0: ----plink---- m_can_interrupt_handler ----
[  163.774490] tcan4x5x spi0.0: ----plink----tcan4x5x_clear_interrupts ----
[  163.775033] tcan4x5x spi0.0: ISR triggered: IR=0x00000000 PSR=0x0000070f
[  165.870509] tcan4x5x spi0.0: ECR=0x00000000 (TEC=0, REC=0)
[  165.870534] ----plink---- m_can_isr ----
[  165.870541] tcan4x5x spi0.0: ----plink---- m_can_interrupt_handler ----
[  165.871268] tcan4x5x spi0.0: ----plink----tcan4x5x_clear_interrupts ----
[  165.871837] tcan4x5x spi0.0: ISR triggered: IR=0x00000000 PSR=0x0000070f

 

同时中断计数会一直增加,直到关闭CAN总线

现象如下:

nvidia@tegra-ubuntu:~$ sudo ip link set up can4
nvidia@tegra-ubuntu:~$ cat /proc/interrupts |grep 398
398:         11          0          0          0          0          0          0          0          0          0          0          0          0          0 cf00000.gpio  22 Level     can4
nvidia@tegra-ubuntu:~$ cat /proc/interrupts |grep 398
398:         11          0          0          0          0          0          0          0          0          0          0          0          0          0 cf00000.gpio  22 Level     can4
nvidia@tegra-ubuntu:~$ cat /proc/interrupts |grep 398
398:         12          0          0          0          0          0          0          0          0          0          0          0          0          0 cf00000.gpio  22 Level     can4
IPI1:     14863      17983      14218      21255      12577      19493      48290      13692      14282      20918      16944      15354      53524      23989       Function call interrupts
nvidia@tegra-ubuntu:~$ cat /proc/interrupts |grep 398
398:         13          0          0          0          0          0          0          0          0          0          0          0          0          0 cf00000.gpio  22 Level     can4
nvidia@tegra-ubuntu:~$ cat /proc/interrupts |grep 398
398:         14          0          0          0          0          0          0          0          0          0          0          0          0          0 cf00000.gpio  22 Level     can4
nvidia@tegra-ubuntu:~$ cat /proc/interrupts |grep 398
398:         15          0          0          0          0          0          0          0          0          0          0          0          0          0 cf00000.gpio  22 Level     can4
nvidia@tegra-ubuntu:~$ cat /proc/interrupts |grep 398
398:         15          0          0          0          0          0          0          0          0          0          0          0          0          0 cf00000.gpio  22 Level     can4
nvidia@tegra-ubuntu:~$ sudo ip link set down can4

 

这个情况会持续到系统自动禁用该中断,并且系统日志输出如下内容:

[ 5620.598322] irq 398: nobody cared (try booting with the "irqpoll" option)
[ 5620.598375] CPU: 0 PID: 0 Comm: swapper/0 Tainted: G           OE      6.8.12-1021-tegra #1
[ 5620.598383] Hardware name: NVIDIA NVIDIA Jetson AGX Thor Developer Kit/Jetson, BIOS 39.2.0-gcid-45755727 06/01/2026
[ 5620.598389] Call trace:
[ 5620.598393]  dump_backtrace+0x90/0xf0
[ 5620.598413]  show_stack+0x18/0x2c
[ 5620.598418]  dump_stack_lvl+0x7c/0x9c
[ 5620.598442]  dump_stack+0x18/0x2c
[ 5620.598449]  __report_bad_irq+0x38/0xe8
[ 5620.598460]  note_interrupt+0x320/0x370
[ 5620.598464]  handle_irq_event+0xa4/0xb8
[ 5620.598486]  handle_level_irq+0xc0/0x1a8
[ 5620.598494]  handle_irq_desc+0x48/0x80
[ 5620.598500]  generic_handle_domain_irq+0x1c/0x30
[ 5620.598508]  tegra186_gpio_irq+0x138/0x280
[ 5620.598525]  handle_irq_desc+0x48/0x80
[ 5620.598530]  generic_handle_domain_irq+0x1c/0x30
[ 5620.598537]  gic_handle_irq+0x4c/0x12c
[ 5620.598543]  call_on_irq_stack+0x30/0x48
[ 5620.598551]  do_interrupt_handler+0x88/0x9c
[ 5620.598558]  el1_interrupt+0x34/0x70
[ 5620.598567]  el1h_64_irq_handler+0x18/0x2c
[ 5620.598573]  el1h_64_irq+0x68/0x6c
[ 5620.598576]  cpuidle_enter_state+0xc0/0x4c4
[ 5620.598583]  cpuidle_enter+0x38/0x58
[ 5620.598596]  do_idle+0x1fc/0x278
[ 5620.598605]  cpu_startup_entry+0x34/0x3c
[ 5620.598611]  kernel_init+0x0/0x1ec
[ 5620.598616]  arch_post_acpi_subsys_init+0x0/0x18
[ 5620.598631]  start_kernel+0x54c/0x6f4
[ 5620.598636]  __primary_switched+0xb8/0xc0
[ 5620.598646] handlers:
[ 5620.598659] [<00000000e3ce55da>] irq_default_primary_handler threaded [<00000000e676cd34>] m_can_class_suspend [m_can]
[ 5620.604031] Disabling IRQ #398

 

中断被禁用之后将无法再接受或者发送CAN数据

 

使用的内核版本如下:

nvidia@tegra-ubuntu:~$ uname -a
Linux tegra-ubuntu 6.8.12-1021-tegra #1 SMP PREEMPT Mon Jun  1 13:25:46 PDT 2026 aarch64 aarch64 aarch64 GNU/Linux

 

请问有什么好的解决方案嘛?

 

  • 当总线UP之后,我通过示波器查看到,终端引脚在中断计数增加的时候,周期性的被拉低

  • 当总线UP之后,我通过示波器查看到,终端引脚在中断计数增加的时候,周期性的被拉低

  • 您好

    已经收到了您的案例,调查需要些时间,感谢您的耐心等待

  • 我专精于TCAN4550-Q1器件,而非Linux系统。我不确定如何解读您分享的Linux日志文件截图。日志中显示错误计数器、中断寄存器和协议状态寄存器(ECR、IR和PSR)的部分,并未提供任何关于哪些中断位被置位的信息,也没有显示任何错误。

    TCAN4550-Q1 通常需要发送错误计数器 (TEC) 超过最大值才能断开与 CAN 总线的连接,从而进入总线关闭状态。最常见的原因是标称位或数据位时序配置存在问题,或者存在时钟容差问题。

    请验证标称位和数据位时序是否与网络上的所有其他设备匹配,以及时钟频率是否在 ISO 11898-1 标准要求的容差范围内。

    问候,

    乔纳森

  • 有关于TCAN4550器件时钟要求的详细说明嘛?当前的情况CAN总线能正常收发,但是在空闲状态频繁的触发中断,这不符合实际的应用。

    另外,TCAN4550的驱动程序,我是直接从内核中获取的源码进行编译的。从源码中的信息来看,驱动程序是你们提供的Dan Murphy <dmurphy@ti.com>

    能否申请一位同时了解Linux系统的支持呢?目前这个问题已经困惑我们很久了。希望得到你们的帮组

  • 请问您有TCAN4550器件时钟要求的详细说明吗?目前,CAN总线可以正常收发数据,但在空闲状态下频繁触发中断,这不适用于实际应用。

    您能告诉我空闲状态下具体生成了哪些中断位吗?如果可以,我可以帮助您理解这些位被置位的原因,并帮助您确定如何阻止它们被置位。请告诉我寄存器 0x​​000C、0x0820 和 0x0824 的值,以便我查看哪些状态位和中断位被置位。

    我们有几份应用报告讨论了时钟电路的优化要求,尤其是在使用晶振时。使用单端时钟通常不是问题,时钟信号只需是符合数据手册要求的单端信号即可。

    TCAN455x 时钟优化和设计指南应用报告链接

    TCAN455x-Q1 外围电路和时钟设计应用报告链接

    如果您的问题更侧重于 CAN 通信的时钟要求,那么 ISO 11898-1 标准以及许多其他文档中都列出了一些要求,这些文档讨论了如何分配时间量子以获得良好的采样点。TCAN4550-Q1 使用了博世开发的 MCAN IP,有一篇应用笔记详细讨论了 CAN FD 位定时配置,您可能对此感兴趣。

    CAN FD链路)的比特时间要求

    ISO 11898-1 时钟振荡器容差规范要求如下:

    MCAN 控制器有一份由博世为其知识产权编写的用户手册,其中可能还包含其他您感兴趣的详细信息。

    MCAN 用户手册链接

    此外,我直接从内核源代码编译了 TCAN4550 驱动程序。根据源代码中的信息,该驱动程序由Dan Murphy <dmurphy@ti.com> 提供。

    是的,没错。该驱动程序最初由 Dan Murphy 开发,并在 Linux 内核 5.14 版本中合并到上游。后来,在 2020 年由第三方开发者进行了更新。您提供的链接包含的是更新后的版本。

    能否请一位精通 Linux 系统的人员提供帮助?这个问题困扰我们很久了。非常感谢您的帮助。

    如果你的问题出在 Linux 代码上,那么你需要向 Linux 社区寻求帮助,因为该驱动程序已经合并到内核中了。

    如果您遇到的问题与设备运行正常或设备错误有关,例如硬件或应用程序中的寄存器配置问题,那么我是该设备的专家,可以为您解答这些问题。但是,我对数据日志及其格式并不熟悉,如果其中包含调试问题所需的详细设备寄存器值,我就不清楚了。以下日志中似乎没有设置任何错误计数器位、中断位或协议状态信息,因此我不清楚问题出在哪里。

    请解释如何解读以下日志。各列和数字分别代表什么?

    请解释一下如何解读另一份日志。

    但如果你能直接与我沟通 TCAN4550 设备的寄存器值,那就更好了。

    问候,

    乔纳森

  • 我无法在论坛上直接恢复消息了,只能以邮件的方式发送给你,同时在之前的消息上进一步进行回复。
    其实我们现在不确定具体是驱动的问题,还是由于硬件电路上时钟的问题,所以需要你们的协助。
    关于芯片的寄存器值如下,我导出了所有的寄存器的值
    [ 4100.554333] tcan4x5x spi0.0: ===== TCAN4x5x Register Dump after init =====
    [ 4100.554336] tcan4x5x spi0.0: --- Device ID and SPI Registers ---
    [ 4100.554680] tcan4x5x spi0.0: DEV_ID1 (0x0000): 0x4e414354
    [ 4100.555034] tcan4x5x spi0.0: DEV_ID2 (0x0004): 0x30353534
    [ 4100.555093] tcan4x5x spi0.0: REV (0x0008): 0x00110201
    [ 4100.555441] tcan4x5x spi0.0: STATUS (0x000c): 0x00000008
    [ 4100.555793] tcan4x5x spi0.0: ERROR_STATUS_MASK (0x0010): 0x3f3f0000
    [ 4100.555797] tcan4x5x spi0.0: --- Device Config and Interrupt Registers ---
    [ 4100.555852] tcan4x5x spi0.0: CONFIG (0x0800): 0x080004a8
    [ 4100.556249] tcan4x5x spi0.0: TS_PRESCALE (0x0804): 0x00000002
    [ 4100.556582] tcan4x5x spi0.0: TEST_REG (0x0808): 0x00000000
    [ 4100.556918] tcan4x5x spi0.0: Test 2 (0x080c): 0x00000000
    [ 4100.557252] tcan4x5x spi0.0: INT_FLAGS (0x0820): 0x00000082
    [ 4100.557315] tcan4x5x spi0.0: MCAN_INT_REG (0x0824): 0x00010000
    [ 4100.557373] tcan4x5x spi0.0: INT_EN (0x0830): 0x8096a8ff
    [ 4100.557377] tcan4x5x spi0.0: --- M_CAN Key Registers ---
    [ 4100.557432] tcan4x5x spi0.0: CCCR (0x100c): 0x00000a33
    [ 4100.557487] tcan4x5x spi0.0: NBTP (0x1010): 0x00000080
    [ 4100.557542] tcan4x5x spi0.0: TSCONFIG (0x1014): 0x00000000
    [ 4100.557597] tcan4x5x spi0.0: TOCC (0x1018): 0x00000000
    [ 4100.557652] tcan4x5x spi0.0: ECR (0x1020): 0x000f0001
    [ 4100.557707] tcan4x5x spi0.0: PSR (0x1024): 0x000000cf
    [ 4100.557762] tcan4x5x spi0.0: TDCR (0x1028): 0xffff0000
    [ 4100.557816] tcan4x5x spi0.0: IE (0x1040): 0x00000000
    [ 4100.557870] tcan4x5x spi0.0: ILS (0x1044): 0x0000070f
    [ 4100.557926] tcan4x5x spi0.0: IR (0x1048): 0x00000000
    [ 4100.557982] tcan4x5x spi0.0: ILCR (0x104c): 0x00000000
    [ 4100.558048] tcan4x5x spi0.0: RXGFC (0x1050): 0x20010000
    [ 4100.558122] tcan4x5x spi0.0: XIDAM (0x1054): 0x07b79289
    [ 4100.558179] tcan4x5x spi0.0: HPMS (0x1058): 0x00000000
    [ 4100.558235] tcan4x5x spi0.0: NDAT1 (0x105c): 0x00000001
    [ 4100.558290] tcan4x5x spi0.0: NDAT2 (0x1060): 0x00000000
    [ 4100.558344] tcan4x5x spi0.0: RXFCS (0x1080): 0x00000000
    [ 4100.558400] tcan4x5x spi0.0: RXF0S (0x1084): 0x00000000
    [ 4100.558456] tcan4x5x spi0.0: RXFAP (0x1088): 0x00000000
    [ 4100.558513] tcan4x5x spi0.0: RXFS (0x1090): 0x1fffffff
    [ 4100.558569] tcan4x5x spi0.0: TXFQS (0x1098): 0x00000000
    [ 4100.558625] tcan4x5x spi0.0: TXEFA (0x109c): 0x00000000
    [ 4100.558683] tcan4x5x spi0.0: TXEFS (0x10a0): 0x00100000
    [ 4100.558739] tcan4x5x spi0.0: TXBTIE (0x10a8): 0x00000000
    [ 4100.558796] tcan4x5x spi0.0: TXBCIE (0x10ac): 0x00000000
    [ 4100.558852] tcan4x5x spi0.0: TXBIF (0x10b0): 0x00000480
    [ 4100.558908] tcan4x5x spi0.0: TXBCIE (0x10b4): 0x00000000
    [ 4100.558966] tcan4x5x spi0.0: TXBAR (0x10b8): 0x00000000
    [ 4100.559021] tcan4x5x spi0.0: TXBCR (0x10bc): 0x00000777
    [ 4100.559078] tcan4x5x spi0.0: TXBCS (0x10c0): 0x01000488
    [ 4100.559136] tcan4x5x spi0.0: TXEFA (0x10c8): 0x00000007
    [ 4100.559191] tcan4x5x spi0.0: CKDIV (0x10d0): 0x00000000
    [ 4100.559194] tcan4x5x spi0.0: ===== End Register Dump =====

    下图的日志中只需要关注我红框出来的一列,该数字表示中断触发的次数,正常情况下,只是将CAN总线打开,不进行数据的收发操作,中断次数不应该出现递增的情况。
    实际上无论是标准CAN还是CANFD都会出现这个问题,
    另外如果忽略这个问题直接进行收发测试的话,CAN或者CANFD都是正常的,只不过频繁增加的中断计数,会直接导致系统禁用掉该中断。从而导致CAN总线无法再进行数据的收发。