基于CAN总线的通信系统实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于CAN总线的通信系统实现
2901302001 景梦园
CAN总线通信是一个非常实用的技术,无论在工业,制造业还是生活中都有相关的应用。这次我们所做的基于CAN总线的通信系统实现是一个最基本的应用。在这项技术中,我们采用了C51、SJA1000、TJA1050三种芯片来实现两个节点之间的通信。为了方便演示,加入MAX232芯片与单片机相连实现单片机与计算机的串口通信。
1、CAN总线节点技术:
控制局域网络CAN(Controller Area Network)总线是德国BOSCH公司20世纪80年代初为解决汽车中众多控制与测试仪器间的数据交换而开发的串行数据通信协议。这是一种多主总线,无论是在高速网络还是在低成本的节点系统,应用都很广泛。由于采用了许多新技术及独特的设计,与一般的通信总线相比,CAN总线的数据通信具有突出的可靠性、实时性和灵活性,其主要特点如下:
●通信方式灵活,可以多主方式工作,网络上任意一个节点均可以在任意时刻主动向网络上的其他节点发送信息,不分主从。
●CAN节点只需对报文的标识符滤波即可实现点对点、点对多点及全局广播方式发送和接收数据,其节点可分成不同的优先级,节点的优先级可通过报文标识符进行设置。
●CAN总线通信格式采用短帧格式,每帧字节数量多为8个字节,可满足一般工业领域中控制命令、工作状态及测试数据的要求,同时,8个字节不会占用总线时间过长,保证了通信的实时性。
●采用非破坏性总线仲裁技术,当多个节点同时向总线发送信息出现冲突时,优先级低的节点会主动退出数据发送,而优先级高的节点可不受影响地继续传输数据,大大节省了总线冲突仲裁时间,在网络重载的情况下也不会出现网络瘫痪。
●直接通信距离最大可达10 km (速率在5 kb/s以下),最高通信速率可达1 Mb/s (此时距离最长为40 m);节点数可达110个,通信介质可以是双绞线、同轴电缆或光导纤维。
●CAN总线采用CRC检验并可提供相应的错误处理功能,保证数据通信的可靠性,其节点在错误严重的情况下具有自动关闭输出功能,使总线上其他节点的操作不受影响。
2、89C51单片机芯片:
89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压、高性能CMOS8位微处理器(MCU),俗称单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器,89C2051是它的一种精简版本。89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
3、SJA1000芯片:
SJA1000是PHILIPS公司生产的一种独立控制器,用于移动目标和一般工业环境中的区域网络控制(CAN),支持CAN总线通信协议。SJA1000有两种工作模式:基本模式和
增强模式。在基本模式下,SJA1000只可收发标准数据帧(标准数据帧的标识符为11位),且错误报警的极限值不能修改;在增强模式下,SJA1000既可接收标准数据帧,也可接收扩展数据帧(扩展数据帧的标识符为29位),可修改错误报警的极限值,并且SJA1000具有更加灵活的滤波方式,能够根据数据帧的标识符有选择地接收一些数据帧。另外,增强模式下的SJA1000能够进行自检,即可通过自发自收一组报文来判断该控制节点是否正常地挂在CAN总线上。使用者所要做的主要工作是SJA1000的初始化,收发报文的处理以及对节点脱离总线的检测量与处理。
4、TJA1050芯片:
TJA1050 是控制器区域网络(CAN)协议控制器和物理总线之间的接口,是一种标准的高速CAN收发器。TJA1050可以为总线提供差动发送性能,为CAN控制器提供差动接收性能。TJA1050 是PCA82C250和PCA82C251高速CAN收发器的后继产品。
5、MAX232芯片:
MAX232芯片是美信公司专门为电脑的RS-232标准串口设计的单电源电平转换芯片,使用+5v单电源供电。具有如下特性:1、符合所有的RS-232C技术标准2、只需要单一+5V 电源供电3、片载电荷泵具有升压、电压极性反转能力,能够产生+10V和-10V电压V+、V-4、功耗低,典型供电电流5mA5、内部集成2个RS-232C驱动器6、内部集成两个RS-232C接收器
电路图:
C语言程序:
//一号单片机程序
#include
#include"lcd.h"
//#include"DS1820'h"
#include"SJA1000gai.h"
#define key P2^2
char table1[]="Message is sending";
char table2[]="Sengding succeded";
char table3[]="Receiveing succeded";
//定义BUF数据结构
/*struct BASICCAN_BUFstruct
{
unsigned char FrameID_H;//标识符高八位(信息功能2加节点号6)
unsigned char FrameLENTH;//数据长度码
unsigned char FrameKIND;//RTR位(1为远程帧,0为数据帧)
unsigned char FrameID_L3;//低3位(信息格式)
unsigned char FrameData;//数据
}BASICCAN_FRAME,receive_BUF,send_BUF;*/
/*char temp_buffer[2]; //温度缓冲
char disp_char[]="Temperature is: ";
char disp_temp[]={' ',' ',' ',' ','.',' ','c','e','n','t','i','g','r','a','d','e'}; //温度显示存储; uchar dot_temp[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9}; //温度精确到小数点一为以后void read_temp()
{
init_ds1820();
write_byte(0xcc);
write_byte(0x44);
delay1ms(500);
init_ds1820();
write_byte(0xcc);
write_byte(0xbe);
temp_buffer[0]=read_byte();
temp_buffer[1]=read_byte();
}
void display_temp(void)
{ uchar i;
bit flag;
if((temp_buffer[1]&0xf8)==0xf8)
{ temp_buffer[1]=~temp_buffer[1];
temp_buffer[0]=~temp_buffer[0]+1;
if(temp_buffer[0]==0)
temp_buffer[1]++;
flag=1;
}
disp_temp[5]=dot_temp[temp_buffer[0]&0x0f]+0x30;
temp_buffer[1]=((temp_buffer[0]>>4)|((temp_buffer[1]&0x07)<<4));