USBCAN適配器設(shè)計_第1頁
USBCAN適配器設(shè)計_第2頁
USBCAN適配器設(shè)計_第3頁
USBCAN適配器設(shè)計_第4頁
USBCAN適配器設(shè)計_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、基于USB的CAN總線適配器設(shè)計07自動化4班 梁海森 (200730460411) 鄺巨泉 (200730460409)1、摘 要 隨著現(xiàn)場總線技術(shù)和計算機外設(shè)接口技術(shù)的發(fā)展,現(xiàn)場總線與計算機快速有效的連接又有了更多的方案,USB作為一種新型的接口技術(shù),以其簡單易用、速度快等特點而備受青睞。本文簡要提出了USB 接口與CAN總線連接方案,論述了系統(tǒng)的硬件構(gòu)成,固件開發(fā)和驅(qū)動程序等內(nèi)容。 關(guān)鍵詞:現(xiàn)場總線 USB CAN總線2、引 言 現(xiàn)場總線作為二十世紀(jì)80年代發(fā)展起來的新興技術(shù),在工業(yè)現(xiàn)場已有了廣泛的應(yīng)用。隨著信息技術(shù)的飛速發(fā)展,各種數(shù)據(jù)的實時采集和處理在現(xiàn)代工業(yè)控制中已成為必不可少的部分

2、。這要求我們設(shè)計的接口簡單靈活且具有較高的數(shù)據(jù)傳輸率。現(xiàn)場總線是連接智能現(xiàn)場設(shè)備和自動化系統(tǒng)的數(shù)字式、雙向傳輸、多分支結(jié)構(gòu)的通信網(wǎng)絡(luò)。如何將其與PC機安全可靠低成本的互連,是一個亟待解決的問題。傳統(tǒng)的外設(shè)與主機的通信接口難以滿足上述要求。這些接口一般采用PCI總線或RS-232串行總線。PCI總線雖然有很高的傳輸率(可達132Mbps),但是它們的擴充槽相當(dāng)有限,且設(shè)計復(fù)雜。RS-232串行總線連接方便,可是它的帶寬非常有限,傳輸速度慢。USB技術(shù)正是順應(yīng)這一要求提出的一種快速的,雙向的,同步傳輸?shù)?廉價的并可以進行熱插拔的通用串行總線。它還提供了內(nèi)置電源,可向低壓設(shè)備提供5伏的電源。正是由于

3、USB的這些特點,使其獲得了廣泛的應(yīng)用。CAN總線是現(xiàn)場總線的一種有效支持分布式控制或?qū)崟r控制的串行通信網(wǎng)絡(luò),具有卓越的特性和極高的可靠性,特別適合工業(yè)過程監(jiān)控設(shè)備的互連,被公認為幾種最有前途的現(xiàn)場設(shè)備總線之一。整個系統(tǒng)設(shè)計目的就是設(shè)計一個適配器,可以將CAN總線數(shù)據(jù)通過USB接口迅速轉(zhuǎn)送到PC機進行處理分析,也可以通過它向CAN節(jié)點傳送數(shù)據(jù)或命令,以實現(xiàn)計算機與現(xiàn)場設(shè)備的通訊。3、硬件電路的設(shè)計該系統(tǒng)主要由AT89C52控制電路、USB 接口電路、CAN總線電路、掛起復(fù)位電路、光電隔離電路等組成,本設(shè)計系統(tǒng)主要部件結(jié)構(gòu)圖如下:圖1 硬件電路結(jié)構(gòu)圖圖2 硬件仿真原理圖3.1 AT89C52控制

4、電路AT89C52 是一個低電壓,高性能CMOS 8位單片機,片內(nèi)置8k bytes的可反復(fù)擦寫的Flash存儲單元和256 bytes的隨機存取數(shù)據(jù)存儲器(RAM),功能強大。89C52是該接口電路的控制核心,其中P0,P2口用做16位數(shù)據(jù)I/O口,P1,P3口用做控制。3.2 CAN總線在本系統(tǒng)中,CAN控制器采用Philips公司生產(chǎn)的SJA1000,它作為一個發(fā)送、接受緩沖器,實現(xiàn)主控制器和總線之間的數(shù)據(jù)傳輸;CAN收發(fā)器采用TJA1050芯片,它是CAN控制器和物理總線的接口,主要可以提供對總線的差動發(fā)送能力和對CAN控制器的差動接受能力。 在CAN總線結(jié)構(gòu)中,總線的兩端還要配置兩個

5、120的電阻,其作用是總線匹配阻抗,可以增加總線傳輸?shù)姆€(wěn)定性和抗干擾能力,減少數(shù)據(jù)傳輸中的出錯率。為了增強CAN總線節(jié)點的抗干擾能力,SJA1000的TXO和RX0可通過高速光耦6N137與TJA1050相連,這樣就很好的實現(xiàn)了總線上各節(jié)點的電氣隔離。光耦部分電源與CAN_V必須用小功率電源隔離模塊進行隔離,這樣就提高了節(jié)點的穩(wěn)定性和安全性。3.3 USB接口本設(shè)計中的PDIUSBD12是一個性能優(yōu)化的USB器件,通常用于基于微控制器的系統(tǒng)并與微控制器通過高速通用并行接口進行通信。PDIUSBD12與MCU的接口有2種方式:多路地址/數(shù)據(jù)總線方式、單地址/數(shù)據(jù)總線方式。在這個系統(tǒng)中,我們采用的

6、是前一種方式:使用了AT89C52的INT0、ALE、WR、RD和P0口,A0 腳接地,當(dāng)PDIUSBD12接收到主機的有效信息時,會產(chǎn)生一個中斷通知89C52進行處理。若單片機的輸出地址為奇數(shù),則表示對PDIUSBD12發(fā)送指令;若輸出地址為偶數(shù),則表示對PDIUSBD12進行數(shù)據(jù)傳輸。AT89C52將數(shù)據(jù)經(jīng)PDIUSBD12的并行接口送入FIFO存儲器。對一個單片機而言,PDIUSBD12看起來就像1個帶8位數(shù)據(jù)總線和1個地址位的存儲器件??刂艭LKOUT 時鐘輸出為SJA1000提供時鐘輸入。由于在USB的信號傳遞過程中會摻雜進瞬間的高壓噪聲,這些噪聲對USB口的收發(fā)電路將產(chǎn)生致命的危害

7、,因此需要對這些噪聲電壓進行抑制。在USB接口電路中使用了SN75240,它可以對USB接口中的不正常電壓進行有效的抑制,以保證硬件設(shè)備的安全。4、微控制器的固件編程4.1 CAN總線的軟件設(shè)計CAN總線的三層結(jié)構(gòu)模型為:物理層、數(shù)據(jù)鏈路層和應(yīng)用層。其中物理層和數(shù)據(jù)鏈路層的功能由SJA1000完成,系統(tǒng)的開發(fā)主要在應(yīng)用層軟件的設(shè)計上,它主要由三個子程序:初始化子程序、發(fā)送數(shù)據(jù)和接收數(shù)據(jù)程序。同時,還包括一些數(shù)據(jù)溢出中斷以及幀出錯的處理。SJA1000在上電硬件復(fù)位之后,必須對其進行軟件初始化之后才可以進行數(shù)據(jù)通訊,初始化過程主要包括對其復(fù)位模式下配置時鐘分頻寄存器CDR、總線定時寄存器BTR0

8、和BTR1、驗收代碼寄存器ACR、驗收屏蔽寄存器AMR及輸出控制寄存器OCR等,實現(xiàn)對總線的速率、驗收屏蔽碼、輸出引腳驅(qū)動方式、總線模式及時鐘分頻進行定義。下面為SJA1000發(fā)送和接收數(shù)據(jù)的流程,基本過程為主控制器將數(shù)據(jù)保存到SJA1000發(fā)送緩沖器,然后對命令寄存器的發(fā)送請求TR標(biāo)志位進行置位開始發(fā)送;接收過程為SJA1000將從總線上接收到的數(shù)據(jù)存入接收緩沖器,通過其中斷標(biāo)志位通知主控制器來處理接收到的信息,接收完畢之后清空緩沖器,等待下次接收3。 圖3 CAN的發(fā)送數(shù)據(jù)流程 圖4 CAN接收數(shù)據(jù)的流程圖 發(fā)送數(shù)據(jù)子程序代碼(例):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控制權(quán)*/ ptr=MK-FP(oxd000,0); /*將命令、文件名、文件長度和文件內(nèi)存 入雙口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控制權(quán)*/ inportb(0x218); /*延時*/ for(i=0;i<6000;i+)ch='0' /*獲得雙口RAM控制權(quán)*/ 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); 接收數(shù)據(jù)子程序代碼(例):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控制權(quán)*/ 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控制權(quán)*/inportb(ox218); for(i=0;i<6000;i+)ch='0'get_ram_access_right(); /*得到雙口ram控制權(quán)*/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控制權(quán)*/ 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);/*接收失敗,返回出錯內(nèi)容*/ CAN初始化程序:void init_can()large unsigned int data i; for (i=0;

17、i<512;i+) _nop_() con_reg=ox41; /*設(shè)置軟件復(fù)位*/ for(i=0;i<512;i+) _nop_() cpu_inter_reg=ox41; /*設(shè)置cpu接口reg*/ clk_out_reg=ox30; bus_config_reg=0; g_m_s_reg0=oxff; /*設(shè)置標(biāo)準(zhǔn)標(biāo)識符屏蔽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;/*設(shè)置15號信息塊*/ m15_m_r

18、eg1=ox1f; m15_m_reg2=oxff; m15_m_reg3=oxff; tim0_reg=ox87; tim1_reg=oxc8; mesg_reg10=ox55;/*設(shè)置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號信息塊設(shè)置成傳輸方式*/mesg_reg12=oxf3;mesg_reg13=0;mesg_reg14=0;mesg_reg15=0;mesg_reg10=ox95;mesg_reg26=ox80;/*將2號信息塊設(shè)置成接收方式*/mesg_reg22=oxf0;mesg_reg24=0;mesg_reg25=0;mesg_reg21=ox55;mesg_reg20=ox99;mesg_regf6=ox80;/*將15號信息塊設(shè)置成接收方式*/mesg_regf1=ox55;mesg

20、_regf0=ox99;con_reg=ox02;/*設(shè)置控制reg*/5、 USB總線的軟件設(shè)計1、USB驅(qū)動程序設(shè)計:在Windows環(huán)境下,不允許用戶在應(yīng)用程序中直接訪問硬件設(shè)備,應(yīng)用程序必須通過一個中間橋梁才能訪問硬件設(shè)備,這個中間橋梁就是設(shè)備驅(qū)動程序。驅(qū)動程序是一個軟件,是連接應(yīng)用程序、硬件以及操作系統(tǒng)的橋梁,裝入后成為操作系統(tǒng)內(nèi)核的一部分。在這里應(yīng)用DriverStudio軟件來編寫驅(qū)動程序,DriverStudio把那些每個驅(qū)動程序都需要的代碼都封裝成類庫。庫代碼自動地處理例行的操作,這極大地簡小了任務(wù)的復(fù)雜度。而且,C+編譯器提供了ANSIC 所不具備的優(yōu)點:包括改進的類型安全

21、檢查,內(nèi)連函數(shù)優(yōu)化,以及更好的代碼組織。下面為用DriverStudio開發(fā)一個USB驅(qū)動程序的過程。寫這個驅(qū)動程序只要用到DriverWorks。1) 首先打開VC+6.0軟件在菜單中選擇DriverStudio選項中的DriverWorks。2) 選擇其中的Start aNew Driver Project選項,創(chuàng)建一個新工程。3) 命名工程,保存,點擊next。4) 選擇驅(qū)動程序的類型。由于USB設(shè)備驅(qū)動程序是WDM類型的,所以選擇第一項,并在下邊選擇Driverworks C+語言框架點擊按鈕“Next”。5) 選擇類型,由于的USB設(shè)備驅(qū)動是要控制的硬件設(shè)備的,所以我們選擇第一項,單

22、擊“Next”。6) 選擇的驅(qū)動程序所操作的總線類型。這里選擇USB。在USB Vendor ID和USB Product ID中填入USB設(shè)備的VID和PID。點擊對話框中的,可以選擇電腦中連接的USB設(shè)備。在這里可以找到要識別的USB實驗板,可以點擊select來選擇這個硬件。在接下來的對話框中,需要加入Endpoint1和Endpoint2的定義。點“Add”按鈕,彈出一個的對話框,按照USB的規(guī)定,對于端點,它的地址是1;按照前面說明的設(shè)備的特點,Endpoint1的最大的包大小為16字節(jié),因此在“Max Transer Size”中填入16;Endpoint Name可以通過“Sug

23、gest Name”得到。按照這些原則,繼續(xù)設(shè)置其他的配置,接下來繼續(xù)按“Next”按鈕。 7) 給驅(qū)動程序增加一些IOCTL接口,然后點擊“Next”按鈕。 在接下來的對話框不需要創(chuàng)建任何注冊表項,所以直接按“Next”按鈕,接下來為電源設(shè)置,選擇第1項,按“Next”按鈕。8) 設(shè)置本驅(qū)動程序的提供商,廠商的名字及設(shè)備描述,服務(wù)描述等。按“Next”按鈕。附加選項,直接點“Next”按鈕。9) 最后得到確認框圖,確認無誤后選擇“Finish”完成了USB設(shè)備的驅(qū)動程序的初步設(shè)置。從驅(qū)動中讀數(shù)據(jù)的程序如下: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程序設(shè)計: PDIUSBD12 是一款帶有并行總線和局部DMA傳輸能力的高速USB 接口器件,它支持USB1.1協(xié)議的所有傳輸方式,在本設(shè)計中用到了控制傳輸,中斷傳輸和批量傳輸。控制傳輸處理主機到USB設(shè)備的控制信息,固定使用端點0。中斷傳輸用來傳送數(shù)據(jù)量很小,但需要及時處理,以達到實時效果的數(shù)據(jù),使用端點1。批量傳輸用來實現(xiàn)CAN節(jié)點與主機之間大數(shù)據(jù)快傳送,使用主端點(端點2),一次最大可發(fā)送64字節(jié)。PDIUSBD12 的固

26、件設(shè)計成完全的中斷驅(qū)動,當(dāng)MCU 處理前臺任務(wù)時USB 的傳輸可在后臺進行。這就確保了最佳的傳輸速率和更好的軟件結(jié)構(gòu),同時簡化了編程和調(diào)試。后臺ISR 中斷服務(wù)程序和前臺主程序循環(huán)之間的數(shù)據(jù)交換通過事件標(biāo)志和數(shù)據(jù)緩沖區(qū)來實現(xiàn),當(dāng)PDIUSBD12 從USB 收到一個數(shù)據(jù)包那么就對MCU 產(chǎn)生一個中斷請求,MCU立即響應(yīng)中斷,在ISR中固件將數(shù)據(jù)包從PDIUSBD12 內(nèi)部緩沖區(qū)移到數(shù)據(jù)緩沖區(qū),并在隨后清零PDIUSBD12 的內(nèi)部緩沖區(qū),以使能接收新的數(shù)據(jù)包。MCU 可以繼續(xù)它當(dāng)前的前臺任務(wù),返回到主循環(huán)檢查循環(huán)緩沖區(qū)內(nèi)是否有新的數(shù)據(jù)。 圖5 PDIUSBD12固件編程結(jié)構(gòu)圖這部分程序結(jié)構(gòu)可包

27、括:1) 請求處理程序?qū)SB的標(biāo)準(zhǔn)設(shè)備請求進行處理和對用戶添加的廠商請求進行處理;USB設(shè)備接入主機后要進入復(fù)雜的設(shè)備列舉過程,并安裝正確的驅(qū)動程序。2)硬件提取層對單片機的I/O口、數(shù)據(jù)總線等硬件接口進行操作,該層包含最底層的函數(shù),這些函數(shù)在不同的MCU 平臺上需要進行改變,void outportb(unsigned char port,unsigned char val);void inportb(unsigned char port);對PDIUSBD12 所有的I/O 訪問都可由它們實現(xiàn);3)PDIUSBD12 命令接口對PDIUSBD12器件進行操作的模塊子程序集,以簡化器件的編

28、程;4)中斷服務(wù)程序當(dāng)PDIUSBD12向單片機發(fā)出中斷請求時,讀取PDIUSBD12的中斷傳輸來的數(shù)據(jù),并設(shè)定事件標(biāo)志和Setup包數(shù)據(jù)緩沖區(qū),傳輸給主循環(huán)。5)主循環(huán)發(fā)送USB請求,處理USB總線事件和用戶功能處理等。MCU 一旦上電就需要初始化其所有端口存儲區(qū),中斷服務(wù)程序。在主循環(huán)程序中MCU 對事件進行輪詢,如有CAN總線發(fā)來的數(shù)據(jù),則送往PDIUSBD12進行發(fā)送,如有USB總線數(shù)據(jù),則啟動CAN發(fā)送程序,它們在接口的接收工作分別由各自的中斷程序完成。要注意的是,我們在用了PDIUSBD12的端口最大一次可發(fā)送64字節(jié),SJA1000一次最多能發(fā)8字節(jié), 如果端口1傳輸?shù)拈L度大于8

29、 字節(jié),MCU 在傳輸階段就必須根據(jù)數(shù)據(jù)大小,分?jǐn)?shù)次完成CAN數(shù)據(jù)的發(fā)送工作。PDIUSBD12初始化程序:void D12_init() D12_SetAddressEnable(0,1); D12_SetEndpointEnable(1); Disconnect(); Delay(2); Connect();D12_ReadInterruptRegister();6、上位機軟件的設(shè)計 在這里,我們采用Microsoft Visual C+6.0進行主機程序設(shè)計,具體操作步驟如下: 首先,新建一個文件,在彈出的對話框中選擇工程中的MFC AppWizard(exe)工程名為MFCApp,找到放置文

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論