歡迎您光臨本站 登入註冊首頁

CY7C68013晶元的系統固件程序設計

admin @ 2014-03-26 , reply:0

概述

   在USB產生之前,現代工業生產中一般通過PCI口、ISA口或是RS232串列介面進行數據的採集;但是這些傳統的介面存在著體積龐大、共享性差、電磁抗干擾性弱等缺點,因……

    在USB產生之前,現代工業生產中一般通過PCI口、ISA口或是RS232串列介面進行數據的採集;但是這些傳統的介面存在著體積龐大、共享性差、電磁抗干擾性弱等缺點,因此所採集的數據容易失真,與傳統的介面相比較,USB介面技術以其即插即用、熱插拔、介面體積小巧、節省系統資源、傳輸可靠、提供電源、良好的兼容性、共享式通信和低成本等優點,成為外圍設備與計算機進行連接的新型介面,同時也被廣泛應用於現代工業數據採集。Cypress公司的EZ-USB FX2系列晶元中的CY7C68013就是一款性能較高的USB2.0微控制器,該數據採集卡就是以該晶元作為核心設計的。

1 USB型數據採集卡簡介
    該數據採集卡應用在電機參數測試虛擬儀器中,用來對電機的相關數據進行採集和分析,該數據採集卡基於USB匯流排,由A/D轉換器、存儲器、CY7C68O13晶元與工業控制計算機USB匯流排的介面等組成,模擬信號經過放大器放大,送到A/D轉換器的輸入端,在CY7C68013晶元的控制下由AD5220完成A/D轉換,並把數據存放在存儲器中,然後由工業控制計算機匯流排USB介面將數據調入計算機中進行處理,用戶通過客戶端軟體即可對數據採集卡進行固件下載,獲取管道信息,採集數據,進行存儲等操作(而之所以要進行固件下載,是因為其沒有ROM,每次上電都必須重新下載一個HEX文件,該固件的作用是輔助或者說控制硬體來完成預期的功能)。其中,CY7C68013介面晶元是Cypress公司EZ-USB FX2系列晶元中的一款,它是第1個集成了USB2.0協議的微處理器,它支持12 Mb/s的全速傳輸和480 Mb/s的高速傳輸,可使用4種USB傳輸方式:控制傳輸、中斷傳輸、塊傳輸和同步傳輸,完全適用於USB2.0,並向下兼容USB1.1。該晶元有以下的特點:
1)集成了一塊增強型的8051內核.它比標準型的8051速度更快,功能更強,且指令集和標準8051完全兼容。
2)集成有一個串列介面引擎以及一個USB2.0收發器。由於USB2.0收發器和串列介面引擎完成了USB協議的封包、解包等功能,屏蔽了底層信號的電器特性。
3)支持軟配置。採用再次枚舉技術,固件程序可以保存在主機上,每次上電后通過USB介面將固件下載到晶元RAM 中,具有很大的靈活性。
4)通用可編程介面(GPIF)。GPIF提供可編程式控制制的介面時序,使得無需附加邏輯就能實現與外圍晶元的連接。
5)4個可編程埠(Endpoint)。CY7C68013共有7個輸入輸出埠:EP0,EP1OUT,EP1IN,EP2,EP4,EP6,EP8.其中EP2,EP4,EP6,EP8分別可以被配置為批量/中斷/同步傳輸模式,傳輸方向均可配置為出/入。
6)可編程緩衝區(Buffer)深度。埠EP2,EP6的緩衝區大小可編程為512位元組或1024位元組,深度可編程為2/3/4倍大小;埠EP4,EP8的緩衝區固定為512位元組,深度為2倍。採用不同的配置方式,實現特定帶寬,速率要求的數據傳輸。

2 固件編程
    固件是在USB介面晶元加電后,由其他設備載入到CY7C68013中並在其中運行完成介面數據傳送功能的一段程序.其作用是輔助或者說控制硬體來完成預期的設備功能.固件的主要功能包括:初始化工作;輔助硬體完成設備的重新列舉(ReNumeration)過程,對主機的設備響應做出適當的響應;對中斷的處理;數據的接受與發送;對外圍電路的控制。
    在該系統中,CY7C68013晶元的固件程序控制整個硬體系統的運行,並負責處理PC主機發來的各種USB請求,以完成它們之間的數據傳輸。該固件的編程,是根據Cypress公司提供的固件編程框架(如圖1所示)來完成的。開發所使用的編程語言則是Keil公司的C51編譯器,集成開發環境為uVision2。所使用的傳輸方式為高速塊IN傳輸。
    這個程序框架按照結構化的程序設計方法,將整個程序分為幾個不同的功能模塊,分別是初始化,重新列舉和響應設備請求。
 
    初始化:主程序一開始首先進行一些全局變數的初始化工作,之後調用TD-Init()函數.用戶在該函數中添加自己的初始化代碼以配置I/O埠.初始化工作還包括開中斷,清除所有等待的USB中斷請求等。
    重新列舉:初始化之後,固件程序將會檢測是否收到設置數據(GOTSUD標誌位是否為真);如果沒有,程序會以1 s為間隔,軟體模擬設備的斷開和連接,直到收到設置數據為止。
    最後就是響應設備請求。
    在該固件的程序設計中,共包含9個程序文件:testregs.h,testregs.inc,testheader.h,testdly.h,dscrptr.a51,delayms.a51,jumptable.a51,main.c和function.c。其中,頭文件testregs.h,testregs.inc對EZ-USB FX2中的各種功能寄存器進行了定義;testheader.h定義了通用的FX2常量、數據類型和宏;testdly.h定義了FX2中某些寄存器所需的同步延時宏;dscrptr.a51定義了系統所使用的各種USB描述符;delayms.a51中包含了延時1 ms子程序和晶元掛起處理子程序;jumptable.a51文件定義了FX2中的中斷跳轉表;main.c是固件運行的主程序文件,負責處理各種USB設備請求;function.c中包含各種功能函數的定義,如TD-Init和TD-Poll。
    在main.c文件的基礎上,還定義了3個中斷服務子程序,其中2個中斷將數據讀取到塊端點IN6的緩衝區,並配置端點IN2以供主機訪問。function.c中的TD-Init函數負責對CY7C68013進行初始化,它在固件運行的開始時調用,首先設置CPU時鐘為48 MHz,然後配置EZ-USB FX2的各個端點,最後是能下載FX2的雙自動指針特性和遠程喚醒功能。TD-Poll函數則負責完成USB塊傳輸,在該程序中,使用了3個塊端點:IN6,OUT2和OUT7。其中,IN6負責讀取AD5220模數轉換的結果,並將其送到主機;OUT2負責清空緩衝器並啟動定時器;OUT7負責停止定時器。

3 應用程序
    該應用程序主要負責讀取系統硬體所採集的數據,並實時的以波形方式顯示出來,同時還可以讀取USB設備描述符、配置描述符和下載EZ—USB FX2固件代碼的功能。它所使用的編程語言是微軟公司的Visual C++。
1)EZ-USB FX2中寄存器CPUCS的第0位控制著增強型8051的複位操作,該位為1則鎖定CPU為複位狀態;該位為0則結束對CPU的鎖定,使其開始正常工作。在該程序中8051的鎖定和複位通過使用供應商自定義請求代碼IOCTL-Ezusb_VENDOR_REQUEST來實現。其中,CPUCS控制寄存器的地址為0xE600,VENDOR_REQUEST_IN中的bData為1表示鎖定,為0則為複位。實現8051鎖定的部分代碼如下:
BOOLEAN CUsbhostDlg::usb8051hold
(HANDLE *phDeviceHandle)
{
VENDOR_REQUEST_IN myRequest;
……
myRequest.bRequest=0xA0;//固件載入請求
myRequest.wValue=0xE600;//cpucs寄存器的地址
myRequest.wIndex=0x00;
myRequest.wLength=0x01;
myRequest.bData=1;//傳輸的數據值,為1標示鎖定,為0表示複位
myRequest.direction=0x00;
bResult= DeviceloControl
(hDevice,
IOCTL_Ezusb_VENDOR_REQUEST,
&myRequest,sizeof(VENDOR_REQUEST_IN),
NULL,
0,
(unsigned long *)&nBytes,
NULL);
……
}
2)下載程序按鈕用於從主機上下載EZ-USB FX2的晶元固件程序,由增強型8051執行。該程序下載的文件類型為.hex,容量小於8 Kb,且僅能下載至FX2的片內RAM 中。其部分代碼如下所示。它首先調用UsbOpenDriver來打開指定的USB設備;然後讀取所下載文件的內容;最後使用IOCTL_Ezusb_ANCHOR_DOWNLOAD請求完成數據下載。在進行下載之前,要鎖定EZ-USB FX2,下載結束后,要使用8051複位來結束鎖定。其中的部分代碼如下:
void CUsbhostDlg::OnDownloadFile()
{
if(UsbOpenDriver(&hDevice,DeviceName)!= TRUE)
{MessageBox("無效設備,請重試!");
return ;
}
BOOLEAN res1=usb8051hold(&hDevice);
if(res1==TRUE)
{
CFileDialog dlgLoad(
TRUE,0,0,
OFN_HIDEREADONLY
OFN_OVERWRITEPROMPT,
dlgLoad.m_ofn.lpstrTitle=
"Anchor Download";
if(dlgLoad.DoModal()!= IDOK)
return;
m_strDldFile= dlgLoad.m_ofn.lpstrFile;
……
bResult= DeviceIoControl(hDevice,IOCTL_Ezusb_ANCHOR_DOWNLOAD,
buffer,
numreadfile,
NULL,
0,
&nBytes,
NULL);
……
//進行數據傳輸前,首先通過//IOCTL_Ezusb_RESETPIPE來複位管道6
bResultl= DeviceIoControl(hDevice,IOCTL_Ezusb_RESETPIPE,
&input,sizeof(unsigned long),
NULL,
0,
&nBytes1,
NULL);
……
//啟動接收數據的線程
g_KeepGoing = true;
if(_beginthread(ReceiveThreadFunction,0,hDevice)< 0)
{
AfxMessageBox("啟動接收數據線程失敗!");
}
}
3)在複位管道6之後,就準備接受數據了,然後調用_beginthread函數來啟動接收數據的線程,其函數名是ReceiveThreadFunction。在該線程中,循環向塊端點6發出IOCTL_EZUSB_BULK_READ 請求,來讀取系統硬體所上傳的數據,如果返回的數據長度是512位元組,則說明讀取數據成功了,同時把這些數據存儲在硬碟上。ReceiveThreadFunction函數的部分代碼如下所示:
void _cdecl ReceiveThreadFunction(HANDLE hDeviee)
{
……
//讀取數據
while(g_KeepGoing)
{
nBytes = 0;
bulkContro1.pipeNum = 6;
g_Transfering= FALSE;
bResult= DeviceIoControl(hDevice,IOCTL_EZUSB_BULK_READ,&bulkC6ntrol,
sizeof(BULK_TRANSFER_CONTROL),InBuffer,512,&nBytes,
NULL);
……
}
其餘部分的代碼不再贅述。

4 結語
    在結合實際應用的基礎上,筆者提出了在該數據採集系統中固件設計的方法以及固件程序的一些實現,同時也給出了應用程序中的部分代碼。


[admin via 研發互助社區 ] CY7C68013晶元的系統固件程序設計已經有3134次圍觀

http://cocdig.com/docs/show-post-44709.html