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.

[参考译文] PROCESSOR-SDK-AM437X:在启用 CAN 接口时收到超时消息

Guru**** 2540720 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1024047/processor-sdk-am437x-getting-timeout-message-when-we-enable-can-interface

器件型号:PROCESSOR-SDK-AM437X

您好!

对于下面附加的帖子、抱歉、我无法回复 我的帖子、因此我创建了一个新的主题进行回复  

PROCESSOR-SDK-AM437X:在启用 CAN 接口时收到超时消息。 -处理器论坛-处理器- TI E2E 支持论坛

[摩尼什]:  

我们正在对定制板中可用的所有接口进行持续环境测试。 每个接口测试是顺序的、每次迭代 大约需要 1.5分钟来完成自定义电路板中所有接口的测试。 我们在定制板中使用两个 CAN 接口、并对两个端口进行环回以进行环境测试。 我们可以在两个端口上发送和接收消息。 我们使用这些命令设置比特率并启用 CAN 端口。

#IP LINK SET CAN0 TYPE CAN 比特率1000000 # SET 比特率
#IP link set CAN0 up # set CAN0 up

#IP LINK SET CAN1 TYPE CAN 比特率1000000 # SET 比特率
#IP link set CAN1 up # set CAN1 up

当我们使用上述命令时、我们将收到如下针对每次迭代(从 Syslog 日志记录)的超时消息。 我们为什么会收到超时消息? 如果系统运行超过24小时,频繁超时错误是否会导致任何问题。

2021-06-04T14:07:42.535150+00:00 AM437X-定制内核:[10615.455475]  net CAN0:C_CAN_HW_raminit_wait_SYSCON:超时
2021-06-04T14:07:42.535237+00:00 AM437X-定制内核:[10615.461843] c_CAN_platform 481cc000.can CAN0:设置 BTR=2701 BRPE=0000
2021-06-04T14:07:42.584839+00:00 AM437X-定制内核:[10615.512659]  net CAN1:C_CAN_HW_raminit_wait_SYSCON:超时
2021-06-04T14:07:42.595194+00:00 AM437X-定制内核:[10615.519524] c_CAN_platform 481d0000.can CAN1:设置 BTR=2701 BRPE=0000
2021-06-04T14:07:52.615153+00:00 AM437X-定制内核:[10625.533893] c_CAN_platform 481cc000.can CAN0:设置 BTR=2701 BRPE=0000
2021-06-04T14:07:52.665631+00:00 AM437X 自定义内核:[10625.584586]  net CAN1:C_CAN_HW_raminit_wait_SYSCON:超时
2021-06-04T14:07:52.665726+00:00 AM437X 自定义内核:[10625.590801] c_CAN_platform 481d0000.can CAN1:设置 BTR=2701 BRPE=0000
2021-06-04T14:08:01.450176+00:00 AM437X-定制 crond[1000]:(根)错误的文件所有者(/var/spool/cron/root)
2021-06-04T14:09:01.451354+00:00 AM437X-定制 crond[1000]:(root)错误的文件所有者(/var/spool/cron/root)
2021-06-04T14:09:07.065079+00:00 AM437X-定制内核:[10699.987593] c_CAN_platform 481cc000.can CAN0:设置 BTR=2701 BRPE=0000
2021-06-04T14:09:07.115002+00:00 AM437X-定制内核:[10700.038186]  Net CAN1:C_CAN_HW_raminit_wait_SYSCON:超时
2021-06-04T14:09:07.115089+00:00 AM437X-定制内核:[10700.044657] c_CAN_platform 481d0000.can CAN1:设置 BTR=2701 BRPE=0000
2021-06-04T14:09:17.144960+00:00 AM437X-定制内核:[10710.067504]  net CAN0:C_CAN_HW_raminit_wait_SYSCON:超时
2021-06-04T14:09:17.145153+00:00 AM437X-定制内核:[10710.073994] c_CAN_platform 481cc000.can CAN0:设置 BTR=2701 BRPE=0000
2021-06-04T14:09:17.205233+00:00 AM437X-定制内核:[10710.122861] c_CAN_platform 481d0000.can CAN1:设置 BTR=2701 BRPE=0000

[舒伊勒·帕顿]

您使用的是哪个版本的内核?

能否为每个接口发布输出?

ip -d -s 链接显示

此致、  

Monish P

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

    请找到以下答案、

    [TI]您使用的内核是哪个版本?

    [Monish] 内核版本:4.19

    [TI] 能否为每个接口发布输出?

    [Monish] 我们正在 CAN0和 CAN1之间执行回送。 首先、我们从 CAN0发送消息、然后通过 CAN1接收消息、反之亦然。 请找到以下输出。

    CAN0发送信号。。 CAN1接收

    接口= CAN0、系列= 29、类型= 3、PROTO= 1
    接口= CAN0、系列= 29、类型= 3、PROTO= 1
    接口= CAN0、系列= 29、类型= 3、PROTO= 1
    接口= CAN0、系列= 29、类型= 3、PROTO= 1
    接口= CAN0、系列= 29、类型= 3、PROTO= 1
    接口= CAN0、系列= 29、类型= 3、PROTO= 1
    接口= CAN0、系列= 29、类型= 3、PROTO= 1
    接口= CAN0、系列= 29、类型= 3、PROTO= 1
    接口= CAN0、系列= 29、类型= 3、PROTO= 1
    接口= CAN0、系列= 29、类型= 3、PROTO= 1
    接口= CAN0、系列= 29、类型= 3、PROTO= 1

    从 CAN0接收到的报文

    读:网络已关闭
    接口= CAN1、系列= 29、类型= 3、proto = 1
    0x00a>[8] 08 07 06 05 04 03 02 01
    0x00a>[8] 08 07 06 05 04 03 02 01
    0x00a>[8] 08 07 06 05 04 03 02 01
    0x00a>[8] 08 07 06 05 04 03 02 01
    0x00a>[8] 08 07 06 05 04 03 02 01
    0x00a>[8] 08 07 06 05 04 03 02 01
    0x00a>[8] 08 07 06 05 04 03 02 01
    0x00a>[8] 08 07 06 05 04 03 02 01
    0x00a>[8] 08 07 06 05 04 03 02 01
    0x00a>[8] 08 07 06 05 04 03 02 01
    0x00a>[8] 08 07 06 05 04 03 02 01


    /pre_compliance _i2c_lcd_remove.sh:第847行:23340被终止(while true;do
    MSG_CANDump ="$(CANDump CAN1)";如果[${#msg_CANDump}> 1]];那么
    回显"$msg_candump";
    FI;睡眠0.025;
    完成)
    CAN1发送信号。。 CAN0接收

    接口= CAN1、系列= 29、类型= 3、proto = 1
    接口= CAN1、系列= 29、类型= 3、proto = 1
    接口= CAN1、系列= 29、类型= 3、proto = 1
    接口= CAN1、系列= 29、类型= 3、proto = 1
    接口= CAN1、系列= 29、类型= 3、proto = 1
    接口= CAN1、系列= 29、类型= 3、proto = 1
    接口= CAN1、系列= 29、类型= 3、proto = 1
    接口= CAN1、系列= 29、类型= 3、proto = 1
    接口= CAN1、系列= 29、类型= 3、proto = 1
    接口= CAN1、系列= 29、类型= 3、proto = 1
    接口= CAN1、系列= 29、类型= 3、proto = 1

    从 CAN1接收到的消息

    读:网络已关闭
    接口= CAN0、系列= 29、类型= 3、PROTO= 1
    0x005>[8] 01 02 03 04 05 06 07 08
    0x005>[8] 01 02 03 04 05 06 07 08
    0x005>[8] 01 02 03 04 05 06 07 08
    0x005>[8] 01 02 03 04 05 06 07 08
    0x005>[8] 01 02 03 04 05 06 07 08
    0x005>[8] 01 02 03 04 05 06 07 08
    0x005>[8] 01 02 03 04 05 06 07 08
    0x005>[8] 01 02 03 04 05 06 07 08
    0x005>[8] 01 02 03 04 05 06 07 08
    0x005>[8] 01 02 03 04 05 06 07 08
    0x005>[8] 01 02 03 04 05 06 07 08

    读:网络已关闭
    /pre_compliance _i2c_lcd_remove.sh:第847行:23376被终止(while true;do
    MSG_CANDump ="$(CANDump CAN0)";如果[${#msg_CANDump}> 1]];那么
    回显"$msg_candump";
    FI;睡眠0.025;
    完成)

    [TI]  IP -d -s 链接显示

    [Monish] 请找到以下输出图像。

    此致、

    Monish P

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

    您好!

    感谢您的详细解释。  查看驱动程序的代码、超时似乎与可能正忙的硬件相关。 我将无法调试您的测试脚本。 但是、根据超时、我在这里的初始想法是、需要在测试脚本中添加一些流控制。 脚本发送消息的速度似乎比网络堆栈快、硬件可以处理这些消息。 我建议修改您的测试、以使此类比较在1到1的基础上开始缓慢地进行从 CAN0到 CAN1的8个字节中递增的消息流、然后也许从那里生成。

    此致、

    Schuyler

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

    Schuyler、您好、

    感谢您的回答。  

    在循环中传输消息时、消息之间的延迟为0.5s。 是否需要将消息之间的延迟增加到1秒?  

    此外、找到以下 CAN 测试脚本。

    echo " "
    echo "CAN0 Transmit.....CAN1 Receive"
    echo " "
    
    ip link set can0 type can bitrate 1000000	# set bit rate
    ip link set can0 up				# set can0 up
    
    ip link set can1 type can bitrate 1000000	# set bit rate
    ip link set can1 up				# set can1 up
    
    sleep 1
    a=0;                                                          
    (       
      while true;                                                 
      do                                                          
        msg_candump="$( candump can1 )" 		# read CAN    
        if [[ ${#msg_candump} > 1 ]]; then 		#received msg          
          echo "$msg_candump"                                     
        fi                                                       
        sleep 0.025       
      done                                       
    ) &                                                     
    PID=$! 
    
    echo 0 > /sys/class/gpio/gpio160/value		# Enable CAN0 Transeiver sleep pin
    echo 0 > /sys/class/gpio/gpio161/value		# Enable CAN1 Transeiver sleep pin
    
    sleep 0.5
    
    while true;
    do
        cansend can0 --identifier=10 8 7 6 5 4 3 2 1 	#Transmit CAN message
        sleep 0.5
        if [ $a -eq 10 ]
        then
          break
        fi
        ((a=a+1))
    done
    echo " "
    echo "Received Messages from CAN0 "
    echo " "
    ip link set can0 down                                         
    ip link set can1 down
    
    kill -9 $PID
    
    echo " "
    echo " "
    sleep 2
    echo "CAN1 Transmit.....CAN0 Receive"
    
    echo " "
    
    ip link set can0 type can bitrate 1000000		# set bit rate
    ip link set can0 up					# set can0 up
    
    ip link set can1 type can bitrate 1000000		# set bit rate
    ip link set can1 up					# set can1 up
    
    sleep 1 
    
    a=0;                                                          
    (     
      while true;                                                 
      do                                                          
        msg_candump="$( candump can0 )" 			# read CAN   
        if [[ ${#msg_candump} > 1 ]]; then 			#received msg          
          echo "$msg_candump"                                     
        fi                                                       
        sleep 0.025       
      done                                       
    ) &                                                     
    PID=$!
    
    sleep 0.5
    
    while true;
    do
        cansend can1 --identifier=5 1 2 3 4 5 6 7 8		#Transmit CAN message
        sleep 0.5
        if [ $a -eq 10 ]
        then
          break
        fi
        ((a=a+1))
    done
    
    echo " "                              
    echo "Received Messages from CAN1 "
    echo " " 
    
    ip link set can0 down				#Down can 0
    ip link set can1 down				#Down can 1
    
    echo 1 > /sys/class/gpio/gpio160/value		# Disable CAN0 Transeiver sleep pin
    echo 1 > /sys/class/gpio/gpio161/value		# Disable CAN1 Transeiver sleep pin
    kill -9 $PID
    

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

    您好!

    您是否可以尝试将循环中的消息计数减少为1、以确定问题是否是溢出情况。  在看到第一个超时之前、测试运行了多长时间? 可以描述一下您是如何启动接口以及测试何时开始的? 测试是持续运行还是正在停止并重新启动?

    此致、

    Schuyler

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

    Schuyler、您好、

    您是否可以尝试将循环中的消息计数减少为1、以确定问题是否是溢出情况。

    • 我们可以执行此调试操作并在明天更新

    在看到第一个超时之前、测试运行了多长时间?

    • 在 CAN 的所有测试用例中都观察到超时、即在第一个测试用例中、观察到超时。
    • 此外、当我们通常禁用和启用 CAN 接口时、会观察到该超时。 请找到下图。

    可以描述一下您是如何启动接口以及测试何时开始的?

    #IP link set CAN0 type can bitrate 1000000           

    #IP LINK 设置 CAN0            

    传输完所有消息后、我们禁用 CAN 接口。           

    #IP link 设置 CAN0关闭            

    测试是持续运行还是正在停止并重新启动?

    • 整体测试通过各种接口连续完成、其中 CAN 是每个  序列中将被禁用和重新启动的接口之一。

    此致、

    Monish P

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

    您好!

    感谢您的更新。 禁用和启用接口时发生的错误、我将与开发团队一起研究。 您是否还看到任何消息丢失?

    此致、

    Schuyler

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

    您好!

    我也需要 uname -A 的结果。  

    谢谢、此致、

    Schuyler

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

    Schuyler、您好、

    我们不会看到任何消息丢失。 实际上、我们将从 CAN0传输11个数据到 CAN1、反之亦然、我们会观察两种情况下的预期输出。

    此致、

    Monish P

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

    您好!  

    请找到 uname -a 的结果

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

    您好!

    很抱歉、当我请求内核版本时、应该要求提供 uname -A 的结果。 您运行的内核不是 TI 发布的内核。 使用此内核版本是否有原因? 克隆的内核源文件来自何处?

    我建议切换回使用 TI SDK v6.03中的内核、内核版本为:4.19.94-rt39。 我之所以建议这样做、是因为从主线中提取并为 RT 编译可能会错过 TI 应用的补丁和测试。 SDK 发布后、在 RT 内核上停止测试和自动合并。

    下面 6.03 RT 内核的 ti 内核树链接。  

    此致、

    Schuyler

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

    Schuyler、您好、

    我们的图像基于 ti 4.19.94-rt39

    在此版本中、我们还不断更新上游4.19-RT-kernel 上应用的一些修补程序以及 CVE 漏洞的少数修补程序。

    此致、

    Monish P

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

    您好、Monish、

    如果可能、我建议您尝试预构建的 TI 内核和驱动程序作为问题隔离的一种方法、看看您是否发现了相同的问题。   

    此致、

    Schuyler