汽车级CAN总线详细教程_看过了很好
- 格式:ppt
- 大小:5.32 MB
- 文档页数:115
汽车can总线工作原理及测量方法详解CAN总线的总体结构CAN总线由CAN控制器、CAN收发器、数据传输线、数据传输终端等组成。
CB311的ECU(发动机控制单元)、TCU(变速器控制单元)、FEPS(无钥匙进入和无钥匙启动系统)、组合仪表四个电控单元通过CAN总线连接,CAN控制器、CAN收发器均集成在电控单元中。
CB311CAN总线的结构如图1所示。
图1 CB311 CAN总线的总体结构1、CAN控制器CAN控制器集成在电控单元内部,接收由控制单元微处理器传来的数据。
CAN控制器对这些数据进行处理并将其传递给CAN收发器;同样CAN控制器也接收收发器传来的数据,处理后传递给控制单元微处理器。
2、CAH收发器CAN收发器集成在电控单元内部,同时兼具接收、发送和转化数据信号的功能。
它将CAN控制器发送来的电平信号数据转化为电压信号并通过数据传输线以广播方式发送出去。
同时,它接收数据传输线发送来的电压信号并将电压信号转化为电平信号数据后,发送到CAN控制器。
3、数据传输线为了减少干扰,CN总线的数据传输线采用双绞线,其绞距为20mm,截面积为0.5m,称这两根线为CAN-高线(CAN-H)和CAN-低线(CAN-L),如图2所示。
两根线上传输的数据相同,电压值互成镜像,这样,两根线的电压差保持一个常值,所产生的电磁场效应也会由于极性相反而互相抵消。
通过该方法,数据传输线可免受外界辐射的干扰;同时,向外辐射时,实际上保持中性(即无辐射)。
4、数据传输终端数据传输终端是一个电阻器,阻止数据在传输终了被反射回来破坏数据,一般数据传输终端为120Q的电阻。
CB311的数据传输终端为两个1202的电阻,分别集成在BCU和组合仪表中。
汽车CAN总线数据传输系统构成及工作原理现代汽车的电控单元主要有主控制器、发动机控制系统、悬架控制系统、制动防抱死控制系统(ABs牵引力控制系统、AsR控制系统、仪表管理系统、故障诊断系统、中央门锁系统、座椅调节系统等。
CAN技术文档CAN是什么CAN 是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。
在汽车产业中,出于对安全性、舒适性、方便性、低功耗、低成本的要求,各种各样的电子控制系统被开发了出来。
如何操作CAN# sudo ip link set can0 type can bitrate 125000 triple-sampling on //通过三次采样将CAN0波特率设置为125k;# sudo ip link set can0 type can bitrate 125000 triple-sampling on listen-only on //监听模式启动CAN0#sudo ifconfig can0 up //开启(初始化)CAN0;#sudo ifconfig can0 down //关闭CAN0#sudo candump can0 //CAN0设备开始进行接收,进程为阻塞型;CAN0改为any,则开启所有通道接收;#sudo cansend can0 123#11.22.33.44.55.66.77.88 //CAN0口发送ID为123的8字节CAN 标准帧;#sudo cansend can0 00000123#11.22.33.44.55.66.77.88 // CAN0口发送ID为123的8字节CAN扩展帧使用系统提供的candump 工具包进行测试代码范例使用socketcan包进行发送、接收int SendData(const unsigned int id, const uint8_t* data, const u_int8_t len) {if(len > 8)return -1;can_frame frame;frame.can_id = id;frame.can_dlc = len;memcpy(frame.data,data,len);int tmp =(int) write(m_sendSocket, &frame, sizeof(frame));if(tmp != (int)sizeof(frame)) {return -1;}return 0;}std::queue <can_frame> can_queue_;int OnRecvDataThread() {can_frame frame;int nBytes = 0;while (m_bRunning) {nBytes = (int)read(m_recvSocket, &frame, (int)sizeof(frame));if(nBytes == (int)sizeof(can_frame)) {can_queue_.push(frame);}MsSleep(1);}return 0;}单独起个线程收数据放入队列,并再起个线程分发队列数据,这样就不会因为分发数据处理导致缓冲区满。