Rockchip CAN 部分波特率收发不正常解决思路

简介: Rockchip CAN 部分波特率收发不正常解决思路

Rockchip系列之深度分析CAN接口系列(1)_一歲抬頭的博客-CSDN博客

Rockchip系列之CAN 新增framework系统jni接口访问(2)-CSDN博客

Rockchip系列之CAN 新增framework封装service+manager访问(3)-CSDN博客

Rockchip系列之CAN APP测试应用实现(4)_一歲抬頭的博客-CSDN博客

Rockchip CAN 部分波特率收发不正常解决思路_一歲抬頭的博客-CSDN博客

Android JNI与CAN通信遇到的问题总结_android can通信-CSDN博客

Android 内核关闭CAN 串口设备回显功能_一歲抬頭的博客-CSDN博客

CAN通信参数的计算和选择

CAN(控制器局域网)是一种广泛应用于工业和汽车领域的串行总线通信协议。CAN通信的可靠性和稳定性取决于多个因素,包括硬件设备、网络配置、终端电阻、电缆质量等。其中,一个重要的因素是CAN通信参数的设置,包括时间量化器(tq)、传播段时间(prop-seg)、相位段1时间(phase-seg1)、相位段2时间(phase-seg2)和同步跳转宽度(sjw)等。

本文将介绍CAN通信参数的含义、计算方法和选择原则,以及如何根据具体的硬件设备和网络配置进行参数调整。本文的内容基于以下的情况:

  • 测试CAN通信时使用了不同的波特率(666、500、40、20、10、5k),但只能发送而无法接收数据。
  • 通过设置ip link set can0 type can tq 133 prop-seg 6 phase-seg1 6 phase-seg2 2 sjw 1,可以解决时钟同步问题,实现正常的数据收发。


    本文我是请教了专业做can设备的 , 部分内容是参考别人的 希望能帮助到有需要的人。

CAN通信参数的含义

CAN通信参数用于配置CAN总线接口的通信参数。这些参数影响了CAN总线上数据的传输速率、传播延迟、采样点位置、位同步等。下面是各个参数的详细解释:

  • tq: 时间量化器(Time Quantum),表示一个时间量化器的时钟周期数。它定义了CAN总线的时间分辨率。较小的tq值表示更高的时间分辨率。
  • prop-seg: 传播段时间(Propagation Segment),表示数据从发送器到接收器的传播延迟时间。这个参数通常与CAN总线长度和传输速率有关。较大的prop-seg值允许更长的总线长度。
  • phase-seg1: 相位段1时间(Phase Segment 1),表示在采样点之前的时间段。在这个时间段内,总线上的信号被采样以进行数据接收。
  • phase-seg2: 相位段2时间(Phase Segment 2),表示在采样点之后的时间段。在这个时间段内,总线上的信号被保持稳定以供其他节点采样。
  • sjw: 同步跳转宽度(Synchronization Jump Width),用于定义同步跳转的时间段。它用于处理发送器和接收器之间的位同步。

CAN通信参数的计算方法

CAN通信参数的计算涉及多个因素,包括传输速率、总线长度、物理层特性和硬件设备的要求。以下是关于各个参数的计算和选择的一般指导原则:

  • tq: 时间量化器定义了CAN总线的时间分辨率,也称为时间切片。计算tq值通常涉及考虑总线速率和硬件设备的要求。
  • prop-seg: 传播段时间定义了从发送器到接收器的信号传播延迟时间。它取决于总线的物理长度和传播速度。计算prop-seg值通常是根据总线长度和传输速率,结合物理层传播速度的特性进行估算。
  • phase-seg1: 相位段1时间定义了在采样点之前的时间段。相位段1时间的计算涉及平衡传输延迟和采样点的位置,以确保正确的数据接收。
  • phase-seg2: 相位段2时间定义了在采样点之后的时间段。相位段2时间的选择通常取决于传输速率和硬件设备的要求。
  • sjw: 同步跳转宽度定义了同步跳转的时间段。同步跳转宽度的计算通常与相位段时间和总线速率相结合,以确保正确的位同步。

具体的参数计算和选择通常涉及CAN硬件设备的文档和规范。厂商通常提供参数计算公式、建议范围和最佳实践。建议查阅相关文档以获取准确的计算方法和建议值,以适应特定的硬件设备和网络配置。

CAN通信参数的调整示例

测试CAN通信时使用了不同的波特率(666、500、40、20、10、5k),但只能发送而无法接收数据。这可能是因为使用了不正确的通信参数,导致发送和接收的时钟同步问题。

通过设置ip link set can0 type can tq 133 prop-seg 6 phase-seg1 6 phase-seg2 2 sjw 1,可以使用特定的通信参数来解决时钟同步问题。这些参数设置可能适用于本文的CAN硬件设备和网络配置,确保发送和接收的数据能够正确同步和解析。

下面是对这些参数设置的解释:

  • tq: 时间量化器的值为133。这意味着一个时间量化器包含133个时钟周期。较小的tq值提供更高的时间分辨率,可以用于处理更高的数据速率。
  • prop-seg: 传播段时间和相位段1时间的值都为6。这表示在传播段时间和相位段1时间都有6个时间量化器的时钟周期。这样设置可以适应中等长度的CAN总线。
  • phase-seg2: 相位段2时间的值为2。这表示在相位段2时间有2个时间量化器的时钟周期。较小的相位段2时间可以提供更高的数据采样精度。
  • sjw: 同步跳转宽度的值为1。这表示同步跳转宽度为1个时间量化器的时钟周期。适当的同步跳转宽度可以确保数据的位同步。

CAN上层解决增加的代码

 private void openCan() {
        if (isCanOpen) {
            showToast("CAN 总线已经打开");
            return;
        }
        try {
            systemCan = new SystemCan(selectedCan, selectedBaudrate);
            int fd = systemCan.dev_openCan(selectedCan);
            if (fd != -1) {
                systemCan.fd = fd;
                showToast("打开 CAN 总线成功");
                openCanButton.setEnabled(false);
                isCanOpen = true;
            } else {
                showToast("打开 CAN 总线失败");
            }
        } catch (Exception e) {
            showToast("打开 CAN 总线出现异常");
            Log.e(TAG, "Error opening CAN: " + e.getMessage());
        }
        // 添加了额外的参数tq(时间量化器),propSeg(传播段时间),phaseSeg1(相位段1时间),phaseSeg2(相位段2时间)和sjw(同步跳转宽度)
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                ShellUtils.CommandResult commandResult = ShellUtils.execCommand("ip link set " + selectedCan + " down && ip link set " + selectedCan + " type can tq 133 prop-seg 6 phase-seg1 6 phase-seg2 2 sjw 1 && ip link set  " + selectedCan + "  up", true);
                //Log.d("SystemCan-test", + commandResult.result + "," + commandResult.successMsg + "," + commandResult.errorMsg);
            }
        });
    }

我是在Android设备验证ok的 , 如果是adb测试的话 更简单 , android,linux通用哈。

请按照这个步骤执行3条命令就可以了
1. 设置波特率
ip link set can0 down && ip link set can0 type can bitrate 500000 && ip link set can0 up    
 
2. 设置参数
 ip link set can0 down && ip link set can0 type can tq 133 prop-seg 6 phase-seg1 6 phase-seg2 2 sjw 1 && ip link set can0 up
 
3. 读数据
candump can0 &
 
单独执行每条命令 , 如果你那边是can1 则改成can1。 然后通过上位机发送数据看看adb 这边能不能打印数据 

 

注意 这些参数设置并不是唯一可行或最优的选择。不同的CAN网络可能需要不同的参数设置,以适应不同的硬件设备和网络特性。建议参考硬件设备的文档和规范,了解其建议的参数设置和要求,以确保正确的数据通信。

总结

本文介绍了CAN通信参数的计算和选择,以及如何根据具体情况进行参数调整。CAN通信参数包括时间量化器(tq)、传播段时间(prop-seg)、相位段1时间(phase-seg1)、相位段2时间(phase-seg2)和同步跳转宽度(sjw)等,它们影响了CAN总线上数据的传输速率、传播延迟、采样点位置、位同步等。CAN通信参数需要根据硬件设备、网络配置、传输速率等因素进行合理地计算和选择,以确保CAN通信。如果有什么问题 欢迎留言评论 栓QQQQ。


相关文章
|
6月前
【STM32】NRF24L01模块的收发调试(一)
【STM32】NRF24L01模块的收发调试
165 0
|
6月前
【STM32】NRF24L01模块的收发调试(三)
【STM32】NRF24L01模块的收发调试
160 0
|
6月前
【STM32】NRF24L01模块的收发调试(二)
【STM32】NRF24L01模块的收发调试
109 0
|
4月前
STM32CubeMX 串口收发一帧数据
STM32CubeMX 串口收发一帧数据
50 9
|
4月前
|
芯片
STM32CubeMX 串口数据收发
STM32CubeMX 串口数据收发
116 2
|
6月前
|
芯片
动画图解常见串行通讯协议:SPI、I²C、UART、红外分析
动画图解常见串行通讯协议:SPI、I²C、UART、红外分析
142 0
STM32:USART串口外设(内含:1.USART简介+2.USART基本结构+3.数据帧+4.起始位侦测+5.数据采样+6.波特率发生器)
STM32:USART串口外设(内含:1.USART简介+2.USART基本结构+3.数据帧+4.起始位侦测+5.数据采样+6.波特率发生器)
365 0
STM32:USART串口外设(内含:1.USART简介+2.USART基本结构+3.数据帧+4.起始位侦测+5.数据采样+6.波特率发生器)
|
缓存 自然语言处理 网络协议
STM32CubeMX | | 使用小熊派串口驱动峰汇ETH-01以太网模块上传数据到OneNet
STM32CubeMX | | 使用小熊派串口驱动峰汇ETH-01以太网模块上传数据到OneNet
162 0
|
存储 安全 定位技术
串口,IIC,SPI,USB等总线叙述
串口,IIC,SPI,USB等总线叙述
201 0