开发板平台:珠海鼎芯D338 -- 基于i.MX6Q
]J^/`gc 系统平台:Linux3.0.35 + Busybox1.22
$z[@DB[ 1、 需要的工具
p~3 (nk<+ FlexCAN工具包:
<;lwvO libsocketcan-0.0.10.tar.bz2
.2{*>Dzi canutils-4.0.6.tar.bz2
`V2doV) 交叉编译器:
!!+LFe4su fsl-linaro-toolchain.tar.bz2
zhgvqg- X6Q\NJ"B
rcAPp 2、编译过程:
8.zYa(<2 交叉编译器:
,v#O{ma 环境变量配置命令:
0t(2^*I?> $ export PATH=<YourCompilerPath>/fsl-linaro-toolchain/bin/:$PATH
y!VL`xV h7kn
>q; libsocketcan-0.0.10:
Y&j'2!g 使用tar命令解压libsocketcan-0.0.10.tar.bz2后,使用如下命令交叉编译并安装。
bk|?>yd $./configure--prefix=<YourInstallPath>/flexcan/install --host=arm-none-linux-gnueabi
G$[Hm\V $ make && make install
MG,)|XpyWJ 9T_fq56Oh6 gE9x+g canutils-4.0.6:
J-z<&9 同样,交叉编译并安装命令如下。
~5o2jTNy`p $./configure --prefix=<YourInstallPath>/flexcan/install --host=arm-none-linux-gnueabi CC=arm-none-linux-gnueabi-gcc libsocketcan_CFLAGS="-I/<YourInstallPath>/flexcan/install/include" libsocketcan_LIBS=-lsocketcan LDFLAGS="-L/<YourInstallPath>/flexcan/install/lib"--enable-static
6F_:,b^ $ make && make install
AfpC >>=@ 'Ll'8 ps 移植拷贝安装目录下(<YourInstallPath>/flexcan/install)的所有文件到D338开发板/usr/目录下即可;
nyL$z-I) 至此,FlexCAN工具的移植就完成了,直接将文件系统打包为rootfs.tar.bz2,然后拷贝到dchip_MFGTools_Linux3.0.35_MX6Q_UPDATER工具下进行烧写启动就可以使用了,接下来,主要是FlexCAN总线的使用方法及详细说明。
2 b80b50 i8A-h6E 3、错误与解决:
}t*:EgfI 错误1:
"0Z5cQjg 编译canutils错误
YQ>O6:% canconfig.c:34:26: fatal error: libsocketcan.h: No such fileor directory
^fj30gw7\5 解决1:
a$3 ]` 将libsocketcan已编译安装目录(<YourInstallPath>/flexcan/install)下的include/can_netlink.h和libsocketcan.h文件,拷贝到canutils4.0.6/include目录下
aMJJ|iiU E(_lm&,4+ 4、测试过程:
sD$K<nyz 准备:两个板子
CAN总线进行相应管脚对接;
@D$ogU,# OHv4Yy]$B 开发板命令:
30YH}b#B 设置比特率: $ ip link set can0 up type can bitrate 125000
AquO#A[,# 使能can0总线: $ ifconfig can0 up
nG%<n 查看can0信息: $ ifconfig can0
SB`xr!~A] p_i',5H( 发送数据到0x123地址:
gnadx52FP $ cansend can0 -i 0x123 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88
BP@V:z q2U?EP{8~ 接收0x123地址数据:
LRR)T: e}q $ canecho can0 -v
kZ= 2#. 或$ candump can0 --filter 0x123:/*未设置ID滤波 */
iD<}r?Z 或$ candump can0 --filter 0x123: 0x7FF/*设置使用ID滤波 */
WidLUv MaLH2?je^n 说明:
a@-bw4SD 接收时,未使用ID滤波,可以接收总线上的所有数据,无论ID是否正确;
3G'cDemc 接收时,使用ID滤波,就只有符合要求的ID的数据,才做接收,其他ID的数据均丢弃不管。
&\
K }l&y8,[: 使用以上测试方法测试时,发现filter id最大可用值为0x7FF;
b3ys"Vyn ID = 0x7FF = 1111111 1111 = 11bit地址,说明当前使用的是标准格式;
`7oYXk 如果想使用更多地址,需要设置为扩展帧格式。
4KR$s Kq$q Z&n#*rQ7[ 如何设置CAN总线数据帧为扩展帧格式呢?
:o:Z NU"L1dK
@ 经过查看CAN驱动
源码发现:
[OS&eK 8 在d-chip-linux3.0.35/drivers/net/can/flexcan.c中,有如下开始传输函数:
t]T't=' static int flexcan_start_xmit(struct sk_buff* skb,structnet_device *dev)
&[
,* {
n(.L=VuXn if (cf->can_id & CAN_EFF_FLAG) {
%pLqX61t= can_id = cf->can_id & CAN_EFF_MASK;
_p?s[r* ctrl |= FLEXCAN_MB_CNT_IDE | FLEXCAN_MB_CNT_SRR;
B%5"B} nG } else {
UgD)O:xaU can_id = (cf->can_id & CAN_SFF_MASK) << 18;
zYM0?O8pJ~ }
j8%Y[:~D 5lyHg{iqD if (cf->can_id & CAN_RTR_FLAG)
wRZS+^hx ctrl |= FLEXCAN_MB_CNT_RTR;
/]of@
u
$B24Cy. if (cf->can_dlc > 0) {
`/9I` <y u32 data = be32_to_cpup((__be32 *)&cf->data[0]);
a`zHx3Yg writel(data,®s->cantxfg[FLEXCAN_TX_BUF_ID].data[0]);
eIOMW9Ivt }
X`fm5y if (cf->can_dlc > 3) {
g1 =>u u32 data = be32_to_cpup((__be32 *)&cf->data[4]);
R,fAl"wMu writel(data,®s->cantxfg[FLEXCAN_TX_BUF_ID].data[1]);
^>^h|$ }
30<_` }
]]y4$[|L 查看以上源码发现:
!}sF# 由cf->can_id & CAN_EFF_FLAG 按位'与'的运算结果来判断当前是否是扩展帧格式,cf->can_id 是命令行设置的Filter ID, CAN_EFF_FLAG宏定义为0x80000000;因此,当命令行下设置ID时,使其最高位( id[31] )为1,即表示选择为扩展帧格式;0表示选择为标准帧格式。
ZZ/k7(8 而cf->can_id & CAN_RTR_FLAG用来判断是否设置远程帧请求;
+O)ZB$w4 Io tc>! 以下是源码中的结构说明:
[Fv_~F491 /*
CAmIwAx6; *Controller Area Network Identifier structure
Hz=s)6$ey *
qE8Di\? *bit 0-28 : CAN identifier (11/29 bit)
9<
S *bit 29 : error frame flag (0 = dataframe, 1 = error frame)
b`ksTO`}x *bit 30 : remote transmission requestflag (1 = rtr frame)
m_FTg)_= *bit 31 : frame format flag (0 =standard 11 bit, 1 = extended 29 bit)
c~}FYO$ */
y|NY,{:] /**
*1T~ruNqa *struct can_frame - basic CAN frame structure
7K+eI!m.s *@can_id: the CAN ID of the frame andCAN_*_FLAG flags, see above.
1bHQB$%z *@can_dlc: the data length field of the CAN frame
rV2>;FG *
@data : the CAN frame payload.
g4{0 */
0_,un^
struct can_frame {
1:_}`x=hM canid_t can_id; /* 32bit CAN_ID + EFF/RTR/ERR flags */
4q(,uk&R[ __u8 can_dlc; /* datalength code: 0 .. 8 */
uo*lW2&U __u8 data[8] __attribute__((aligned(8))); /* 设定为8字节对齐 */
M:L-j{?y_ };
,b?G]WQrHs tK
`A_hC 根据以上研究表明,想使用扩展帧格式,可按如下方法使用:
~#)9Kl7<X $ ifconfig can0 down /* 关闭CAN设备,需要先关闭CAN设备才能对其进行配置 */
9$}>O] $ ip link set can0 up type can bitrate 125000 /* 配置比特率并打开 */
b@sq}8YD|z $ ifconfig can0 /* 查看CAN信息 */
+UX}
"m~W $ cansend can0 -i 0x81234567 0x11 0x22 0x33 0x440x55 0x66 0x77 0x88 /* 发送8bytes数据到ID=0x1234567 */
r{_1M>F
D! yo$A0Ti!w $ canecho can0 -v 或
ywB0
D`s' $ candump can0 --filter 0x81234567: 或
|tz{Es<`B $ candump can0 --filter 0x81234567:0x1FFFFFFF
SpOSUpl% 最大ID地址为0x1FFFFFFF ,即:--filter 0x9FFFFFFF:
C4t~k }=.C~f]A 博客地址:
http://blog.csdn.NET/u014486599/article/details/52609509