CAN 总线通信协议

什么是CAN?

CAN 你知道哪些?

通信安全可靠手段你知道哪些?

基础理论:

CAN:控制器局域网(Controller area network)的简称;

异步通信:差分信号线(C_H与C_L)组成,差分信号传输,不需要时钟线;

半双工:一次只能表示一个信号,所以分时进行;

多主机:挂载多个节点,相互可以通信;接入主机需要一个CAN收,发器。

串行:由于只有一组差分信号,所以一个接着一个发送数据;

硬件电路:

CAN 收发器有Tx,Rx,C_H,C_L;

高速CAN 闭环总线网络:120Ω;ISO11898;距离短选择,10m;

低速CAN 开环总线网络:2.2KΩ;ISO11519;距离远选择;1KM;

首先拥有一个CAN总线,然后挂载多个节点,那么就会一个问题,终点怎么办?这时候就想到了电阻;

终端电阻的作用:

1,防止回波反射;干扰原始信号;

2,稳定电压,是电压一致;(C_H:2.5V 3.5V  C_L:2.5V 1.5V  )

电平信号:参考高速闭环总线,收紧为1,反之0;

差分信号:就是说C_H与C_L之间的电压差值不会发生变化的,恒定不变的;

举例来说,外部干扰,如果C_H突变,电压变高,那么C_L也会突变,变高,维持电压恒定,所以抗干扰能力就很强;

工作原理:(四个阶段)

发送报文→仲裁机制→数据传输→错误检测与处理

发送报文,就跟食堂打饭一样,窗口打饭一样,窗口没人打饭。你才可以打饭;所以要等总线空闲;窗口没人这时候,其他人会一起冲,这时候就很混乱,这时候怎么解决呢?很简单,排队取号,从小到大排序嘛,所以就有了标识符ID,ID越小优先级越高;等前一个报文发送完成了,这时候就轮到你了;打饭还得需要确认饭是不是香的,所以这时候就有了错误检测机制,如CRC校验,帧校验,应答错误等信号;

这时候就需要看CAN报文数据帧:

首先顾名思义,得有开始和结束,要不然别人怎么知道你结束还是开始了;帧起始,帧结束;

其次呢,得知道自己的序号,什么时候轮到自己,所以仲裁场,取ID;

然后,发送数据,那就有了数据场;但是你发送数据,总的知道数据多长吧,控制数据长度,数据场就有了;

最后,我们的检查一下数据是不是自己想要的吧,CRC,ACK场检测机制过一遍嘛。

到这为止,我们就完成了一组数据的处理;

如何想知道传输的速率呢,这时候我们就想到波特率,每一个数据位传输的时长,就是速率的倒数了;

CAN 配置:

实际代码配置中,一般有关通信的,我们都是先考虑波特率的,但是CAN总线又很特殊;

串口协议的波特率只支持一个波特率,CAN总线却是一段范围,500KHz→1MHz;

波特率的计算,通常考虑时钟频率,分频数,一位传输的时间;

还有就是考虑的是需不需要中断;

uint8_t can1_send( uint8_t *p_send_buff ,uint8_t len )
{
	uint16_t i;
      CanTxMsg TxMessage; 
	/* 给邮箱准备好数据帧的数据       */
	TxMessage.StdId = 0x12;  //标准帧
	TxMessage.ExtId = 0x12;  //扩展帧
	TxMessage.IDE = CAN_Id_Standard; // 区分使用标准帧 0 还是 扩展帧 1;
	TxMessage.RTR = CAN_RTR_Data ;    // 远程请求标志,发送数据  0主动发 1 请求
	TxMessage.DLC = 8;                // 数据长度
	for(i=0 ; i < len ; i++)
	TxMessage.Data[i] = p_send_buff[i];  /**/
	
    CAN_Transmit(CAN1, & TxMessage);/* 给有邮箱挂起   */
	i=0;
	while(  ( !CAN_TransmitStatus(CAN1, CAN_TxStatus_Ok) ) && i < 0xffff  ) i++;/*等待传输完成*/
	
	if(CAN_TransmitStatus(CAN1, CAN_TxStatus_Ok))return 1;/*发送成功 返回1 失败0*/
	else return 0;
	
	
}
 
 
uint8_t can1_receive(  )
{
 
 CanRxMsg RxMessage ;
 if(CAN_MessagePending(CAN1, CAN_FIFO0 ) == 0){return 0; } /* 如果邮箱没有消息,退出*/
 CAN_Receive(CAN1, CAN_FIFO0, & RxMessage); /*有消息,接收消息*/

 memcpy( can1.can1_rx.rx_buff,RxMessage.Data,sizeof(RxMessage.Data));
 return RxMessage.DLC; /*返回数据帧的数据段长度*/
 
}

节点区分:

1,标识符区分;

2,数据帧中添加设备编号,或者地址信息;

怎么操作:在需要发送数据的底一个byte 设置设备编号,然后将其他信息写在后面;以上举例,位置不限;

3,自定义协议;

物理层(CAN通信),数据链路层(数据帧格式和设备标识),应用层(采集数据处理);

数据的正确性:

1,数据校验与验证:

  • CRC:

发送方通过数据内容与多项式计算出校验码,发送给接收方;接受方通过接受的数据与多项式计算,得到校验码,与发送方的校验做比较;如果不同,那么数据可能出现了错误;

  • 校验和:

发送将数据的所有字节相加得到的校验和发送给接收方,接收方将接受数据的字节相加,得到校验和,与发送方的校验和比较;如果不同,那么数据可能出现了错误;

2,数据重发机制:

  • 基于接受确认(ACK)的重发:

发送方发送完数据后,一定时间内,等待接收方返信(返信信号双方确认即可);超过一定时间没有收到,就重新发送;

  • 冗余传输:(多次传输):

发送方多次发送数据,接受方采用  多数表决 的方式,接受到的大多数数据准确,就认为准确;

3,通信协议规范和错误处理

  • 协议层错误检测:

根据数据帧的数据进行检测;

  • 错误码反馈和处理:

接收方检测到错误时,向发送方发送错误码,发送方通过错误码进行处理;

错误码,双方指定规则,对应什么请求;

4,硬件措施

  • 采用隔离和抗干扰措施

采用光电隔离器件;信号线,与电源线,高频信号线分开布线;

  • 使用高质量的通信组件:

抗干扰能力强,误码率低,信号传输特性稳定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值