什么是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,硬件措施
- 采用隔离和抗干扰措施
采用光电隔离器件;信号线,与电源线,高频信号线分开布线;
- 使用高质量的通信组件:
抗干扰能力强,误码率低,信号传输特性稳定。
1万+

被折叠的 条评论
为什么被折叠?



