0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CAN总线简单介绍

广东微电科技有限公司 2021-12-09 15:55 次阅读

什么是CAN总线?

Controller Area Network,简称CAN或者CAN bus) 是一种功能丰富的串行总线标准,最早的CAN控制芯片在奔驰车上应用并量产,因为支持多主机,多从机的优点,所以一辆车所有控制器传感器电子设备直接的通信只需要两条线就够了,大大优化了整车的布线。

随着技术的不断发展,CAN发布了相应的标准,国际化标准组织,公布了CAN的不同标准;

标准 涵盖内容
ISO 11898-1 数据链路层
ISO 11898-2 高速CAN的物理层
ISO 11898-3 低速容错CAN的物理层

ISO 11898-1ISO 11898-2是对应的设计标准,去搜索就可以知道这个技术点是如何进行设计的。

物理层

差分信号

这里我们介绍一下物理层,什么是物理层呢?就是CAN的电信号的传输过程。CAN是串行异步通讯,只有CAN_HIGHCAN_LOW两条差分信号线,数据通过差分信号的方式进行通讯,其优点就是可以增加信号的抗干扰能力,抑制共模信号的干扰;

具体如下图所示;

图片

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

所以,信号在变成一个字节一个字节的数字信号之前,就是按照这种差分形式的模拟信号来传输的。

我们可以简单地理解一下,当CAN_HIGH减去CAN_LOW大于某个阈值的时候,可以把它当做逻辑高,反之,当小于某一个阈值时,就变成逻辑低。

下面我们再来看看CAN总线设备之间是如何连接的。

连接方式

CAN总线支持多个节点挂载在总线上,比较类似I2C总线,可以在SCLSDA上挂载多个从机,具体如下图所示;

图片

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

不过CAN总线其实没有主从的概念,每个设备都是一个节点(Node),节点直接可以相互通讯,相较于I2C总线,CAN总线设置了终端电阻,常见的一种闭环连接模式,相对的还有开环的连接模式。

不同的连接模式,他们的通讯速率也大不相同,这里也就是高速CAN和低速CAN的区别。

两条电线组成一条双绞线,并且接有120Ω的特性阻抗。ISO 11898-2,也称为高速度CAN。它在总线的两端均接有120Ω电阻。

使用了120Ω终端电阻(这是CAN的ISO标准里规定的),这种模式的最高通讯速率可以达到1Mbps,下面是传输距离和传输速度的关系;

图片

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

CAN总线长度与信号速率关系

高速CAN的拓扑结构具体如下所示;

图片

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

还有一种是低速CAN,或者也叫做容错CAN,低速容错 CAN 总线将通讯的最大带宽从1 Mbps降低到125 Kbps,并且不再在总线的起点和终点使用两个终端电阻,而是将电阻分布在每个节点上。具体如下图所示;

图片

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

由于高速CAN和低速CAN的拓扑结构不同,另外终端电阻的分布也不同,所以CAN_HIGHCAN_LOW上的电平是不相同的,这里有隐性电平和显性电平。

硬件上的连接基本上都搞清楚了,下面就是如何去实现一个具体的CAN节点。我们来简单地介绍一下。

CAN节点

CAN节点通常分为三个部分;

MCU/CPU

CAN控制器

CAN收发器

通常一些单片机内部就集成了相应的CAN控制器外设,比如我们比较常用的单片机——STM32,所以我们常见的结构一般是这样子的。

图片

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

所以整体的流程是这样的,如下:

CAN总线上通过差分信号进行数据传输

CAN收发器将差分信号转换为TTL电平信号,或者将TTL电平信号转换为差分信号;

CAN控制器将TTL电平信号接收,并传输给MCU;

那么,对于单片机开发者而言,需要关注的就是最终CAN控制器传输给MCU的数据,如何去配置CAN控制器,以及使用CAN控制进行数据的读取和发送。

既然这样,我们就不得不去了解一下CAN总线的通信原理,如何寻址,上层协议如何规定的。

CAN协议

CAN协议和网络协议比较类似,进行了分层的设计思想;

图片

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

按照我的理解;

物理层就是前面提到过的硬件拓扑结构,包括高速CAN和低速CAN,而CAN收发器就属于物理层;

传输层则是CAN控制器所需要做的事情,包括CAN时序,同步,消息仲裁,确认,错误检验等,这个比较复杂,如果只是应用开发,我认为,简单了解一下即可;这一层需要做的工作包括:

故障约束;

错误监测;

消息验证;

信息确认;

仲裁;

信息帧;

传输速率和时间;

路由信息;

对象层,MCU应该是属于这一层,我们需要对CAN消息做信息的过滤设置,CAN消息的处理等等;

应用层就是基于对象层的进一步封装,不同的CAN标准,比如工业自动化领域的CANopen,汽车诊断ISO 14229 定义的UDS等等;

如何寻址?

CAN总线上的每个节点不需要设置节点的地址,而是通过消息的标识符(Identifier)来区别信息。因为CAN总线的消息是广播的(就是大家都可以收到消息),比如总线上有节点A,节点B,节点C,那么节点A发消息,节点B和节点C都会收到消息;

节点B 和 节点C 会根据消息中的标识符,以及B和C中的消息过滤规则进行比较,如果不满足规则,就不接受这条信息。

这里需要注意的是:

发送消息的时候,总线必须处于空闲状态;

标识符越小,则消息获取总线的优先级越高;

在这里我们已经了解如何寻址,下面就看一下消息帧了。

帧类型

CAN有4种帧类型:

数据帧:包含用于传输的节点数据的帧

远程帧:请求传输特定标识符的帧

错误帧:由任何检测到错误的节点发送的帧

过载帧:在数据帧或远程帧之间插入延迟的帧

这里我们有必要重点了解一下数据帧,下面继续介绍各种帧之间的区别。

数据帧

数据帧分为标准帧和扩展帧两种格式;

基本帧格式:有11个标识符位

扩展帧格式:有29个标识符位

数据帧的结构具体如下所示;

图片

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

数据帧格式

简单介绍一下数据帧的细节;

sofstart of frame,表示数据帧开始;(1 bit)

Identifier:标准格式11 bit,扩展格式29 bit包括Base Identifier(11 bit)和Extended Identifier(18 bit),该区段标识数据帧的优先级,数值越小,优先级越高;

RTR:远程传输请求位,0时表示为数据帧,1表示为远程帧,也就是说RTR=1时,消息帧的Data Field为空;(1 bit)

IDE:标识符扩展位,0时表示为标准格式,1表示为扩展格式;(1 bit)

DLC:数据长度代码,0~8表示数据长度为0~8 Byte;(4 bit)

Data Field:数据域;(0~8 Byte)

CRC Sequence:校验域,校验算法,

DEL:校验域和应答域的隐性界定符;(1 bit)

ACK:应答,确认数据是否正常接收,所谓正常接收是指不含填充错误、格式错误、 CRC 错误。发送节点将此位为1,接收节点正常接收数据后将此位置为0;(1 bit)

SRR:替代远程请求位,在扩展格式中占位用,必须为1;(1 bit)

EOF:连续7个隐性位(1)表示帧结束;(7 bit)

ITM:帧间空间,Intermission (ITM),又称Interframe Space(IFS),连续3个隐性位,但它不属于数据帧。帧间空间是用于将数据帧和远程帧与前面的帧分离开来的帧。数据帧和远程帧可通过插入帧间空间将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。过载帧和错误帧前不能插入帧间空间。

远程帧

一般地,数据是由发送单元主动向总线上发送的,但也存在接收单元主动向发送单元请求数据的情况。远程帧的作用就在于此,它是接收单元向发送单元请求发送数据的帧。远程帧与数据帧的帧结构类似,如上图X所示。远程帧与数据帧的帧结构区别有两点:

数据帧的RTR值为“0”,远程帧的RTR值为“1

远程帧没有数据块

远程帧的DLC块表示请求发送单元发送的数据长度(Byte)。当总线上具有相同标识符的数据帧和远程帧同时发送时,由于数据帧的RTR位是显性的,数据帧将在仲裁中赢得总线控制权。

错误帧

用于在接收和发送消息时检测出错误时,通知错误的帧。错误帧由错误标志和错误界定符构成。错误帧的帧结构如图11示。

错误标志:

个显性/隐性重叠位

主动错误标志(6个显性位):处于主动错误状态的单元检测出错误时输出的错误标志

被动错误标志(6个隐性位):处于被动错误状态的单元检测出错误时输出的错误标志

错误界定符:8个隐性位

图片

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

过载帧

过载帧是用于接收单元通知发送单元它尚未完成接收准备的帧。在两种情况下,节点会发送过载帧:

接收单元条件的制约,要求发送节点延缓下一个数据帧或远程帧的传输;

帧间空间(Intermission)的3 bit内检测到显性位

每个节点最多连续发送两条过载帧。过载帧由过载标志和过载界定符(8个隐性位)构成。数据帧的帧结构如图12所示。

图片

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

can_overload_frame

这里基本把帧介绍完了,但是每个节点之间的通讯,我们如何知道这一帧开始接收了,这一帧已经接收结束了呢?下面就需要了解一下消息的时序和消息同步的方法。

消息时序以及同步

位时序

在讲CAN消息时序和同步之前,我们可以对照一下UART串口的传输协议,他有起始位和停止位,然后大家都规定使用相同的通讯速率(波特率);

其实CAN通讯也是类似的方式,它属于异步通讯,没有时钟信号线,所以所有节点之间要约定好使用相同的波特率来传输数据。

在总线空闲一段时间后,在(起始位) 进行硬同步,同步方式是将每一位划分成多个称为量子的时间段(time quanta),并分配一定数量的量子到位中的四个阶段完成的。

这四个阶段分别为:

SYNC_SEG:同步段,1 个时间量子长度。它用于同步各种总线节点;

PROP_SEG:传播段,1~8 时间量子长度。它用于补偿网络上的信号延迟。

PHASE_SEG_1:相位缓冲段1,1~8 时间量子长度。它用于补偿边缘相位误差,在重新同步期间可能会延长。

PHASE_SEG_2:相位缓冲段2,2~8 时间量子长度。它用于补偿边缘相位误差

具体如下图所示;

图片

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

位时序

波特率

如何计算波特率,需要知道每个量子时间的长度(time quanta),以及每一位需要多少个量子时间,

假设这里time quanta = 1us,并且1 bit = 8 tq,那么上图中的波特率就应该是:

消息过滤器

前面有提到消息在CAN总线上是广播式的,但并不是所有节点都会对总线上所有消息感兴趣。节点通过控制器中过滤码(Filter Code)和掩码(Mask Code),再检验总线上消息的标识符,来判断是否接收该消息(Message Filtering)。

对于掩码,“1”表示该位与本节点相关,“0”表示该位与本节点不相关。举例如下:

例1:仅接收消息标识符为00001567(十六进制)的帧

设置过滤码为00001567

设置掩码为1FFFFFFF

节点检测消息的标识符的所有位(29位),如果标识符为00001567接收,否则舍弃。

例2:接收消息标识符为000015670000156F的帧

设置过滤码为00001560

设置掩码为1FFFFFF0

节点检测消息的标识符的高25位,最低的4位则不care。如果标识符最高25位相同则接收,否则舍弃。

例3:接收消息标识符为0000156000001567的帧

设置过滤码为00001560

设置掩码为1FFFFFF8

节点检测消息的标识符的高26位,最低的3位则不care。如果标识符最高26位相同则接收,否则舍弃。

例4:接收所有消息帧帧

设置过滤码为0

设置掩码为0

节点接收总线上所有消息。

如何配置?

上面介绍了帧类型,那么如何基于MCU进行配置呢?这里以STM32F407为硬件平台,使用HAL库进行初始化,看一下都对哪些地方进行了配置。一般来说,我们需要配置CAN的波特率,消息过滤器等等,下面是简单的配置的代码;

CAN_HandleTypeDefhCAN;
voidMX_CAN_Init(void)
{
CAN_FilterTypeDefsFilterConfig;
/*CAN单元初始化*/
hCAN.Instance=CAN1;/*CAN外设*/

/*BTR-BRP波特率分频器定义了时间单元的时间长度42/(1+6+7)/6=500Kbps*/
hCAN.Init.Prescaler=6;
hCAN.Init.Mode=CAN_MODE_NORMAL;/*正常工作模式*/
hCAN.Init.SyncJumpWidth=CAN_SJW_1TQ;/*BTR-SJW重新同步跳跃宽度1个时间单元*/
hCAN.Init.TimeSeg1=CAN_BS1_6TQ;/*BTR-TS1时间段1占用了6个时间单元*/
hCAN.Init.TimeSeg2=CAN_BS2_7TQ;/*BTR-TS1时间段2占用了7个时间单元*/
hCAN.Init.TimeTriggeredMode=DISABLE;/*MCR-TTCM关闭时间触发通信模式使能*/
hCAN.Init.AutoBusOff=ENABLE;/*MCR-ABOM自动离线管理*/
hCAN.Init.AutoWakeUp=ENABLE;/*MCR-AWUM使用自动唤醒模式*/
hCAN.Init.AutoRetransmission=DISABLE;/*MCR-NART禁止报文自动重传DISABLE-自动重传*/
/*MCR-RFLM接收FIFO锁定模式DISABLE-溢出时新报文会覆盖原有报文*/
hCAN.Init.ReceiveFifoLocked=DISABLE;
/*MCR-TXFP发送FIFO优先级DISABLE-优先级取决于报文标示符*/
hCAN.Init.TransmitFifoPriority=DISABLE;
if(HAL_CAN_Init(&hCAN)!=HAL_OK)
{
//Error_Handler();
}
//初始化发送器
hCAN1_TxMessage.IDE=CAN_ID_STD;
hCAN1_TxMessage.RTR=CAN_RTR_DATA;
hCAN1_TxMessage.TransmitGlobalTime=ENABLE;

//初始化滤波器设置为0则不对消息进行过滤
hCAN1_Filter.FilterIdHigh=0;/*要过滤的ID高位*/
hCAN1_Filter.FilterIdLow=0;/*要过滤的ID低位*/
hCAN1_Filter.FilterMaskIdHigh=0;/*过滤器高16位每位必须匹配*/
hCAN1_Filter.FilterMaskIdLow=0;/*过滤器低16位每位必须匹配*/
hCAN1_Filter.FilterFIFOAssignment=CAN_FILTER_FIFO0;/*过滤器被关联到FIFO0*/
hCAN1_Filter.FilterBank=0;
hCAN1_Filter.FilterMode=CAN_FILTERMODE_IDMASK;/*工作在标识符屏蔽位模式*/
hCAN1_Filter.FilterScale=CAN_FILTERSCALE_32BIT;/*过滤器位宽为单个32位。*/
hCAN1_Filter.FilterActivation=ENABLE;
hCAN1_Filter.SlaveStartFilterBank=0;

HAL_CAN_ConfigFilter(&hCAN,&hCAN1_Filter);

while(HAL_CAN_Start(&hCAN)!=HAL_OK)
{
printf("\nCAN_StartFailed!!");
HAL_Delay(100);
}
HAL_CAN_ActivateNotification(&hCAN,CAN_IT_RX_FIFO0_MSG_PENDING);
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

下面是CAN发送的函数,我们需要自己构建相应的消息帧格式,通常需要设置消息帧的ID格式,消息长度,具体如下;

voidCAN_TxMessage(CAN_HandleTypeDef*hcan,uint16_tID,uint8_taData[],uint8_tDLC)
{
uint32_tTx_MailBox;
/*-1-配置数据段长度----------------------------------------*/
hCAN1_TxMessage.IDE=CAN_ID_STD;
hCAN1_TxMessage.RTR=CAN_RTR_DATA;
hCAN1_TxMessage.StdId=ID;
hCAN1_TxMessage.DLC=DLC;
hCAN1_TxMessage.TransmitGlobalTime=ENABLE;
/*-2-发送aData---------------------------------------------*/
while(HAL_CAN_AddTxMessage(hcan,&hCAN1_TxMessage,aData,&Tx_MailBox)!=HAL_OK)
{
HAL_Delay(5);
}
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

上述代码设置发送消息:

CAN_ID_STD设置为标准ID;

CAN_RTR_DATA设置消息为数据帧;

StdId为当前消息的ID;

DLC为当前消息的长度;

整体可以参考前面介绍的消息帧格式,篇幅有限,这里就先简单的介绍一下。

总结

本文对CAN总结进行了简单的介绍,CAN通讯的特点可以总结如下;

符合OSI开放式通信系统参考模型;

两线式总线结构,电气信号为差分式;

多主控制。在总线空闲时,所有的单元都可开始发送消息,最先访问总线的单元可获得发送权;多个单元同时开始发送时,发送高优先级 ID 消息的单元可获得发送权;

消息报文不包含源地址或者目标地址,仅通过标识符表明消息功能和优先级;

基于固定消息格式的广播式总线系统,短帧结构;

事件触发型。只有当有消息要发送时,节点才向总线上广播消息;

可以通过发送远程帧请求其它节点发送数据;

消息数据长度 0~8 Byte;

错误检测功能。所有节点均可检测错误,检测处错误的单元会立即通知其它所有单元;

发送消息出错后,节点会自动重发;

故障限制。节点控制器可以判断错误是暂时的数据错误还是持续性错误,当总线上发生持续数据错误时,控制器可将节点从总线上隔离;

通信介质可采用双绞线、同轴电缆和光导纤维,一般使用最便宜的双绞线;

理论上,CAN总线用单根信号线就可以通信,但还是配备了第二根导线,第二根导线与第一根导线信号为差分关系,可以有效抑制电磁干扰;

在40米线缆条件下,最高数据传输速率 1Mbps;

总线上可同时连接多个节点,可连接节点总数理论上是没有限制的,但实际可连接节点数受总线上时间延迟及电气负载的限制;

文章来源于小麦大叔,作者小麦大叔

研发销售6轴、9轴电子罗盘(陀螺仪|加速计|磁力计)、倾角传感器、姿态传感器,惯导、数据采集盒、IoT远程智慧监测等

产品广泛应用于:无人机、无人船、巡检/引导/送餐/水下机器人、AGV、云台装置、望远镜、Qiang支瞄准镜、雷达定位、聚光太阳能、工矿/隧道无人设备等!

核心研发人员十年技术积累,专业研发团队,军工级品质,替代进口。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    5997

    文章

    43948

    浏览量

    620552
  • CAN总线
    +关注

    关注

    145

    文章

    1809

    浏览量

    129573
收藏 人收藏

    评论

    相关推荐

    CANoe总线接口硬件VN1640A实物展示与功能介绍#汽车CAN总线 

    总线接口CAN总线接口
    北汇信息POLELINK
    发布于 :2024年04月11日 10:50:36

    CAN总线错误帧及其排查方法简单介绍#汽车CAN总线 

    CAN总线汽车电子
    北汇信息POLELINK
    发布于 :2024年03月15日 14:14:40

    什么是CAN总线通信?CAN总线工作原理

    这意味着变送器通过CAN收发器改变总线电平,并将其信息传输到CAN总线。接收器通过监测总线电平将总线
    发表于 02-19 14:53 1162次阅读
    什么是<b class='flag-5'>CAN</b><b class='flag-5'>总线</b>通信?<b class='flag-5'>CAN</b><b class='flag-5'>总线</b>工作原理

    高速CAN总线和低速CAN总线的特性

    高速CAN总线和低速CAN总线的特性 高速CAN总线和低速C
    的头像 发表于 01-31 14:09 714次阅读

    CAN总线共模电感选型

    CAN总线共模电感是应用于CAN总线通信中的一种电子元件,用于解决CAN总线通信中的共模干扰问题
    的头像 发表于 01-05 13:42 1062次阅读

    CAN总线的特点和FPGA实现

    我们根据can总线具有的一些特性可知:CAN总线肯定具有分层结构,而且参考OSI模型(OSI参考模型介绍)是肯定的,我们可以看一下相关的文档
    的头像 发表于 01-05 09:40 436次阅读
    <b class='flag-5'>CAN</b><b class='flag-5'>总线</b>的特点和FPGA实现

    CAN总线和电平逻辑介绍

    CAN总线 CAN是控制器局域网络的简称,是一种能够实现分布式实时控制的串行通信网络。CAN总线的功能复杂且智能。
    的头像 发表于 11-09 18:11 826次阅读
    <b class='flag-5'>CAN</b><b class='flag-5'>总线</b>和电平逻辑<b class='flag-5'>介绍</b>

    CAN总线位时序的介绍

    CAN控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。 显性电平对应逻辑 0,
    的头像 发表于 10-27 14:55 1093次阅读
    <b class='flag-5'>CAN</b><b class='flag-5'>总线</b>位时序的<b class='flag-5'>介绍</b>

    CAN总线访问与仲裁机制#汽车CAN总线 

    CAN总线
    北汇信息POLELINK
    发布于 :2023年10月20日 15:33:02

    一条口诀总结,汽车CAN总线使用权获取规则#汽车CAN总线 

    CAN总线
    北汇信息POLELINK
    发布于 :2023年10月20日 12:15:34

    CAN总线在客车电路设计中的应用介绍

    随着 CAN总线在客车上应用 的不断普及 ,其强大的智能化功能让汽车电器设 计者能够非常容易地实现 自己设计思想 ,使汽车电路设计不断得到完善 。下面介绍 一种利用软件编程 的 CAN
    发表于 09-22 08:10

    基于CAN总线的温度测控系统介绍

    ,而且能够将分布在不同地点的温度测控模块通过cAN现场总线连接起来,接入PC机进行集中监控和管理。本系统采用CAN现场总线进行通讯,由于一条cAN
    发表于 09-19 06:45

    can总线为什么要用双绞线?can总线不用双绞线可以吗?

    can总线为什么要用双绞线?can总线不用双绞线可以吗? CAN总线是一种数据通信协议,广泛用于
    的头像 发表于 09-14 16:48 3989次阅读

    CAN总线的位定时与同步机制#汽车CAN总线 

    CAN总线
    北汇信息POLELINK
    发布于 :2023年07月17日 10:57:12

    CAN 总线错误检测机制#can总线

    CAN 总线
    北汇信息POLELINK
    发布于 :2023年05月26日 13:54:03