大家好,今天主要和大家分享一下,如何使用linux系统下的CAN驱动实验。
目录
第一:CAN通信基本简介
第二:CAN通信的主要特点
第三:CAN通信协议
第四:程序代码的具体实现
第五:使能Linux内核自带的FlexCAN驱动
第一:CAN通信基本简介
CAN的全称是控制局域网络。CAN最早是由德国博世公司开发的,当前应用最广泛的现场总线之一。以汽车电子为例,汽车上有空调、车门、发动机,大量的传感器,这些部件都是通过CAN总线连在一起的形成一个网络。
各个单元通过CAN总线连接在一起,每个单元是独立的CAN节点。同一个CAN网络中所有单元的通信速度必须一致,不同的网络之间通信速度可以不同。例如:125Kbps的CAN网络下所有的节点速度都是125Kpbs的,整个网络由一个网关与其他网络进行连接。
第二:CAN通信的主要特点
1、多主控制
在总线空闲时,所有单元都可以发送消息,而两个以上的单元同时开始发送消息时,根据标识符(Identifier以下称为ID)决定优先级。ID并不是发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各个消息ID的每个位进行仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失败的单元则立刻停止发送而进行接收工作。
2、系统的柔软性
与总线相连接的单元没有类似于“地址”的信息。因此总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。
3、通信速度快,距离远
最高1Mbps(距离小于40M),最远可达10KM(速率小于5Kbps)。
4、具有错误检测,错误通知和错误恢复功能
所有单元都可以检测错误(错误检测功能),检测出错误的单元会立即通知其他所有单元(错误通知功能),正在发送消息单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送直到发送成功为止(错误恢复功能)。
5、故障封闭功能
CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将 引起此故障的单元从总线上隔离出去。
6、连接节点多
CAN总线是可同时连接多个单元的总线。可连接的单元数量理论上是没有限制的。但实际上可连接的单元数量受总线上的时间延时及电气负载的限制。降低通信速度,可连接单元数量增加;提高通信速度,则可连接的单元数量减少。
第三:CAN通信协议
通过CAN总线协议传输数据是需要按照一定协议进行的,CAN协议提供了5种帧格式来传输数据:数据帧、遥控帧、错误帧、过载帧和帧间隔。其中数据帧和遥控帧有标准格式和扩展格 式两种,标准格式有 11 位标识符(ID),扩展格式有 29 个标识符(ID)。
第四:程序代码的具体实现
可以到开发板原厂提供的设备树下进行配置。
1
、
FlexCAN1
引脚节点信息
首先肯定是
CAN1
引脚配置信息,打开
imx6ull-alientek-emmc.dts
,找到如下所示内容:
示例代码 66.3.1.1 CAN1 引脚信息
1
pinctrl_flexcan1
:
flexcan1grp
{
2
fsl
,
pins
= <
3
MX6UL_PAD_UART3_RTS_B__FLEXCAN1_RX
0x1b020
4
MX6UL_PAD_UART3_CTS_B__FLEXCAN1_TX
0x1b020
5
>;
6
};
第
3
和第
4
行将
UART3_RTS
和
UART3_CTS
这两个引脚分别复用为
FlexCAN1
的
RX
和
TX
,电气属性都设置为
0x1b020
。
2
、
FlexCAN1
控制器节点信息
打开
imx6ull.dtsi
文件,找到名为“
flexcan1
”的节点,内容如下:
示例代码 66.3.1.2 imx6ull.dtsi 文件 flexcan1 节点信息
1
flexcan1
:
can@02090000
{
2
compatible
=
"fsl,imx6ul-flexcan"
,
"fsl,imx6q-flexcan"
;
3
reg
= <
0x02090000 0x4000
>;
4
interrupts
= <
GIC_SPI
110
IRQ_TYPE_LEVEL_HIGH
>;
5
clocks
= <&
clks IMX6UL_CLK_CAN1_IPG
>,
6
<&
clks IMX6UL_CLK_CAN1_SERIAL
>;
7
clock
-
names
=
"ipg"
,
"per"
;
8
stop
-
mode
= <&
gpr
0x10 1 0x10 17
>;
9
status
=
"disabled"
;
10
};
注意示例代码
66.3.1.2
中的
flexcan1
节点不需要我们修改,这里只是告诉大家
FlexCAN1
完整节点信息。根据第
2
行的
compatible
属性就可以找到
I.MX6ULL
的
FlexCAN
驱动源文件,
驱动文名为
drivers/net/can/flexcan.c
。第
9
行的
status
属性为
disabled
,所以
FlexCAN1
默认关闭
的。在
imx6ull-alientek-emmc.dts
中添加使能
FlexCAN1
的相关操作,找到如下所示代码:
1
&
flexcan1
{
2
pinctrl
-
names
=
"default"
;
3
pinctrl
-
0
= <&
pinctrl_flexcan1
>;
4
xceiver
-
supply
= <&
reg_can_3v3
>;
5
status
=
"okay"
;
6
};
第
3
行指定
FlexCAN1
所使用的
pinctrl
节点为
pinctrl_flecan1
,也就是示例代码
66.3.1.1
中
的
pinctrl
节点。
第
4
行
xceiver-supply
属性指定
CAN
收发器的电压为
3.3V
。
第
5
行将
flexcan1
节点的
status
属性改为“
okay
”,也就是使能
FlexCAN1
。
第五:使能Linux内核自带的FlexCAN驱动
我们需要配置Linux内核中集成的FlexCAN驱动,但是没有使能,需要配置Linux内核,打开FlexCAN驱动。
-> Networking support
-> <*> CAN bus subsystem support //打开 CAN 总线子系统
接着Freescale系CPU的FlexCAN外设驱动
-> Networking support
-> CAN bus subsystem support
-> CAN Device Drivers
-> Platform CAN drivers with Netlink support
-> <*> Support for Freescale FLEXCAN based chips //选中
配置好以后重新编译内核,然后新的内核和设备启动开发板。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)