完整Android CAN总线程序开发

转自


http://blog.csdn.net/mc_hust/article/details/44542217

最近在研究一块TI公司的TMDEVM-AM3358开发板,这是一款硬件资源相当丰富并且性能非常好的工业评估板,我重点需要用到板上的网卡、串口以及CAN总线。众所周知,在Android这样一款风靡全球的移动端操作系统内部,对于网卡的支持已经伴随这一系统本身的发展而相当完善。然而,串口线已经逐步淡出我们的视野,但是由于简单易用,在很多时刻依然派得上用场。其中最少见的应该就是CAN总线了,所以在调试CAN模块之中遇到了很多的问题。遗憾的是,似乎就连谷歌上也很难找到关于AM335x系列的ARM开发板CAN开发的介绍,这里就将我这段时间以来在CAN上所做的工作和遇到的问题总结一下。方便有需要的人少走弯路。

关于CAN的介绍,官方给出了一份文档,点击下载。经过了好几遍的通读之后,对他的基本步骤及意图有了一些了解,但是有一点让我感到疑惑——所有的步骤都是在PC上完成的,但是最后的使用是在ARM上,我并没有看到哪一步对ARM板进行了操作,那么最后如何实现呢?要了解这个问题,首先简单看看文档的操作步骤。 
首先我们需要将ARM板上的CAN模块启动,调节SW8,将profile设置为1。SW8在显示屏接线的下方,如下图所示: 
Profile Selection.JPG

ARM开发板运行linux系统并且不修改canutil工具源码

如果你的ARM是运行的Linux系统,那么恭喜你,TI的linux源码中已经集成了CANUTIL工具,可以直接使用。但是默认CAN驱动好像是未打开的,例如:在ARM终端

root@am335x-evm:~# canconfig can0 bitrate 50000                                 
Cannot find device "can0"                                                       
failed to set bitrate of can0 to 50000 
 
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

提示找不到can0设备,说明内核中未加入CAN驱动,那么我们需要配置驱动,方法如下: 
在内核根目录输入

gedit  Makefile
 
 
  • 1
  • 1

找到如下片段:

export KBUILD_BUILDHOST :=  (SUBARCH)ARCH?= (SUBARCH) 
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:”%”=%)

修改为:

export KBUILD_BUILDHOST := $(SUBARCH) 
ARCH ?= arm 
CROSS_COMPILE ?= arm-eabi-

此步骤目的是使当前内核编译模式为ARM平台。 
接下来输入:

make menuconfig
 
 
  • 1
  • 1

按照图示步骤依次选择: 
1. [*] Networking support —> 
网络设备支持.png
2. <*> CAN bus subsystem support —> 
CAN总线子系统支持.png
3. CAN Device Drivers —> 
CAN设备驱动.png
4. <*> Bosch D_CAN devices —> 
Bosch D_CAN设备.png
注意把这里的D_CAN打上星号。 
5. Generic Platform Bus based D_CAN driver 
通用平台D_CAN驱动.png
同样将这一项打上星号。

好了,驱动配置完毕,下面执行Make指令,随后将生成好的内核镜像制作到SD卡中,重新启动开发板,那么CAN0设备就可以使用了。 
可以尝试通过以下指令进行配置和收发: 
1. 配置can0波特率为50000 ,开启三采样模式

canconfig can0 bitrate 50000 ctrlmode triple-sampling on
 
 
  • 1
  • 1
  1. 打开can0设备
 canconfig can0 start
 
 
  • 1
  • 1
  1. 发送数据
cansend can0 -i 0x10 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88
 
 
  • 1
  • 1
  1. 接收数据
candump can0
 
 
  • 1
  • 1
ARM开发板运行android系统或者要重新编译canutil工具

如果你是用的android或者你想对CAN工具进行修改重新编译,那么还需要继续下面的步骤。 
首先同样需要在内核中配置CAN驱动,并将Profile Selection设置成1,方法同上。 
然后下载源码,官方说明中是需要下载三种源码(点击可下载): 
iproute2 
libsocket 
canutil 
但是这里我只需要用到最后一个canutil即可。

下载完成之后,首先配置环境变量,如下:

export GNUEABI=arm-arago-linux-gnueabi
export CC=$GNUEABI-gcc
export LD=$GNUEABI-ld
export NM=$GNUEABI-nm
export AR=$GNUEABI-ar
export RANLIB=$GNUEABI-ranlib
export CXX=$GNUEABI-c++
export PREFIX=$FILESYS_PATH/usr
export CROSS_COMPILE_PREFIX=$PREFIX
export PATH=$TOOL_CHAIN_PATH/bin:$PATH
export LIBSOCKETCAN_INSTALL_DIR=$LIBSOCKETCAN_PATH/install
export PKG_CONFIG_PATH=$LIBSOCKETCAN_PATH/config
export LD_LIBRARY_PATH=${LIBDIR}:${LD_LIBRARY_PATH}
export LD_RAN_PATH=${LIBDIR}:${LD_RAN_PATH}
export LDFLAGS="-Wl,--rpath -Wl,$LIBSOCKETCAN_INSTALL_DIR/lib"
export INCLUDES="-I$LIBSOCKETCAN_INSTALL_DIR/include"
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

其中PREFIX 是目标目录,可以自行设置。 
然后进入canutils-4.0.6文件夹,输入以下指令:

./configure --host=arm-arago-linux --prefix=$PREFIX --enable-debug
 
 
  • 1
  • 1

之后会根据目标平台生成相应的Makefile。接着依次执行:

make
 
 
  • 1
  • 1
make install
 
 
  • 1
  • 1

完毕之后,会在PREFIX/usr/bin下找到如下四个文件:

cansend , candump , cansequence , canecho

PREFIX/usr/sbin下找到如下一个文件:

canconfig

将这几个文件复制到android系统的/system/bin目录下(需要root权限)。这样我们就可以执行这5个命令了。 
但这时候如果直接执行,可能会出现如下错误:

root@android:/ # cansend
/system/bin/sh: cansend: No such file or directory
 
 
  • 1
  • 2
  • 1
  • 2

这说明cansend这个应用程序是动态编译的,本地缺少需要的库文件。可以在PC上通过命令readelf查看需要的库文件。

root@MC:~/android/can/usr/bin# readelf  -l  cansend
Elf file type is EXEC (Executable file)
Entry point 0x8679
There are 8 program headers, starting at offset 52

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  EXIDX          0x001074 0x00009074 0x00009074 0x00008 0x00008 R   0x4
  PHDR           0x000034 0x00008034 0x00008034 0x00100 0x00100 R E 0x4
  INTERP         0x000134 0x00008134 0x00008134 0x00019 0x00019 R   0x1
      [Requesting program interpreter: /lib/ld-linux-armhf.so.3]
  LOAD           0x000000 0x00008000 0x00008000 0x01080 0x01080 R E 0x8000
  LOAD           0x001080 0x00011080 0x00011080 0x00158 0x00170 RW  0x8000
  DYNAMIC        0x00108c 0x0001108c 0x0001108c 0x000e8 0x000e8 RW  0x4
  NOTE           0x000150 0x00008150 0x00008150 0x00044 0x00044 R   0x4
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x4
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

看到最中间显示的一句话:

[Requesting program interpreter: /lib/ld-linux-armhf.so.3]

这里需要ld-linux-armhf.so.3库文件才能使用cansend命令。这里也是android和linux在文件系统上的一个差异,android系统无法直接运行由交叉编译器动态编译出来的应用程序。这里可以参考我的另一篇博客—— 
Android系统如何运行动态编译的程序 。将ARM-linux系统中的库文件复制到android系统的/lib目录下即可。 
这时候,我们可以利用canconfig来配置can设备,也可以通过cansend、cansequence来发送数据,通过candump来接收数据,具体指令集可以参考官方文档。

以上就是这段时间以来对AM335x开发板can模块的调试过程,还是花了不少功夫的,主要原因是资料太少,除了文档就没有找到关于这套开发板的android CAN的介绍。如果大家还有什么问题,可以留言,大家一起探讨。

谢谢!

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android CAN总线是指Android系统上运行的应用程序通过控制器区域网络(Controller Area Network,CAN)总线与外部设备进行通信的一种方式。CAN总线是一种串行通信协议,常用于汽车电子系统等领域。 在Android系统中,通过使用CAN总线,应用程序可以与各种支持CAN总线通信的外设进行数据交换。这些外设包括车载传感器、车载仪表盘、控制器、发动机控制单元、空调系统等。通过CAN总线,应用程序可以通过读取和发送CAN消息来监测和控制这些外设的状态和行为。 为了在Android系统中使用CAN总线,首先需要确保设备具有CAN控制器硬件支持。可以通过使用CAN总线接口卡或通过集成CAN控制器芯片来实现。然后,需要使用适当的驱动程序来与CAN控制器进行通信。 使用AndroidCAN总线功能,应用程序可以实现诸如车辆诊断、车载娱乐系统控制、车速监测、油耗计算等各种功能。通过CAN总线,应用程序可以读取车辆传感器的数据,并根据需要发送控制指令给车辆各个系统。这为开发车联网和智能交通系统提供了便利和灵活性。 总之,Android CAN总线Android应用程序与外部CAN总线设备之间的通信提供了一种标准化的解决方案。它为开发者提供了一种便捷的方式来实现与车辆电子系统的交互,并为车联网和智能交通系统的开发提供了技术支持。 ### 回答2: Android CAN总线是指在Android系统中使用控制器局域网络(Controller Area Network,CAN)总线技术进行通信的一种方式。CAN总线是一种高可靠性、实时性强的串行通信协议,主要用于汽车电子和工业控制领域。 Android作为一种流行的移动操作系统,通过支持CAN总线技术,可以实现与各种汽车电子设备和工业控制设备之间的通信。通过Android系统的CAN总线接口,可以实现对CAN总线的读取和写入操作。这使得开发者可以通过Android设备与车载控制单元进行通信,从而实现诸如车辆状态监控、故障诊断、远程控制等功能。 在Android应用程序开发中,可以使用CAN总线接口库来编写CAN通信相关的代码。通过CAN总线接口库,开发者可以实现CAN消息的发送和接收,以及监听CAN总线上的消息。开发者可以根据具体需求,编写相应的逻辑代码,对CAN总线上的消息进行解析和处理,并根据解析结果进行相应的操作。 在汽车电子领域,Android CAN总线的应用非常广泛。通过与车辆的CAN总线进行通信,可以获取诸如车速、油耗、转速、温度等数据。这些数据可以用于实时监控和驾驶辅助功能的开发。此外,通过CAN总线还可以实现对车辆的远程控制,如远程启动、远程解锁等。 总之,Android CAN总线技术的应用使得Android设备可以与CAN总线上的设备进行通信,极大地拓展了Android系统的应用领域。从汽车电子到工业控制,Android CAN总线为各种应用场景提供了便捷的通信方式,为开发者提供了更多的创新空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值