STM32MP157驱动开发——Linux CAN驱动

news2024/11/16 20:31:19

STM32MP157驱动开发——Linux CAN驱动

  • 一、简介
    • 1.电气属性
    • 2.CAN协议
    • 3.CAN速率
    • 4.CAN FD 简介
  • 二、驱动开发
    • 1.修改设备树
    • 2.FDCAN1控制器节点
    • 3.修复 m_can_platform.c
    • 4.使能 CAN 总线
    • 5.使能FDCAN外设驱动
  • 三、运行测试
    • 1.移植 iproute2 和 can-utils 工具
    • 2.测试
      • 1)收发测试:
      • 2)CAN FD协议测试
    • 3. CAN 500K 收发异常处理方法


参考文章:【正点原子】I.MX6U嵌入式Linux驱动开发——Linux CAN驱动

一、简介

  CAN 是目前应用非常广泛的现场总线之一,主要应用于汽车电子和工业领域,尤其是汽车领域,汽车上大量的传感器与模块都是通过 CAN 总线连接起来的。上学的时候导师也说过,一个优秀的嵌入式工程师一定是一个优秀的 CAN 总线使用者。所以关于 CAN 总线的设计和驱动开发比较重要。本节就来学习一下开发板上的 CAN 接口驱动开发。
  CAN 的全称为 Controller Area Network,也就是控制局域网络,以汽车电子为例,汽车上有空调、车门、发动机、大量传感器等,这些部件都是通过 CAN 总线连在一起形成一个网络。
在这里插入图片描述
在同一个 CAN 网络中所有单元的通信速度必须一致,不同的网络之间通信速度可以不同。CAN 的特点主要有以下几点:

  • 1.多主控制
    在总线空闲时,所有单元都可以发送消息(多主控制),而两个以上的单元同时开始发送消息时,根据标识符 (Identifier 以下称为 ID) 决定优先级。ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各消息 ID 的每个位进行逐个仲裁比较。仲裁获胜 (被判定为优先级最高) 的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。
  • 2.系统的柔软性
    与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。
  • 3.通信速度快,距离远
    最高 1Mbps (距离小于 40M),最远可达 10KM (速率低于 5Kbps),最新的 CAN FD 速度可以到 5Mbps。
  • 4.具有错误检测、错误通知和错误恢复功能
    所有单元都可以检测错误 (错误检测功能),检测出错误的单元会立即同时通知其他所有单元 (错误通知功能),正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止 (错误恢复功能)。
  • 5.故障封闭功能
    CAN 可以判断出错误的类型是总线上暂时的数据错误 (如外部噪声等) 还是持续的数据错误 (如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。
  • 6.连接节点多
    CAN 总线可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。

1.电气属性

  CAN 总线使用两根线来连接各个单元:CAN_H 和 CAN_L,CAN 控制器通过判断这两根线上的电位差来得到总线电平,CAN 总线电平分为显性电平和隐性电平两种。显性电平表示逻辑“0”,此时 CAN_H 电平比 CAN_L 高,分别为 3.5V 和 1.5V,电位差为 2V。隐形电平表示逻辑“1”,此时 CAN_H 和 CAN_L 电压都为 2.5V 左右,电位差为 0V。CAN 总线就通过显性和隐形电平的变化来将具体的数据发送出去。
在这里插入图片描述
总线空闲时,就一直处于隐形。并且CAN 总线两端要各接一个 120Ω 的端接电阻,用于匹配总线阻抗,吸收信号反射及回拨,提高数据通信的抗干扰能力以及可靠性。
在这里插入图片描述

2.CAN协议

在这里插入图片描述
CAN 协议提供了 5 种帧格式来传输数据,其中数据帧和遥控帧有标准格式和扩展格式两种,标准格式有 11 位标识符(ID),扩展格式有 29 个标识符(ID)。
各种数据帧的组成字段可参考原子哥教程中的描述。

3.CAN速率

CAN2.0 最高速度为 1Mbps / 秒。对于 CAN 总线,一个位分为 4 段:

① 同步段(SS)
② 传播时间段(PTS)
③ 相位缓冲段 1(PBS1)
④ 相位缓冲段 2(PBS2)

4.CAN FD 简介

CAN FD 采用两种速率,控制段和仲裁段等使用标准的 CAN 速率,但是数据段会切换到更高的通信速率,比如 5Mbps。CAN FD 也对数据长度做了扩展,最大支持 64 字节。
在这里插入图片描述
改进:
1.增加一些控制位
EDL:用于指示当前为 CAN 帧还是 CAN FD 帧,标准 CAN 中此位为显性,在 CAN FD 中此位为隐性。
BRS:速率转换开关,为隐性的时候转换为可变速率,此时速率可变,BRS 到 CRC 之间使用可变速率。为显性的时候速率不变。
ESI:错误状态指示位,隐性的时候表示节点处于被动错误状态,显性的时候表示节点处于主动错误状态。
2.优化 CRC 算法
传统的 CAN 协议中,使用位填充的方式来保持同步,但是这种方法会对 CRC 造成干扰,导致错帧漏检。CAN FD 为此对 CRC 算法进行了优化,将填充位加入到差错校验码中进行计算,也就是以填充位的位流进行计算。

二、驱动开发

原理图:
在这里插入图片描述
CAN1_TX 和 CAN1_RX 是 STM3MP1 FDCAN 的发送和接收引脚,对应 STM32MP1 的 PH13 和 PI9 两个引脚。正点原子 STM32MP1 开发板上的 CAN FD 收发芯片有三种:MCP2562FDT、TJA1042T/3 或者 SIT1042T/3,这三种芯片 Pin to Pin 兼容,使用起来没有区别。SIT1042T/3为国产芯片,这里就以此为例进行开发。
R36 是一个 120 欧的端接匹配电阻。CAN_FD_STBY 是 SIT1042T/3 的高速与待机模式选择引脚,低电平为高速模式,连接在 PF12 引脚上,本节没有使用。

1.修改设备树

ST 原厂提供的设备树已经配置好了 FDCAN1 的节点信息,相关文档为 Documentation/devicetree/bindings/net/can/m_can.txt。在 stm32mp157-pinctrl.dtsi 文件中,存在 CAN 节点:
在这里插入图片描述
其引脚使用与开发板上的一致,所以不需要修改。

2.FDCAN1控制器节点

在 stm32mp153.dtsi 中,存在 m_can 节点:
在这里插入图片描述
根据 compatible 属性可以找到 STM32MP1 的 FD CAN 驱动源文件,为 drivers/net/can/m_can/m_can_platform.c。status 默认关闭。所以在自己的设备树中对其进行使能。在 stm32mp157d-atk.dts 中添加以下节点:

&m_can1 {
	pinctrl-names = "default", "sleep";
	pinctrl-0 = <&m_can1_pins_a>;
	pinctrl-1 = <&m_can1_sleep_pins_a>;
	status = "okay";
};

FDCAN1 两个状态的 pinctrl 节点分别为:m_can1_pins_a 和 m_can1_sleep_pins_a,并将 m_can1 节点的 status 属性改为“okay”,也就是使能 FDCAN1。

3.修复 m_can_platform.c

原子哥使用的教程中,ST官方对5.4.31版本的 CAN 驱动进行了维护,所以如果使用原子提供的内核源码,会出现不能进行收发数据的情况。可以从官方下载该版本的代码,或者使用原子哥提供的5.4.19版本驱动进行替换。即替换 m_can_platform.c 文件,位于源码目录下的 drivers/net/can/m_can/m_can_platform.c。

4.使能 CAN 总线

首先打开 CAN 总线子系统,在 Linux 下 CAN 总线是作为网络子系统的,在menuconfig中选中相应配置:
在这里插入图片描述

5.使能FDCAN外设驱动

在这里插入图片描述

三、运行测试

编译出新的内核镜像和设备树,然后启动开发板。
Linux 系统中把 CAN 总线接口设备作为网络设备进行统一管理,所有使用ifconfig -a命令查看所有网卡。
在这里插入图片描述

1.移植 iproute2 和 can-utils 工具

iproute2 是 Linux 上有关 TCP/IP 网络的一系列工具。需要此工具进行配置 CAN 网络
设备。
在 buildroot 的 menuconfig 中进行使能:
在这里插入图片描述
can0 网卡的收发测试需要使用 can-utils 工具,在buildroot中路径如下:
在这里插入图片描述
然后使用sudo make编译出新的根文件系统即可。

2.测试

由于手头没有相应的转接线,所以就贴上相关命令和原子哥的图。

1)收发测试:

设置 CAN 接口速率:

ip link set can0 type can bitrate 1000000

设置 can0 速度为 1000Kbit / 秒,两个 CAN 设备的速度要设置为相同速率。
打开 can0 网卡:

ifconfig can0 up

接收数据命令:

candump can0

在上位机使用 USB 转 CAN 设备,然后就可以通过串口助手发送信息。
在这里插入图片描述
开发板发送信息:

cansend can0 5A1#11.22.33.44.55.66.77.88

cansend 命令用于发送 can 数据,“5A1”是帧 ID,“#”号后面的“11.22.33.44.55.66.77.88”就是要发送的数据,十六进制。CAN2.0 一次最多发送 8 个字节的数据,8 个字节的数据之间用“.”隔开。
关闭 can0:

ifconfig can0 down

2)CAN FD协议测试

CAN FD 的波特率最高为 1MBit/s,数据波特率为 5 MBit/s。

ip link set can0 up type can bitrate 1000000 dbitrate 5000000 fd on
ip link set can0 up type can bitrate 200000 dbitrate 1000000 fd on
ip link set can0 up type can bitrate 100000 dbitrate 500000 fd on

这是三种不同的速率设置,可以根据实际情况进行修改。
然后使用以下命令打开开发板的接收功能:

candump can0

从上位机发送数据,就可以在开发板接收到信息。
从开发板发送数据:

cansend can0 123##300.11.22.33.44.55.66.77.88.99.aa.bb.cc.dd.ee.ff.00.11.22.33.44.55.66.77.88.99.aa.bb.cc.dd.ee.ff.00.11.22.33.44.55.66.77.88.99.aa.bb.cc.dd.ee.ff.00.11.22.33.44.55.66.77.88.99.aa.bb.cc.dd.ee.ff

CAN FD 一次最多能收发 64 个字节的数据。

3. CAN 500K 收发异常处理方法

使用标准 CAN 进行收发测试时,可能会出现使用 500K 波特率时开发板接收有问题,这个问题需要修改 TF-A 下的 PLL4 频率。打开 TF-A 源码中的 fdts/stm32mp157d-atk.dtsi 文件:
在这里插入图片描述
修改cfg设置,配置方法可以参考 docs/devicetree/bindings/clock/st,stm32mp1-rcc.txt。
默认配置下 PLL4R=74.25MHz,修改后为 60MHz,也就是将 FDCAN 的时钟源设置为 60MHz。重新编译 TF-A,然后启动开发板即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/132387.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构排序

文章目录直接插入排序直接插入排序 核心代码 void InsertSort(int arr[], int n) {for (int i 2; i < n; i) ///直接从第二个元素开始遍历{if (arr[i - 1] > arr[i]) //判断前一个元素和当前元素的大小&#xff0c;若前一个元素小于当前元素才需要插入{arr[0] …

Markdown之折叠语法以及表格内父子折叠

背景 在编写接口文档的时候发现一些特别扭的问题&#xff0c;就是一个表格来说明入参和出参的时候&#xff0c;怎么去表达嵌套的父子关系呢&#xff1f;查看了大厂的接口文档&#xff0c;比如微信支付&#xff0c;他们是有完善的接口文档页面&#xff0c;也都全部标记出了表格…

pycharm-qt5-基础篇1

pycharm-qt5-基础篇1一: QT5介绍1> 主要的特性2> pycharm 外部工具及功能1. Qt Designer2. PyUic3> PyUrcc二: pycharm QT5 环境搭建1> 虚拟环境搭建2> 安装 pyqt5、pyqt5-tools3> 将QT工具添加到环境变量4> 配置PyCharm三: QT5 demo四: pyinstaller 打包…

Java 并发编程知识总结【三】

4. CompletableFuture 4.1 Future 和 Callable 接口 Future 接口定义了操作异步任务执行一些方法&#xff0c;如获取异步任务的执行结果、取消任务的执行、判断任务是否被取消、判断任务执行是否完毕等。 Callable 接口中定义了需要有返回的任务需要实现的方法。 使用途径&am…

详解Spring面试AOP

文章目录什么是 AOP&#xff1f;AOP作用AOP核心概念&#xff08;来自黑马程序课程&#xff09;AOP 解决了什么问题&#xff1f;AOP 为什么叫做切面编程&#xff1f;总结1 AOP的核心概念2 切入点表达式3 五种通知类型4 通知中获取参数AOP是面向切面编程&#xff0c;是一个设计思…

Java同学录系统同学录网站

简介 用户注册可以创建班级&#xff08;创建者即为群主&#xff09;&#xff0c;用户也可以查找班级申请加入&#xff0c;群主添加同学的联系方式等&#xff0c;可以在班级里留言&#xff0c;管理相册等&#xff0c;还可以指定其他人为群主或者解散班级群&#xff0c;群里的用…

【ROS】—— ROS快速上手(一)

文章目录前言1. ROS-melodic 安装2. ROS基本操作2.1 创建工作空间2.2 创建功能包2.3 HelloWorld(C版)2.4 HelloWorld(Python版)3. Vscode ROS 插件4. vscode 使用基本配置4.1 启动 vscode4.2 vscode 中编译 ros5. launch文件演示6. ROS文件系统7. ROS文件系统相关命令前言 &…

EMNLP22评测矩阵:FineD-Eval: Fine-grained Automatic Dialogue-Level Evaluation

总结 在选择维度时&#xff0c;有点意思。 FineD-Eval: Fine-grained Automatic Dialogue-Level Evaluation 一般对话生成任务的评测也是从多个维度出发&#xff0c;这篇文章先选择了几个相关性程度低的维度&#xff0c;然后&#xff0c;在挑选后的维度上&#xff0c;测评相…

动态规划经典题:编辑距离(hard) 详解,看了还不会你来砍我

&#x1f9f8;&#x1f9f8;&#x1f9f8;各位大佬大家好&#xff0c;我是猪皮兄弟&#x1f9f8;&#x1f9f8;&#x1f9f8; 文章目录一、最长公共子序列二、两个字符串的删除操作三、编辑距离Hard为了更好的理解&#xff0c;我们从易到难的来解决编辑距离的问题一、最长公共…

Tic-Tac-Toe可能棋局遍历的实现(python)

目录 1. 前言 2. 算法流程 3. 代码实现 4. 一个思考题&#xff1a;代码实现中的一个坑 5. 结果正确吗&#xff1f; 1. 前言 在上一篇博客中&#xff1a;Tic-Tac-Toe可能棋局搜索的实现&#xff08;python&#xff09;_笨牛慢耕的博客-CSDN博客Tic-Tac-Toe中文常译作井字棋…

基础数学(五)——数值积分

文章目录考试要求基础概念代数精度&#xff08;必考题&#xff09;代数精度的定义求代数精度的例题&#xff08;期末考试数值积分第一个大题&#xff09;数值积分公式的构造插值型求积公式&#xff08;必考题&#xff09;插值型数值积分公式定理Newton-Cotes求积公式Cotes公式代…

webpack 学习

1.拆分、合并 webpack-merge devlopment production 2.webpack-dev-serve devServer: { port contentBase progress open compress proxy:{ xxx:{ target:..., pathRewrite:{ "^/api" }, changeOrigin:true } } } 3.处理样式 css module:{ rules:[ { test:/\.sc…

qt开关控件设计(手把手从零开始)

从零开始手把手教你设计自己的qt控件1 说明1.1 显示效果1.2 控件特性1.3 设计方法2 控件需求分析2.1 必要需求2.1 顺带需求&#xff08;锦上添花&#xff09;3 功能设计3.1 设计思路&#xff08;重点内容&#xff09;3.2 自适应大小3.3 开关动画3.4 控件绘制4 总体代码1 说明 …

推动新能源越野场景革命 坦克品牌开创越野新生态

近日&#xff0c;坦克品牌以“创领越野新生态”为主题&#xff0c;携多款车型登陆第二十届广州国际汽车展览会。秉持“以用户为中心”&#xff0c;坦克品牌围绕技术与生态双线出击&#xff0c;正式亮相坦克500 PHEV长续航版、生活方式共创平台TANK Life。技术创领&#xff0c;打…

docker-ui创建使用

首先需要安装docker: apt install docker.io composer也需要安装&#xff1a; apt install composer docker查找docker-ui镜像&#xff1a; docker search docker-ui 在列表里选一个镜这里就选第一个。 docker pull builtdock/docker-ui 然后直接docker run 使用的时候&#x…

DSL操作ElasticSearch基础命令

文章目录一、DSL操作ES-RESTful风格二、DSL操作索引库2.1 PUT 添加索引2.2 GET 查询索引2.3 DELETE 删除索引2.4 POST 打开/关闭索引库三、DSL操作映射3.1 数据类型3.1.1 简单数据类型3.1.2 复杂数据类型3.2 创建索引库并设置映射3.2.1 语法格式3.2.2 举例3.3 查询索引库映射3.…

python中的类型注解

目录 一.类型注解 变量的类型注解 类型注解的语法 类型注解主要功能在于: 函数方法的类型注解 函数&#xff08;方法&#xff09;形参进行类型注解 函数&#xff08;方法&#xff09;返回值进行类型注解 小结 Union类型 小结 一.类型注解 变量的类型注解 思考 为什么…

Android美团多渠道打包Walle集成

一、为什么使用美团多渠道打包的方式&#xff1f; 打包更加快速 传统的通过productFlavors渠道包的方式&#xff0c;渠道10个以内还可以接受&#xff0c;如果100个渠道包&#xff0c;每个包需要打5Min,就是将近10个小时的打包&#xff0c;而采用美团Walle多渠道打包的方式只需…

PyTorch 2.0 推理速度测试:与 TensorRT 、ONNX Runtime 进行对比

PyTorch 2.0 于 2022 年 12 月上旬在 NeurIPS 2022 上发布&#xff0c;它新增的 torch.compile 组件引起了广泛关注&#xff0c;因为该组件声称比 PyTorch 的先前版本带来更大的计算速度提升。 这对我们来说是一个好消息&#xff0c;训练时间改进的结果令人印象深刻。PyTorch 团…

JavaScript 入门基础 - 流程控制(四)

JavaScript 流程控制 - 分支和循环 文章目录JavaScript 流程控制 - 分支和循环1. 什么是流程控制2. 顺序流程控制3. 分支流程控制 之 if语句3.1 什么是分支结构3.2 if 语句3.2.1 if 语句基本理解3.2.2 if 语句执行流程3.2.3 if 语句案例3.3 if else语句&#xff08;双分支语句&…