




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于USB的CAN总线适配器设计07自动化4班 梁海森 (200730460411) 邝巨泉 (200730460409)1、摘 要 随着现场总线技术和计算机外设接口技术的发展,现场总线与计算机快速有效的连接又有了更多的方案,USB作为一种新型的接口技术,以其简单易用、速度快等特点而备受青睐。本文简要提出了USB 接口与CAN总线连接方案,论述了系统的硬件构成,固件开发和驱动程序等内容。 关键词:现场总线 USB CAN总线2、引 言 现场总线作为二十世纪80年代发展起来的新兴技术,在工业现场已有了广泛的应用。随着信息技术的飞速发展,各种数据的实时采集和处理在现代工业控制中已成为必不可少的部分
2、。这要求我们设计的接口简单灵活且具有较高的数据传输率。现场总线是连接智能现场设备和自动化系统的数字式、双向传输、多分支结构的通信网络。如何将其与PC机安全可靠低成本的互连,是一个亟待解决的问题。传统的外设与主机的通信接口难以满足上述要求。这些接口一般采用PCI总线或RS-232串行总线。PCI总线虽然有很高的传输率(可达132Mbps),但是它们的扩充槽相当有限,且设计复杂。RS-232串行总线连接方便,可是它的带宽非常有限,传输速度慢。USB技术正是顺应这一要求提出的一种快速的,双向的,同步传输的,廉价的并可以进行热插拔的通用串行总线。它还提供了内置电源,可向低压设备提供5伏的电源。正是由于
3、USB的这些特点,使其获得了广泛的应用。CAN总线是现场总线的一种有效支持分布式控制或实时控制的串行通信网络,具有卓越的特性和极高的可靠性,特别适合工业过程监控设备的互连,被公认为几种最有前途的现场设备总线之一。整个系统设计目的就是设计一个适配器,可以将CAN总线数据通过USB接口迅速转送到PC机进行处理分析,也可以通过它向CAN节点传送数据或命令,以实现计算机与现场设备的通讯。3、硬件电路的设计该系统主要由AT89C52控制电路、USB 接口电路、CAN总线电路、挂起复位电路、光电隔离电路等组成,本设计系统主要部件结构图如下:图1 硬件电路结构图图2 硬件仿真原理图3.1 AT89C52控制
4、电路AT89C52 是一个低电压,高性能CMOS 8位单片机,片内置8k bytes的可反复擦写的Flash存储单元和256 bytes的随机存取数据存储器(RAM),功能强大。89C52是该接口电路的控制核心,其中P0,P2口用做16位数据I/O口,P1,P3口用做控制。3.2 CAN总线在本系统中,CAN控制器采用Philips公司生产的SJA1000,它作为一个发送、接受缓冲器,实现主控制器和总线之间的数据传输;CAN收发器采用TJA1050芯片,它是CAN控制器和物理总线的接口,主要可以提供对总线的差动发送能力和对CAN控制器的差动接受能力。 在CAN总线结构中,总线的两端还要配置两个
5、120的电阻,其作用是总线匹配阻抗,可以增加总线传输的稳定性和抗干扰能力,减少数据传输中的出错率。为了增强CAN总线节点的抗干扰能力,SJA1000的TXO和RX0可通过高速光耦6N137与TJA1050相连,这样就很好的实现了总线上各节点的电气隔离。光耦部分电源与CAN_V必须用小功率电源隔离模块进行隔离,这样就提高了节点的稳定性和安全性。3.3 USB接口本设计中的PDIUSBD12是一个性能优化的USB器件,通常用于基于微控制器的系统并与微控制器通过高速通用并行接口进行通信。PDIUSBD12与MCU的接口有2种方式:多路地址/数据总线方式、单地址/数据总线方式。在这个系统中,我们采用的
6、是前一种方式:使用了AT89C52的INT0、ALE、WR、RD和P0口,A0 脚接地,当PDIUSBD12接收到主机的有效信息时,会产生一个中断通知89C52进行处理。若单片机的输出地址为奇数,则表示对PDIUSBD12发送指令;若输出地址为偶数,则表示对PDIUSBD12进行数据传输。AT89C52将数据经PDIUSBD12的并行接口送入FIFO存储器。对一个单片机而言,PDIUSBD12看起来就像1个带8位数据总线和1个地址位的存储器件。控制CLKOUT 时钟输出为SJA1000提供时钟输入。由于在USB的信号传递过程中会掺杂进瞬间的高压噪声,这些噪声对USB口的收发电路将产生致命的危害
7、,因此需要对这些噪声电压进行抑制。在USB接口电路中使用了SN75240,它可以对USB接口中的不正常电压进行有效的抑制,以保证硬件设备的安全。4、微控制器的固件编程4.1 CAN总线的软件设计CAN总线的三层结构模型为:物理层、数据链路层和应用层。其中物理层和数据链路层的功能由SJA1000完成,系统的开发主要在应用层软件的设计上,它主要由三个子程序:初始化子程序、发送数据和接收数据程序。同时,还包括一些数据溢出中断以及帧出错的处理。SJA1000在上电硬件复位之后,必须对其进行软件初始化之后才可以进行数据通讯,初始化过程主要包括对其复位模式下配置时钟分频寄存器CDR、总线定时寄存器BTR0
8、和BTR1、验收代码寄存器ACR、验收屏蔽寄存器AMR及输出控制寄存器OCR等,实现对总线的速率、验收屏蔽码、输出引脚驱动方式、总线模式及时钟分频进行定义。下面为SJA1000发送和接收数据的流程,基本过程为主控制器将数据保存到SJA1000发送缓冲器,然后对命令寄存器的发送请求TR标志位进行置位开始发送;接收过程为SJA1000将从总线上接收到的数据存入接收缓冲器,通过其中断标志位通知主控制器来处理接收到的信息,接收完毕之后清空缓冲器,等待下次接收3。 图3 CAN的发送数据流程 图4 CAN接收数据的流程图 发送数据子程序代码(例):int can_tran_file(int id ,ch
9、ar *f)void far *ptr;char ch;int i,j,re_comd,length;FILE *fp; get_ram_access_right(); /*获得双口RAM控制权*/ ptr=MK-FP(oxd000,0); /*将命令、文件名、文件长度和文件内存 入双口RAM*/FP_OFF(ptr)+=ox100; pokeb(FP_SEG(ptr),FP_OFF(ptr),02); FP_OFF(ptr)+; pokeb(FP SEG(ptr),FP OFF(ptr),id); FP_OFF(ptr)+; pokeb(FP_SEG(ptr),FP_OFF(ptr),1);
10、 FP_OFF(ptr)+; i=0; while(fi!='0') pokeb(FP_SEG(ptr),FP_OFF(ptr),fi); FP_OFF(ptr)+; i+; pokeb(FP_SEG(ptr),FP_OFF(ptr),fi); 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(F
11、P_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(); /*释放双口RAM控制权*/ inportb(0x218); /*延时*/ for(i=0;i<6000;i+)ch='0' /*获得双口RAM控制权*/ get_ram_access_right(); prt=MK_FP(o
12、xd000,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); /*传送成功,返回1*/ else ptr=MK_FP(oxd000,0); FP_OFF(ptr)+=ox4020; i=peekb(FP_SEG(ptr),FP_OFF(ptr); release_ram_acces_right(); return
13、(i); 接收数据子程序代码(例):int can_recv_file(int id,char *f) void fra *ptr; char ch; int i,j,re_comd,length; file *fp; get_ram_access_right();/*得到双口ram控制权*/ 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); fp_off(ptr)+; pokeb(fp_seg(
14、ptr),fp_pff(ptr),1); fp_off(ptr)+; i=0; while(fi!='0') pokeb(fp_seg(ptr),fp_off(ptr),fi); fp_off(ptr)+; i+; pokeb(fp_seg(ptr),fp_off(ptr),fi);release_ram_acces_right();/*释放双口ram控制权*/inportb(ox218); for(i=0;i<6000;i+)ch='0'get_ram_access_right(); /*得到双口ram控制权*/ptr=mk_fp(oxd000,0);f
15、p_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(); /*释放双口ram控制权*/ 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(
16、ptr)+=ox4020;fwrite(ptr,sizeof(char),length,fp);fclose(fp);release_ram_acces_right();return(1); /*接收成功,返回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);/*接收失败,返回出错内容*/ CAN初始化程序:void init_can()large unsigned int data i; for (i=0;
17、i<512;i+) _nop_() con_reg=ox41; /*设置软件复位*/ for(i=0;i<512;i+) _nop_() cpu_inter_reg=ox41; /*设置cpu接口reg*/ clk_out_reg=ox30; bus_config_reg=0; g_m_s_reg0=oxff; /*设置标准标识符屏蔽reg*/ 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;/*设置15号信息块*/ m15_m_r
18、eg1=ox1f; m15_m_reg2=oxff; m15_m_reg3=oxff; tim0_reg=ox87; tim1_reg=oxc8; mesg_reg10=ox55;/*设置1到15好信息块的控制reg*/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=ox5
19、5;mesg_rege0=ox55;mesg_regf0=ox55; mesg_reg16=ox88;/*将1号信息块设置成传输方式*/mesg_reg12=oxf3;mesg_reg13=0;mesg_reg14=0;mesg_reg15=0;mesg_reg10=ox95;mesg_reg26=ox80;/*将2号信息块设置成接收方式*/mesg_reg22=oxf0;mesg_reg24=0;mesg_reg25=0;mesg_reg21=ox55;mesg_reg20=ox99;mesg_regf6=ox80;/*将15号信息块设置成接收方式*/mesg_regf1=ox55;mesg
20、_regf0=ox99;con_reg=ox02;/*设置控制reg*/5、 USB总线的软件设计1、USB驱动程序设计:在Windows环境下,不允许用户在应用程序中直接访问硬件设备,应用程序必须通过一个中间桥梁才能访问硬件设备,这个中间桥梁就是设备驱动程序。驱动程序是一个软件,是连接应用程序、硬件以及操作系统的桥梁,装入后成为操作系统内核的一部分。在这里应用DriverStudio软件来编写驱动程序,DriverStudio把那些每个驱动程序都需要的代码都封装成类库。库代码自动地处理例行的操作,这极大地简小了任务的复杂度。而且,C+编译器提供了ANSIC 所不具备的优点:包括改进的类型安全
21、检查,内连函数优化,以及更好的代码组织。下面为用DriverStudio开发一个USB驱动程序的过程。写这个驱动程序只要用到DriverWorks。1) 首先打开VC+6.0软件在菜单中选择DriverStudio选项中的DriverWorks。2) 选择其中的Start aNew Driver Project选项,创建一个新工程。3) 命名工程,保存,点击next。4) 选择驱动程序的类型。由于USB设备驱动程序是WDM类型的,所以选择第一项,并在下边选择Driverworks C+语言框架点击按钮“Next”。5) 选择类型,由于的USB设备驱动是要控制的硬件设备的,所以我们选择第一项,单
22、击“Next”。6) 选择的驱动程序所操作的总线类型。这里选择USB。在USB Vendor ID和USB Product ID中填入USB设备的VID和PID。点击对话框中的,可以选择电脑中连接的USB设备。在这里可以找到要识别的USB实验板,可以点击select来选择这个硬件。在接下来的对话框中,需要加入Endpoint1和Endpoint2的定义。点“Add”按钮,弹出一个的对话框,按照USB的规定,对于端点,它的地址是1;按照前面说明的设备的特点,Endpoint1的最大的包大小为16字节,因此在“Max Transer Size”中填入16;Endpoint Name可以通过“Sug
23、gest Name”得到。按照这些原则,继续设置其他的配置,接下来继续按“Next”按钮。 7) 给驱动程序增加一些IOCTL接口,然后点击“Next”按钮。 在接下来的对话框不需要创建任何注册表项,所以直接按“Next”按钮,接下来为电源设置,选择第1项,按“Next”按钮。8) 设置本驱动程序的提供商,厂商的名字及设备描述,服务描述等。按“Next”按钮。附加选项,直接点“Next”按钮。9) 最后得到确认框图,确认无误后选择“Finish”完成了USB设备的驱动程序的初步设置。从驱动中读数据的程序如下:void rec_data(unsigned char *can_rec) unsig
24、ned char outbuf105; HANDLE hFile, hDevice=0; BOOL bResult; ULONG nBytes = 0; nBytes =25; hFile = open_file("PIPE02"); if(hFile = INVALID_HANDLE_VALUE) return; hDevice = open_dev(); bResult = ReadFile(hFile,outbuf,10,&nBytes,NULL);if(bResult=FALSE) DeviceIoControl(hFile,IOCTL_D12_RESET_
25、PIPE,0,0,0,0,&nBytes,NULL); CloseHandle(hFile); CloseHandle(hDevice);2、PDIUSBD12程序设计: PDIUSBD12 是一款带有并行总线和局部DMA传输能力的高速USB 接口器件,它支持USB1.1协议的所有传输方式,在本设计中用到了控制传输,中断传输和批量传输。控制传输处理主机到USB设备的控制信息,固定使用端点0。中断传输用来传送数据量很小,但需要及时处理,以达到实时效果的数据,使用端点1。批量传输用来实现CAN节点与主机之间大数据快传送,使用主端点(端点2),一次最大可发送64字节。PDIUSBD12 的固
26、件设计成完全的中断驱动,当MCU 处理前台任务时USB 的传输可在后台进行。这就确保了最佳的传输速率和更好的软件结构,同时简化了编程和调试。后台ISR 中断服务程序和前台主程序循环之间的数据交换通过事件标志和数据缓冲区来实现,当PDIUSBD12 从USB 收到一个数据包那么就对MCU 产生一个中断请求,MCU立即响应中断,在ISR中固件将数据包从PDIUSBD12 内部缓冲区移到数据缓冲区,并在随后清零PDIUSBD12 的内部缓冲区,以使能接收新的数据包。MCU 可以继续它当前的前台任务,返回到主循环检查循环缓冲区内是否有新的数据。 图5 PDIUSBD12固件编程结构图这部分程序结构可包
27、括:1) 请求处理程序对USB的标准设备请求进行处理和对用户添加的厂商请求进行处理;USB设备接入主机后要进入复杂的设备列举过程,并安装正确的驱动程序。2)硬件提取层对单片机的I/O口、数据总线等硬件接口进行操作,该层包含最底层的函数,这些函数在不同的MCU 平台上需要进行改变,void outportb(unsigned char port,unsigned char val);void inportb(unsigned char port);对PDIUSBD12 所有的I/O 访问都可由它们实现;3)PDIUSBD12 命令接口对PDIUSBD12器件进行操作的模块子程序集,以简化器件的编
28、程;4)中断服务程序当PDIUSBD12向单片机发出中断请求时,读取PDIUSBD12的中断传输来的数据,并设定事件标志和Setup包数据缓冲区,传输给主循环。5)主循环发送USB请求,处理USB总线事件和用户功能处理等。MCU 一旦上电就需要初始化其所有端口存储区,中断服务程序。在主循环程序中MCU 对事件进行轮询,如有CAN总线发来的数据,则送往PDIUSBD12进行发送,如有USB总线数据,则启动CAN发送程序,它们在接口的接收工作分别由各自的中断程序完成。要注意的是,我们在用了PDIUSBD12的端口最大一次可发送64字节,SJA1000一次最多能发8字节, 如果端口1传输的长度大于8
29、 字节,MCU 在传输阶段就必须根据数据大小,分数次完成CAN数据的发送工作。PDIUSBD12初始化程序:void D12_init() D12_SetAddressEnable(0,1); D12_SetEndpointEnable(1); Disconnect(); Delay(2); Connect();D12_ReadInterruptRegister();6、上位机软件的设计 在这里,我们采用Microsoft Visual C+6.0进行主机程序设计,具体操作步骤如下: 首先,新建一个文件,在弹出的对话框中选择工程中的MFC AppWizard(exe)工程名为MFCApp,找到放置文
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 完善网络信息安全培训规程
- 康复医学康复规程
- 农作物生长环境调查方案
- 农业农村环境保护规定
- 2025至2030年中国营养师培训市场运行现状及行业发展趋势预测报告
- 2025浙江省金华成泰农商银行社会招聘笔试备考试题及答案解析
- 水利工程水库设计总结
- 2025榆林高新第六小学招聘笔试含答案
- 2025乡村社区后备干部考试题及答案
- 2025乌什县消防救援大队招聘政府专职消防员(6人)笔试参考题库附答案解析
- 华南理工大学《微积分Ⅱ(二)》2021-2022学年第一学期期末试卷
- 高职数学课件 1.1函数
- GB/T 5526-2024动植物油脂相对密度的测定
- 北师大版 五年级上册数学 预习单
- 2.10丰巢智能柜合作协议
- 九一八知识竞赛题50题
- 《人皆有不忍人之心》 统编版高中语文选择性必修上册
- 水库除险加固及主体工程投入使用验收鉴定书
- AQ 1064-2008 煤矿用防爆柴油机无轨胶轮车安全使用规范(正式版)
- 《铸牢中华民族共同体意识》课件
- 教科版四年级科学上册全册教学设计(表格式)
评论
0/150
提交评论