UDS学习笔记(一)——CAN总线介绍

最近刚入职车企,在烧写汽车整车控制器的时候,接触到了UDS协议。因此想要做一个能够烧写整车控制器的硬件。在查阅网上的资料之后,发现很多的资料都不齐全,同时自己也是一个新手,对CAN总线也接触不是很多。因此看那些资料的时候也十分的困惑。我之前学习过串口,SPI,I2C等总线,因此理解CAN总线起来相对也比较容易。在之后的学习中,因此我会尽量用自己的话去形容那些比较官方的语言。

因为自己还没具有能够设计硬件的能力,使用的硬件为一些开源的电子产品:树莓派3B以及MCP2515模块。同时使用Github上开源的UDSPython库进行快速开发,如果你也想一起学习UDS协议的话,在具备这些硬件的同时,因此你还需具备Python,C++的能力。同时我对Micropython也十分感兴趣,有兴趣的朋友可以去了解一下Micropython。相信学会它能够很大程度的提升自己的能力。

首先让我们学习一下什么是CAN通信吧,我想做的东西比较复杂,因此底层基础是要打好来的。官方的话不说太多,想必能看这篇文章的对CAN总线都有一个基本的认识吧。它有由差分信号组成的两条线。两条线上的信号大小相等,方向相反。因此同一时刻,在CAN总线中,只能有一个设备发生消息,其他设备接受消息。这就是CAN总线的半双工特性

在这里我要说明一个问题,那就是电平信号的高低是相对的,在这里用下图我们举一个例子:

UDS学习笔记(一)——CAN总线介绍_第1张图片

如图,设备2的地相对于设备1的地为100V。假如红线蓝线为CANH以及CANL。在没有接地的情况下,这两条线是能够正常工作的。应为接收器是检测这两条线的电压差进行判断的。而如果红线蓝线为串口的TX以及RX,在没有接地的情况下则无法工作,应为不管这两条线如何波动,相对于设备1来说都是高电平。但对于CAN总线来说,接地还是有意义的,可以防止两个设备的地电压差太大,导致设备击穿等。

那么就会有人问了,为什么同样使用两条线传输数据(一条发送数据,一条接受数据)的RS232就可以实现全双工,而CAN总线只能实现半双工呢?是不是CAN总线太弱了?其实是因为两个的应用场景不一样,对于RS232来说,其使用是短距离,低速度的一个应用场景,而CAN总线是一个远距离,高速度的应用场景。而在双绞线上传输差分信号时稳定性要好很多,因此适合于较远距离的传输。

CAN总线 串口总线
CAN_H TX
CAN_L RX
两条线信息量相同 两条线信息量不同

 

在了解到了CAN总线的硬件之后,那么我们就要学习CAN总线的消息这么传输了。

对于前面提到的半双工的CAN总线,那么很容易就会想到一个问题,如果总线上两个设备都想发送消息,然后谁能优先发送数据呢?因此就涉及到了优先权的判定,帧的ID越小,优先权越高。同时要注意是是,帧的ID是赋予给帧的,而不是赋予给节点。因此两个节点可能会发出同样的帧ID。参考资料    参考资料2。因此如果两个节点设置成能够发生相同的帧,还是会出现拥堵现象。就会导致错误等等。为此,CAN报文有四种消息类型。

  • 数据帧:数据帧将数据从发送器传输到接收器。(最常见使用的帧)
  • 远程帧:总线单元发出远程帧,请求发送具有同一标识符的数据帧。 ()
  • 错误帧:任何单元检测到总线错误就发出错误帧。
  • 过载帧:过载帧用在相邻数据帧或远程帧之间的提供附加的延时。

对于CAN总线来说,网上的资料非常的多,因此我在这里也不做更多的资料了。相信大神们能更通俗易懂的让我们理解CAN总线

https://github.com/satish77/ip_uds_bl_tool/tree/master/ip_uds_bl

https://github.com/GoodnightV/UDS-based-Refresher/blob/master/DiagboxSRC/src/main.cpp

你可能感兴趣的:(汽车诊断协议—UDS,嵌入式系统)