基于CAN总线的适配器节点设计课程设计1.docx
《基于CAN总线的适配器节点设计课程设计1.docx》由会员分享,可在线阅读,更多相关《基于CAN总线的适配器节点设计课程设计1.docx(21页珍藏版)》请在冰豆网上搜索。
基于CAN总线的适配器节点设计课程设计1
辽宁工业大学
工业控制网络技术课程设计(论文)
题目:
基于USB的CAN总线适配器设计
课程设计(论文)任务及评语
院(系):
电气工程学院教研室:
自动化
学号
学生姓名
专业班级
自动化102
课程设计题目
基于USB的CAN总线适配器设计
课程设计(论文)任务
课题完成的功能、设计任务及要求、技术参数
实现功能
USB的CAN总线适配器设计,实现计算机串口与CAN总线协议的转换。
设计硬件包括总线控制器、总线收发器及ATMEL系列单片机及USB芯片等。
软件采用汇编语言或C语言,并调试与分析。
设计任务及要求
1、确定设计方案,画出方案框图。
2、适配器硬件设计,包括元器件选择。
3、画出适配器的原理图、线路图。
4、绘出程序流程图,并编写初始化、接收及发送程序。
5、要求认真独立完成所规定的全部内容;所设计的内容要求正确、合理。
6、按学校规定的格式,撰写、打印设计说明书一份;设计说明书应在4000字以上。
技术参数
1、符合CAN2.0B规范;
2、设定速率1Mbit/s;
3、可扩充110个节点;
4、可与上位机通信。
进度计划
1、布置任务,查阅资料,确定系统设计方案(2天)
2、系统硬件设计及模块选择(3天)
3、系统软件软件及编写功能程序及调试(3天)
4、撰写、打印设计说明书(1天)
5、验收及答辩。
(1天)
指导教师评语及成绩
平时:
论文质量:
答辩:
总成绩:
指导教师签字:
年月日
注:
成绩:
平时20%论文质量60%答辩20%以百分制计算
摘要
CAN总线是一种应用极为普及的现场总线。
CAN总线作为智能设备的联系纽带,把挂在总线上作为网络节点的智能设备连接为网络系统,并进一步构成自动化系统,实现基本控制的综合自动化系统。
随着现场总线技术和计算机外设接口技术的发展,现场总线与计算机快速有效的连接又有了更多的方案,USB作为一种新型的接口技术,以其简单易用、速度快等特点而备受青睐。
本文简要提出了USB接口与CAN总线连接方案,论述了系统的硬件构成,固件开发和驱动程序等内容。
关键词:
现场总线USBCAN总线
第1章绪论
CAN总线最初是德国Bosch公司在1986年为解决现代汽车中众多的控制与测试仪器之间的数据交换而开发的一种支持分布式实时控制系统的串行数据通讯总线。
CAN总线与其它通信网的显著不同之处在于:
(1)报文传送中不包含目标地址,它是以全网广播为基础,各接收站根据报文中反映数据性质的标识符过滤报文,该收的收下,不收的弃用。
其好处是可线上网下网、即插即用和多站接收。
(2)特别强化了对数据安全性的关注,满足控制系统及其它较高数据要求的系统需求。
另外CAN总线采用短帧结构,借助接收滤波的多地址帧传送,受干扰概率低,每帧信息都有CRC校验及其它检错措施。
响应远程数据请求,配置灵活,具有全系统的数据相容性。
节点数主要取决于总线驱动电路,目前最多可达110个节点。
CAN总线符合ISO11898标准,通信速率高,最大传输速率可达1Mbit/S,最大传输距离为10km,传输介质可为双绞线。
基于CAN总线以上的特点,把它应用于系统分布比较分散且需要在同一总线上挂接多个节点的场合是非常适合的。
CAN总线具有高性能、高可靠性、高性价比、连接方便、实时性好及其独特的设计等突出优点应用于许多工业部门,目前已成为比较流行的一种现场总线,广泛应用于控制系统中的各检测和执行机构之间的数据通信。
而实际应用中PC机与CAN总线的人机交互设计尤为重要,它直接影响系统的运行和结果,其连接方法也成为系统设计的重点,通常采取3种连接方式:
RS-232串行口通信、PCI卡、USB口通信,由于串行通信端口在系统控制领域中一直扮演着极为重要的角色,以其开发简单,资源丰富,成本低,无需驱动程序等诸多优点,不仅没有被淘汰,反而在规格上更先进,故应用广泛。
结合设计中AT89S51单片机有串行通信口且接口简单的特点,选用RS-232作为CAN总线与PC机之间的连接方式。
将就这一基于CAN控制器SJA1000与AT89S51的具有通用性的工业测控系统设计的软硬件设计方案作详细介绍。
课程设计的方案
概述
本次设计主要是综合应用所学知识,设计CAN总线适配器接口设计,并在实践的基本技能方面进行一次系统的训练。
能够较全面地巩固和应用“现场总线”课程中所学的基本理论和基本方法。
系统以单片机AT89S51和SJA1000控制器为核心,USB的CAN总线适配器设计,实现计算机串口与CAN总线协议的转换。
设计硬件包括总线控制器、总线收发器及ATMEL系列单片机及USB芯片等。
软件采用汇编语言或C语言,并调试与分析。
本设计系统主要部件结构图如图2.1
系统组成总体结构
图2.1系统总体框图
第2章硬件设计
单片机最小系统设计
AT89S51是一个低功耗,高性能CMOS8位单片机,片内含4kBytesISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。
图3.1单片机最小系统
CAN总线
在本系统中,CAN控制器采用Philips公司生产的SJA1000,它作为一个发送、接受缓冲器,实现主控制器和总线之间的数据传输;CAN收发器采用TJA1050芯片,它是CAN控制器和物理总线的接口,主要可以提供对总线的差动发送能力和对CAN控制器的差动接受能力。
在CAN总线结构中,总线的两端还要配置两个120Ω的电阻,其作用是总线匹配阻抗,可以增加总线传输的稳定性和抗干扰能力,减少数据传输中的出错率。
为了增强CAN总线节点的抗干扰能力,SJA1000的TXO和RX0可通过高速光耦6N137与TJA1050相连,这样就很好的实现了总线上各节点的电气隔离。
光耦部分电源与CAN_V必须用小功率电源隔离模块进行隔离,这样就提高了节点的稳定性和安全性。
图3.2为SJA1000引脚图。
图3.2SJA1000引脚图
USB接口
PDIUSBD12是一款带有并行总线和局部DMA传输能力的高速USB接口器件,它支持USB1.1协议的所有传输方式,在本设计中用到了控制传输,中断传输和批量传输。
控制传输处理主机到USB设备的控制信息,固定使用端点0。
中断传输用来传送数据量很小,但需要及时处理,以达到实时效果的数据,使用端点1。
批量传输用来实现CAN节点与主机之间大数据快传送,使用主端点(端点2),一次最大可发送64字节。
PDIUSBD12的固件设计成完全的中断驱动,当MCU处理前台任务时USB的传输可在后台进行。
这就确保了最佳的传输速率和更好的软件结构,同时简化了编程和调试。
后台ISR中断服务程序和前台主程序循环之间的数据交换通过事件标志和数据缓冲区来实现,当PDIUSBD12从USB收到一个数据包那么就对MCU产生一个中断请求,MCU立即响应中断,在ISR中固件将数据包从PDIUSBD12内部缓冲区移到数据缓冲区,并在随后清零PDIUSBD12的内部缓冲区,以使能接收新的数据包。
MCU可以继续它当前的前台任务,返回到主循环检查循环缓冲区内是否有新的数据。
图3.3为PDIUSBD13固件编程结构图。
图3.3PDIUSBD13固件编程结构图
这部分程序结构可包括:
1)请求处理程序
对USB的标准设备请求进行处理和对用户添加的厂商请求进行处理;USB设备接入主机后要进入复杂的设备列举过程,并安装正确的驱动程序。
2)硬件提取层
对单片机的I/O口、数据总线等硬件接口进行操作,该层包含最底层的函数,这些函数在不同的MCU平台上需要进行改变,
voidoutportb(unsignedcharport,unsignedcharval);
voidinportb(unsignedcharport);
对PDIUSBD12所有的I/O访问都可由它们实现;
3)PDIUSBD12命令接口
对PDIUSBD12器件进行操作的模块子程序集,以简化器件的编程;
4)中断服务程序
当PDIUSBD12向单片机发出中断请求时,读取PDIUSBD12的中断传输来的数据,并设定事件标志和Setup包数据缓冲区,传输给主循环。
5)主循环
发送USB请求,处理USB总线事件和用户功能处理等。
MCU一旦上电就需要初始化其所有端口存储区,中断服务程序。
在主循环程序中MCU对事件进行轮询,如有CAN总线发来的数据,则送往PDIUSBD12进行发送,如有USB总线数据,则启动CAN发送程序,它们在接口的接收工作分别由各自的中断程序完成。
要注意的是,我们在用了PDIUSBD12的端口最大一次可发送64字节,SJA1000一次最多能发8字节,如果端口1传输的长度大于8字节,MCU在传输阶段就必须根据数据大小,分数次完成CAN数据的发送工作。
PDIUSBD12初始化程序:
voidD12_init()
{
D12_SetAddressEnable(0,1);
D12_SetEndpointEnable
(1);
Disconnect();
Delay
(2);
Connect();
D12_ReadInterruptRegister();
}
3.4收发器PCA82C250
PCA82C250是CAN协议控制器和物理总线间的接口,它主要是为汽车中高速通讯(高达1Mbps)应用而设计。
此器件对总线提供差动发送能力,对CAN控制器提供差动接收能力,与ISO11898标准完全兼容。
PCA82C250芯片由接收器、驱动器、基准电压产生电路、工作模式选择电路及保护电路等组成。
PCA82C250内部的限流电路可以防止发送输出级对电池电压的正端和负端短路。
虽然在这种故障条件出现时,功耗将增加,但这种特性可以阻止发送器输出级的破坏。
在节点温度大约超过160℃时,两个发送器输出端的极限电流将减少。
由于发送器是功耗的主要部分,因此芯片温度会迅速降低。
PCA82C50芯片的其他部分将继续工作。
当总线短路时,热保护十分重要。
图3.4为PCA82C250引脚图。
图3.4为PCA82C250引脚图
3.5系统总体框图
图3.5为系统总体框图,主要说明单片机与SJA1000和PDIUSBD13的引脚连接。
图3.5系统总体框图
第3章软件设计
CAN总线的初始化程序
CAN总线的三层结构模型为:
物理层、数据链路层和应用层。
其中物理层和数据链路层的功能由SJA1000完成,系统的开发主要在应用层软件的设计上,它主要由三个子程序:
初始化子程序、发送数据和接收数据程序。
同时,还包括一些数据溢出中断以及帧出错的处理。
SJA1000在上电硬件复位之后,必须对其进行软件初始化之后才可以进行数据通讯,初始化过程主要包括对其复位模式下配置时钟分频寄存器CDR、总线定时寄存器BTR0和BTR1、验收代码寄存器ACR、验收屏蔽寄存器AMR及输出控制寄存器OCR等,实现对总线的速率、验收屏蔽码、输出引脚驱动方式、总线模式及时钟分频进行定义。
图4.1为CAN总线初始化流程图。
图4.1CAN总线初始化流程图
4.2SJA1000发送和接收数据的流程
SJA1000发送和接收数据的流程,基本过程为主控制器将数据保存到SJA1000发送缓冲器,然后对命令寄存器的发送请求TR标志位进行置位开始发送;接收过程为SJA1000将从总线上接收到的数据存入接收缓冲器,通过其中断标志位通知主控制器来处理接收到的信息,接收完毕之后清空缓冲器,等待下次接收。
图4.2为发送程序流程图,图4.3为接受程序流程图。
图4.2CAN总线发送程序流程图
图4.3CAN总线接收程序流程图
第4章课程设计总结
这次课程设计根据课题要求,复习了所学的工业控制网络课程内容,设计重点是理论与实践相结合,使我得到了一次用专业知识、专业技能分析和解决问题的锻炼。
通过这次课程设计使我明白了自己的知识还有所欠缺。
明白学习是一个长期积累的过程,在以后的工作、生活中都应该不断的学习,努力提高自己的综合素质。
本文主要研究USB的CAN总线适配器设计,以单片机AT89S21和SJA1000控制器为控制核心,完成系统的控制要求。
本文介绍了CAN总线的发展及它的一些性能指标,确定系统的方案设计,通过一些硬件连接完成了系统的硬件设计。
本文的核心在于SJA1000的初始化、发送和接受数据的程序设计,在老师的帮助下也顺利完成。
这次课设的重点在于动手实践,做出实验现象,不单单是一条条的程序分析。
在课设的过程中我了解了CAN总线的性能指标,还了解一些知识,不仅仅巩固了工业控制网络课程的内容,还大大的拓展我的知识面,了解了一些课外的知识,这对我将来走向工作岗位有了很大的帮助。
参考文献
[1]王彬、郑红平,CAN总线在远程抄表系统中的应用,北京:
清华大学出版社,2004:
19-48,81-93
[2]张凤登,现场总线技术应用,北京:
科学出版社,1990:
45-56
[3]梅丽凤,单片机原理及接口技术,北京:
清华大学出版社,2009:
126-135
[4]李庆峰,现场总线技术及其应用,北京:
机械工业出版社,2004:
25-40
[5]周季军,微型计算机控制,北京:
电子工业出版社,1997:
201-220
[6]李俊、郑勇云,现场总线CAN原理与应用技术,北京:
北京航空航天大学出版社,2000:
40-60
[7]邹继军,现场总线CAN原理与应用技术,北京:
北京航空航天大学出版社,2003.3
[8]邬宽明,现场总线技术应用选编,北京:
北京航空航天大学出版社,2004.2
[9]杨春杰,CAN总线技术,北京:
北京航空航天出版社,2010.1
附录
CAN初始化程序:
voidinit_can()large
{
unsignedintdatai;
for(i=0;i<512;i++)
{_nop_()
}
con_reg=ox41;
for(i=0;i<512;i++)
{_nop_()}
cpu_inter_reg=ox41;
clk_out_reg=ox30;
bus_config_reg=0;
g_m_s_reg0=oxff;
g_m_s_reg1=ox1f;
g_m_e_reg0=oxff;
g_m_e_reg1=oxff;
g_m_e_reg2=oxff;
g_e_s_reg3=oxff;
m15_m_reg0=oxff;
m15_m_reg1=ox1f;
m15_m_reg2=oxff;
m15_m_reg3=oxff;
tim0_reg=ox87;
tim1_reg=oxc8;
mesg_reg10=ox55;
mesg_reg20=ox55;
mesg_reg30=ox55;
mesg_reg40=ox55;
mesg_reg50=ox55;
mesg_reg60=ox55;
mesg_reg70=ox55;
mesg_reg80=ox55;
mesg_reg90=ox55;
mesg_rega0=ox55;
mesg_regb0=ox55;
mesg_regc0=ox55;
mesg_regd0=ox55;
mesg_rege0=ox55;
mesg_regf0=ox55;
mesg_reg16=ox88;
mesg_reg12=oxf3;
mesg_reg13=0;
mesg_reg14=0;
mesg_reg15=0;
mesg_reg10=ox95;
mesg_reg26=ox80;
mesg_reg22=oxf0;
mesg_reg24=0;
mesg_reg25=0;
mesg_reg21=ox55;
mesg_reg20=ox99;
mesg_regf6=ox80;
mesg_regf1=ox55;
mesg_regf0=ox99;
con_reg=ox02;
发送数据程序代码:
intcan_tran_file(intid,char*f)
{
voidfar*ptr;
charch;
inti,j,re_comd,length;
FILE*fp;
get_ram_access_right();
ptr=MK-FP(oxd000,0);
FP_OFF(ptr)+=ox100;
pokeb(FP_SEG(ptr),FP_OFF(ptr),02);
FP_OFF(ptr)++;
pokeb(FPSEG(ptr),FPOFF(ptr),id);
FP_OFF(ptr)++;
pokeb(FP_SEG(ptr),FP_OFF(ptr),1);
FP_OFF(ptr)++;
i=0;
while(f[i]!
='\0')
{
pokeb(FP_SEG(ptr),FP_OFF(ptr),f[i]);
FP_OFF(ptr)++;
i++;
}
pokeb(FP_SEG(ptr),FP_OFF(ptr),f[i]);
ptr=MK_FP(oxd000,0);
FP_OFF(ptr)+=ox120;
if(!
(fp=fopen(f,"rb")))
{
release_ram_acces_right();
return(6);
}
i=0;
while(!
feof(fp))
{
fread(&ch,sizeof(char),1,fp);
pokeb(FP_SEG(ptr),FP_OFF(ptr),ch);
FP_OFF(ptr)++;
i++;
}
fclose(fp);
length=i-1;
ptr=MK_FP(oxd000,0);
FP_OFF(ptr)+=0x114;
poke(FP_SEG(ptr),FP_OFF(ptr),length);
release_ram_acces_right();
inportb(0x218);for(i=0;i<6000;i++)ch='0';
get_ram_access_right();
prt=MK_FP(oxd000,0);
FP_OFF(ptr)+=ox4000;
re_comd=peekb(FP_SEG(ptr),FP_OFF(ptr));
if(re_comd==0x12){
pokeb(FP_SEG(ptr),FP_OFF(ptr),0);
release_ram_acces_right();
return
(1);
else{
ptr=MK_FP(oxd000,0);
FP_OFF(ptr)+=ox4020;
i=peekb(FP_SEG(ptr),FP_OFF(ptr));
release_ram_acces_right();
return(i);}}
接收数据子程序代码:
intcan_recv_file(intid,char*f)
{voidfra*ptr;
charch;
inti,j,re_comd,length;
get_ram_access_right();
ptr=mk_fp(oxd000,0);
fp_off(ptr)+=ox100;
pokeb(fp_seg(ptr),fp_off(ptr),01);
fp_off(ptr)++;
pokeb(fp_seg(ptr),fp_off(ptr),id);
pokeb(fp_seg(ptr),fp_pff(ptr),1);
fp_off(ptr)++;
i=0;
while(f[i]!
='\0')
{pokeb(fp_seg(ptr),fp_off(ptr),f[i]);
fp_off(ptr)++;
i++;}
pokeb(fp_seg(ptr),fp_off(ptr),f[i]);
release_ram_acces_right();
inportb(ox218);
for(i=0;i<6000;i++)ch='0';
get_ram_access_right();
ptr=mk_fp(oxd000,0);
fp_off(ptr)+=ox4000;
re_comd=peekb(fp_seg(ptr),fp_off(ptr));
if(re_comd==ox11)
{pokeb(fp_seg(ptr),fp_off(ptr),0);
if(!
(fp=fopen(f,"wb")))
{release_ram_accea_right();
return(6);}
ptr=mk_fp(oxd000,0);
fp_off(ptr)+=ox4014;
lenght=peek(fp_seg(ptr),fp_off(ptr));
ptr=mk_fp(oxd000,0);
fp_off(ptr)+=ox4020;
fwrite(ptr,sizeof(char),length,fp);
fclose(fp);
release_ram_acces_right();
return
(1);}
else
{ptr=mk_fp(oxd000,0);
fp_off(ptr)+=ox4020;
i=peekb(fp_seg(ptr),fp_off(ptr));
release_ram_acces_right();
return(i);}}
文本仅供参考,感谢下载!