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 = <&reg_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驱动实验相关推荐

  1. cups源码下载 linux_正点原子Linux第七十章Linux WIFI驱动实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第七十章Linux WIFI驱动实验 WIFI的使用已经 ...

  2. linux i2c adapter 增加设备_「正点原子Linux连载」第六十二章Linux SPI驱动实验(一)...

    1)实验平台:正点原子Linux开发板 2)摘自<正点原子I.MX6U嵌入式Linux驱动开发指南>关注官方微信号公众号,获取更多资料:正点原子 第六十二章Linux SPI驱动实验 上一 ...

  3. 【正点原子Linux连载】第六十七章 Linux USB驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  4. 韦东山 IMX6ULL和正点原子_正点原子Linux第五十七章Linux MISC驱动实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第五十七章Linux MISC驱动实验 misc的意思是 ...

  5. 【正点原子MP157连载】第四十章 Linux I2C驱动实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  6. 【正点原子Linux连载】第六十二章 Linux SPI驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  7. 【正点原子Linux连载】第七十章 Linux WIFI驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  8. 【正点原子Linux连载】第六十章 Linux RTC驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  9. 【正点原子Linux连载】第六十一章 Linux I2C驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  10. Linux LCD 驱动实验

    目录 Linux 下LCD 驱动简析 1 Framebuffer 设备 LCD 驱动简析 硬件原理图分析 LCD 驱动程序编写 运行测试 LCD 屏幕基本测试 设置LCD 作为终端控制台 LCD 背光 ...

最新文章

  1. Python 循环中的陷阱
  2. linux可以打开浏览器嘛,Linux下怎样可以打开浏览器
  3. 走进JVM之一 自己编译openjdk源码
  4. Spring Boot 静态资源处理,原来如此!
  5. SQL疑难杂症【4 】大量数据查询的时候避免子查询
  6. 黑色背景下,描绘照片的轮廓形状并保存
  7. PowerShell与活动目录
  8. string插入字符_String类
  9. 51单片机c语言计数程序,51单片机INTOINT1中断计数c语言源程序.doc
  10. ZOJ 1015 弦图判定
  11. dubbo之failed to connect to server /xx.xx.xx.xx:20880 client-side timeout问题解决
  12. 4. 多元函数微分学
  13. Cortex-M0 Devices introduction
  14. erp352产品安装手册
  15. 关键字private、static总结
  16. 这个国庆,我去佛山看舞狮,太惊艳!
  17. 淘宝买家秀后台操作与各场景展示逻辑
  18. 数据清洗 Chapter07 | 简单的数据缺失处理方法
  19. raid卷的作用_raid是什么?为什么要用raid?有好什么好处?
  20. 为什么机器人运动学逆解最好采用双变量反正切函数atan2而不用反正/余弦函数?

热门文章

  1. 使用 SwitchHosts 一个修改、管理、切换多个 hosts 无法生效问题
  2. elementui 表格插入图片并且鼠标移入放大
  3. python从键盘输入10个整数、求平均数_编程:从键盘输入10个整数存入数组啊,输入该数组各元素,并求其最大值,最小值和平均值...
  4. Apollo 3 plus GPIO配置
  5. idea注释模板设置
  6. BPR:个性化排名推荐系统
  7. linux解决文件上传失败的问题
  8. 通过 Java 代码获取 JVM 参数
  9. win10系统如何配置web服务器,win10怎么搭建web服务器方法教程
  10. Java 基础语法 —— 厚积薄发