can总线

控制器局域网协议CAN是德国博世公司开发的一套串行总线通讯协议,特别适用于智能设备之间的互联来构成智能系统或子系统。CAN是一种基于广播通讯机制的协议,这种机制通过使用一种面向消息的传输协议来实现,在这种协议下,不定义具体的站点和站点地址,只定义消息。而通过消息标识符来区别不同的消息。而且很容易向一个CAN网络中添加一个节点,当这一节点仅作为接收者时甚至不需要对己有的节点的软硬件做任何的改动。

        CAN遵循ISO/OSI标准模型,定义了OSI模型的数据链路层(包括逻辑链路控制子层LLC和媒体访问子层MAC)和物理层。其中MAC(媒体访问控制子层)是其核心层。MAC子层可分为完全独立工作的两个部分,即发送部分和接收部分。

    

              图1   CAN总线模型

        物理层是实现电器控制单元与总线相连的电路。电器控制单元的总数取决于总线的电力负载。信号使用差分电压传送,两条信号线被称为CAN_H和CAN_L。静态时均是2.5v左右,此时状态表示为逻辑“1”,也可以叫做隐性。用CAN_H比CAN_L高表示逻辑“0”,称为显性,此时通常电压值为CAN_H=3.5V和CAN_L=1.5V。

      

                    图2物理层逻辑电平

        CAN总线是一种串行数据通信总线,其通信速率最高可达1Mb/sCAN系统内两个任意节点之问的最大传输距离与其位速率有关。当CAN的传输速率达1Mb/s时,最大传输距离为40米,对一般实时控制现场来说足够使用。

        CAN采用了CSMA/CD机制实现总线访问。利用CSMA访问总线,可对总线上信号进行检测,只有当总线处于空闲状态时,才允许发送。在CAN总线上发送的每一条报文都具有唯一的一个11位或29位数字的IDCAN总线状态取决于二进制数“0”而不是“1”,所以ID号越小,则该报文拥有越高的优先权,因此一个为全“0”标识符的报文具有总线上的最高级优先权。

        CAN的标准消息帧结构为CAN 2.0A的消息帧格式,也就是CAN消息帧的标准格式,它有11位标识符。基于CAN2.0A的网络只能接收这种格式的消息。

           

                                                          图3标准数据帧格式

                

                                                图4 扩展数据帧格式

数据帧数据帧由7个不同的位场组成,即帧起始、仲裁场、控制场、数据场、CRC场、应答场和帧结束。其中数据场长度可为0

帧起始(SOF):标志数据帧和远程帧的开始,它仅由一个“显性”位构成,只有在总线处于空闲状态时,才允许开始发送。所有站必须同步于首先开始发送的那个站的帧起始前沿。

仲裁场:在标准格式中,仲裁场由11位标识符和TRR位组成;在扩展格式中,仲裁场由29位标识符和SRR位、标识位以及RTR位组成。

RTR(远程传输请求位):在数据帧中,RJR位必须是“显性”电平,而在远程帧中,RTR位必须是“隐性”电平。

SRR(替代远程请求位):在扩展格式中始终为“隐性”位。

DIE(标识符扩展位)IDE位对于扩展格式属于仲裁场;对于标准格式属于控制场。IDE在标准格式中为“显性”电平,而在扩展格式中为“隐性”电平。

控制场:由6位组成。在标准格式中,一个信息帧中包括DLC、发送“显性”电平的DIE位和保留位r0。在扩展格式中,一个信息帧包括DLC和两个保留位r1r0,这两个位必须发送“显性”电平。

DLC(数据长度码):数据场的字节数目由数据长度码给出。数据长度码为4位,在控制场中被发送。

数据场:由数据帧中被发送的数据组成,可包括08个字节。

CRC场:包括CRC序列和CRC界定符。

应答场:包括两位,即应答间隙和应答界定符。在应答场中发送站送出两个“隐性”位。一个正确接收到有效报文的接收器,在应答间隙期间,将此信息通过传送一个“显性”位报告给发送器。所有接收到匹配CRC序列的站,通过在应答间隙内把“显性”位写入发送器的“隐性”位来报告。应答界定符是应答场的第二位,并且必须是“隐性”位。

帧结束:每个数据帧和远程帧均由7个“隐性”位组成的标志序列界定。




这两天在研究车载can总线,因为对于车上的can总线的接口以及波特率没有对应的资料可查(不同的车接口都不一样,波特率也可能不同),

做一想要从车上测出can总线上的数据还不太容易。

于是我首先使用示波器(我使用的示波器型号是TDS 220)来找出汽车上can总线的接口,然后测出can总线的波特率,测量波特率的步骤如下:

1、将示波器的两个接口(接地和探头)分别接在can总线的两条线(CAN_H和CAN_L)上,
这里需要注意如果CAN线上需要接一个120欧姆的负载电阻,否则波形是不规整方波,
接上负载之后才是规整的方波。

2、此时如果can线上有数据,则会在示波器上显示出方波如图1所示。(这里使用示波器的RUN/STOP按钮捕捉波形)

                                                     图1

2、但是此时因为示波器显示的数据太多还无法读取单个脉冲的周期,
所以需要调节示波器的X轴的每格所代表的周期(调节SEC/DIV旋钮)
然后使用RUN/STOP按钮重新捕捉波形得到图2所示的波形,

                                                       图2

3、最后将图2中宽度较小的脉冲再次放大(调节SEC/DIV)直到图3所示,这时每格代表1us
可以看到这个脉冲跨度为8us

                                                      图3

所以最终得到该can总线的波特率为1s/8us=125K



这里的数据使用的是标准的can设备产生的can信号(扩展帧发送数据ID=0x11121181  Data=0x06 0x08)

信号的波形如图1所示,这里示波器的探头接的是CAN_H,探头的夹子接的是CAN_L:

                                     图1  示波器显示波形

首先根据本博客中前面写的一篇如何测量can总线波特率获取总线的波特率,然后依据波特率和上面的波形读出具体的数据

从上面的波形中读取到的数据是

10111011101100011110111001111101011111001111101001111100111101111011011101

根据标准can2.0b协议可以讲该字符串解析出来,标准的扩展协议如图2所示

                                                            图2 can扩展消息格式

然后将数据根据格式划分成各个有意义的字段,如图3所示,这里我自己将高电平编码为1,低电平编码为0。但是在can协议中,他将高电平定义为显性位,逻辑上定义为0,将低电平定义为隐形位,逻辑上定义为1,我们前面先不管这个。

                                                                                                 图3  数据分割

在can的协议中当连续出现5个高电平时就需要插入一个低电平,所以在解析的过程中需要将这些插入的数据删除,就是图3中用红线删除的那些数据。

在删除这些数据之后根据图2的格式可以将各个字段分割出来

解析信息:

29位ID:0 1110 1110 1101 1110 1110 0111 1110,从右到左每4位一个字段,这里需要将其在转换回can协议定义的逻辑电平的形式---即将0变为1,将1变为0,这样便符合我们日常的编码习惯。解析出来的ID=0x11121181,与我们发送的数据是相符合的。

DLC:1101  转换成十进制为2 表示这一帧中有两个数据,接下来的16个字节便表示2个数据

D1:11111001  = 0x06

D2:11110111 = 0x08

这样便解析出了我们需要的数据,这是和我发送的数据一致的。

 

这里需要注意的有两点:

1、在can的协议中当连续出现5个高电平时就需要插入一个低电平;

2、在can协议中将CAN_H和CAN_L的差值为高电平时定义为显性,逻辑上表示为0,为低电平时定义为隐形,逻辑上表示为1。这在解码的过程中需要注意。



  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Android CAN总线是指Android系统上运行的应用程序通过控制器区域网络(Controller Area Network,CAN)总线与外部设备进行通信的一种方式。CAN总线是一种串行通信协议,常用于汽车电子系统等领域。 在Android系统中,通过使用CAN总线,应用程序可以与各种支持CAN总线通信的外设进行数据交换。这些外设包括车载传感器、车载仪表盘、控制器、发动机控制单元、空调系统等。通过CAN总线,应用程序可以通过读取和发送CAN消息来监测和控制这些外设的状态和行为。 为了在Android系统中使用CAN总线,首先需要确保设备具有CAN控制器硬件支持。可以通过使用CAN总线接口卡或通过集成CAN控制器芯片来实现。然后,需要使用适当的驱动程序来与CAN控制器进行通信。 使用Android的CAN总线功能,应用程序可以实现诸如车辆诊断、车载娱乐系统控制、车速监测、油耗计算等各种功能。通过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总线为各种应用场景提供了便捷的通信方式,为开发者提供了更多的创新空间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值