linux CAN驱动实验
CAN简介
CAN 全称(Controller Area Network)控制局域网络。最早是由德国BOSCH(博世)开发,是当前应用最广泛的现场总线之一。应用领域汽车电子、工业自动化、医疗、工业和船舶等。
CAN特点:
1)多主控制
在总线空闲时,所有单元都可以发送消息。多个节点发送消息时,根据节点ID决定优先级。
2)系统的柔软性
3)通信速度快
最高1M(举例小于40M),最长10KM,速度低于5Kbps
4)具有错误检测、错误通知和错误恢复功能
5)连接节点多
CAN协议
协议提供5种帧格式来传输数据:数据帧、遥控帧、错误帧、过载帧和间隔帧。其中数据帧和遥控帧有标准格式和扩展格式。
原理图:
修改设备树
imx6ull.dtsi文件中,compatible 属性就可以找到 I.MX6ULL 的 FlexCAN 驱动源文件。
flexcan1: can@02090000 {compatible = "fsl,imx6ul-flexcan", "fsl,imx6q-flexcan";reg = <0x02090000 0x4000>;interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>;clocks = <&clks IMX6UL_CLK_CAN1_IPG>,<&clks IMX6UL_CLK_CAN1_SERIAL>;clock-names = "ipg", "per";stop-mode = <&gpr 0x10 1 0x10 17>;status = "disabled";};
打开imx6ull-alientek-emmc.dts,添加引脚配置信息
pinctrl_flexcan1: flexcan1grp{fsl,pins = <MX6UL_PAD_UART3_RTS_B__FLEXCAN1_RX 0x1b020MX6UL_PAD_UART3_CTS_B__FLEXCAN1_TX 0x1b020>;};
追加节点信息,并将status设置为"OK"
&flexcan1 {pinctrl-names = "default";pinctrl-0 = <&pinctrl_flexcan1>;xceiver-supply = <®_can_3v3>;status = "okay";
};
内核使能CAN总线
1)打开CAN总线子系统,
-> Networking support <*> CAN bus subsystem support
2)使能Freescale系列的FlexCAN外设驱动
-> Networking support -> CAN bus subsystem support -> CAN Device Drivers <*> Platform CAN drivers with Netlink support <*> Support for Freescale FLEXCAN based chips
需要移植的工具
1)iproute2
2)can-utils
通信测试
1)回环测试
root@ATK-IMX6U:~# ifconfig can0 down
root@ATK-IMX6U:~# ip link set can0 type can bitrate 500000 loopback on
root@ATK-IMX6U:~# ifconfig can0 up
root@ATK-IMX6U:~# candump can0 &
[1] 900
root@ATK-IMX6U:~# cansend can0 5A1#11.22.33.44.55.66.77.88can0 5A1 [8] 11 22 33 44 55 66 77 88
如果can0 开启先关闭
设置回环测试模式,并设置can0的速度为500Kbit/s,非回环测试去掉loopback on
打开can1
candump后台接受数据
cansend cano 发送数据
cansend命令发送can数据,51A是帧ID,#后面是发送的数据。can2.0一次最多发送8个字节,8个字节之间用 . 隔开。
测试成功,后台接收到自己发给自己的数据。
应用程序 loopback
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <linux/can.h>
#include <linux/can/raw.h>#define PF_CAN 29
#define AF_CAN PF_CANint main(int argc, char *argv[])
{int fd, ret, flag, len;char senddata[32] = "hello";struct sockaddr_can addr;struct ifreq ifr;struct can_frame frame;socklen_t socket_len = sizeof(struct sockaddr_can);fd = socket(PF_CAN, SOCK_RAW, CAN_RAW); if (fd < 0) {printf("Open socket failed!\n");return fd;}strcpy((char *)(ifr.ifr_name), "can0");ret = ioctl(fd, SIOCGIFINDEX, &ifr);if (ret != 0) {ERR_MSG("SIOCGIFINDEX failed! ret:%d\n", ret);close(fd);return ret;}printf("can0 can_ifindex = %x\n",ifr.ifr_ifindex);flag = 1;//1:代表回环 0:关闭ret = setsockopt(fd, SOL_CAN_RAW, CAN_RAW_LOOPBACK, &flag, sizeof(flag));if (ret != 0) {printf("Set loopback disable failed! ret:%d\n", ret);close(fd);return ret;}DBG_MSG("Set can0 loopback disable\n");flag = 1;//1 代表接收 0 代表关闭ret = setsockopt(fd, SOL_CAN_RAW, CAN_RAW_RECV_OWN_MSGS, &flag, sizeof(flag));if (ret != 0) {printf("Disable receiving own message failed! ret:%d\n", ret);close(fd);return ret;}addr.can_family = AF_CAN;/* Use AF_CAN protocol family */addr.can_ifindex = ifr.ifr_ifindex;/* Binding socket */ret = bind(fd, (struct sockaddr*)&addr, sizeof(addr));if (ret != 0) {printf("Bind socket failed! ret:%d\n", ret);close(fd);return ret;}printf("Bind can0 socket\n");frame.can_id = 0x123;len = strlen(senddata);while (1) {strncpy((char *)frame.data, senddata, len);frame.can_dlc = len;ret = sendto(fd, &frame, sizeof(struct can_frame), 0, (struct sockaddr*)&addr, sizeof(addr));if (ret > 0) {printf("Send success: [%s], ret=%d\n", senddata, ret);ret = recvfrom(fd, &frame, sizeof(struct can_frame), 0, (struct sockaddr *)&addr, &socket_len);if (ret > 0) {printf("Recv message: [%s], ret=%d\n", frame.data, ret);}}usleep(500000);}return 0;
}
linux CAN驱动实验相关推荐
- cups源码下载 linux_正点原子Linux第七十章Linux WIFI驱动实验
1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第七十章Linux WIFI驱动实验 WIFI的使用已经 ...
- linux i2c adapter 增加设备_「正点原子Linux连载」第六十二章Linux SPI驱动实验(一)...
1)实验平台:正点原子Linux开发板 2)摘自<正点原子I.MX6U嵌入式Linux驱动开发指南>关注官方微信号公众号,获取更多资料:正点原子 第六十二章Linux SPI驱动实验 上一 ...
- 【正点原子Linux连载】第六十七章 Linux USB驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
- 韦东山 IMX6ULL和正点原子_正点原子Linux第五十七章Linux MISC驱动实验
1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第五十七章Linux MISC驱动实验 misc的意思是 ...
- 【正点原子MP157连载】第四十章 Linux I2C驱动实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7
1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...
- 【正点原子Linux连载】第六十二章 Linux SPI驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
- 【正点原子Linux连载】第七十章 Linux WIFI驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
- 【正点原子Linux连载】第六十章 Linux RTC驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
- 【正点原子Linux连载】第六十一章 Linux I2C驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
- Linux LCD 驱动实验
目录 Linux 下LCD 驱动简析 1 Framebuffer 设备 LCD 驱动简析 硬件原理图分析 LCD 驱动程序编写 运行测试 LCD 屏幕基本测试 设置LCD 作为终端控制台 LCD 背光 ...
最新文章
- Python 循环中的陷阱
- linux可以打开浏览器嘛,Linux下怎样可以打开浏览器
- 走进JVM之一 自己编译openjdk源码
- Spring Boot 静态资源处理,原来如此!
- SQL疑难杂症【4 】大量数据查询的时候避免子查询
- 黑色背景下,描绘照片的轮廓形状并保存
- PowerShell与活动目录
- string插入字符_String类
- 51单片机c语言计数程序,51单片机INTOINT1中断计数c语言源程序.doc
- ZOJ 1015 弦图判定
- dubbo之failed to connect to server /xx.xx.xx.xx:20880 client-side timeout问题解决
- 4. 多元函数微分学
- Cortex-M0 Devices introduction
- erp352产品安装手册
- 关键字private、static总结
- 这个国庆,我去佛山看舞狮,太惊艳!
- 淘宝买家秀后台操作与各场景展示逻辑
- 数据清洗 Chapter07 | 简单的数据缺失处理方法
- raid卷的作用_raid是什么?为什么要用raid?有好什么好处?
- 为什么机器人运动学逆解最好采用双变量反正切函数atan2而不用反正/余弦函数?
热门文章
- 使用 SwitchHosts 一个修改、管理、切换多个 hosts 无法生效问题
- elementui 表格插入图片并且鼠标移入放大
- python从键盘输入10个整数、求平均数_编程:从键盘输入10个整数存入数组啊,输入该数组各元素,并求其最大值,最小值和平均值...
- Apollo 3 plus GPIO配置
- idea注释模板设置
- BPR:个性化排名推荐系统
- linux解决文件上传失败的问题
- 通过 Java 代码获取 JVM 参数
- win10系统如何配置web服务器,win10怎么搭建web服务器方法教程
- Java 基础语法 —— 厚积薄发