USB開發筆記


USB方向:

由於主機是唯一主控者,因此OUT是主機到設備,IN是設備到主機,FX2的術語采用這個約定

   

USB設備枚舉:

每個USB設備內部都有一個設備描述表,表中包含了設備全部要求和特性。USB設備插入主機后,主機會執行認證程序(設備枚舉)

① 使用預設地址0取得設備描述符

設定設備新地址

③ 使用新地址取得設備描述符

取得配置描述符

設定配置描述符

設備枚舉就是通過連接主機與設備之間的控制傳輸來辨識和配置新連接上的USB設備的過程。

成功后,Windows系統注冊表中就會發現相應的VID和PID

   

串行接口引擎SIE:

每個USB設備都有SIE

SIE的功能是對信息包PID進行譯碼,利用傳輸的CRC位進行錯誤檢測,並傳輸下載數據到USB設備

SIE從設備接收字節及控制信號,並為數據做格式化,通過D+和D-傳輸出去,另外還自動做"位填充"動作

FX2中的增強的SIE可完全獨立的完成設備枚舉工作,也可下載固件代碼到RAM、對CPU進行復位操作。

   

設備重枚舉:

EZ-USB系列新品有個非常重要的特性,就是以"軟"為主,包含了內部程序、數據RAM,可通過USB總線下載運行,賦予設備新的特性。

而正是由於采用"軟"方案,故同一個芯片可扮演多重特性:

首次插入USB時,自動進行設備枚舉,下載固件程序和USB設備描述表;

之后再次枚舉(重枚舉),根據第一次枚舉中下載的信息進行設備定義,在初次枚舉后立即進行,不做提示。

當然,也可以與一般的USB接口芯片一樣,從外界EEPROM中下載固件並自動運行。

   

USB連接框圖

   

為適應USB2.0的增強帶寬,FX2端點FIFO和從屬FIFO端點統一采取措施,省去內部傳輸所花費時間

FIFO可通過外部主控制器控制,用外部時鍾信號同步運行,或工作在異步方式。

FIFO也能夠由內部FX2時序生成器控制,即通用可編程接口(GPIF),GPIF的時鍾可以是內部時鍾,也可以是外部時鍾。

FX2芯片工作在3.3V電壓,可用USB的5V轉換

   

EX-USB FX2中的CPU有兩個職責:

1、負責USB2.0協議中"USB設備固件"中所定義的協議標准,這個已經被智能SIE簡化了

2、剩余的代碼空間可滿足CPU基本工作,並完成對設備的操作

CPU用來設置和控制數據收發器,但CPU一般不參與高帶寬傳輸,不在數據通道上參與高帶寬傳輸的是FIFO

為了使接口通用,引入了可編程時序生成器(GPIF),滿足FIFO與外部電路的接口。

   

無EEPROM或EEPROM無效:

這種最簡單的情況下,FX2枚舉為缺省USB設備(VID:0x04B4,PID:0x8613),根據ID號,操作系統確定哪一個驅動程序被裝載。

這種配置是最受制約的,這種配置下,利用Cypress軟件工具,僅僅能用於程序代碼的開發(需要編寫自動下載固件的驅動,或者每次上電手動下載固件),不適用於真正的基於FX2芯片設計的USB外圍設備產品發布。

   

"C0"EEPROM引導加載(僅加載ID碼)

初始枚舉時,如果檢測到EEPROM連接到I2C總線,且地址0的值為0xC0,則FX2將自動從EEPROM賦值VID、PID、DID替換缺省的ID(同時8個EEPROM字節還包含I2C總線頻率和斷開極性設置)。

接着進行重枚舉,加載新的ID對應的驅動程序。

如果只想改變I2C總線的速度(而不需要改變斷開極性),則改變控制寄存器相應位即可實現,EEPROM沒有也可以

   

"C2"EEPROM引導加載(加載固件至內部ROM)

上電時,FX2檢測到EEPROM連到I2C

————————————————————————————————————

開發套件安裝時采用默認路徑可以省卻不少麻煩,主要在於一些內置的路徑引用,如果自己改了路徑會出問題

   

自己定義的USB通信策略:

上位機程序用Labview開發。原因:含有豐富的測試測量控件,可以據此開發出功能強大的上位機顯示、處理程序

Labview通過CYUSB.dll庫調用底層的通用USB驅動cyusb.sys(均為官方提供)

手動下載slave.hex到CY7C68013A的RAM中,將其配置為從屬FIFO模式,供FPGA控制

FPGA用verilog開發USB主控模塊,與CY7C68013A接口

注:

不采用開機自動將固件程序下載至芯片RAM的方式

原因:需要結合CYPRESS開發包EZ-Loader Drivers以及HEX2C和Windows DDK生成所需要固件自動下載程序.sys文件(自己開發驅動,難度大)

PS:CyLoad文件夾下的驅動可以自動下載固件,應好好看一下

不采用EEPROM上電自動加載固件的方式

原因:自帶的24LC0B大小只有2K,裝不下hex文件

————————————————————————————————————

AN61345所附的slavefifo固件解析:

readme.txt翻譯(此readme有問題,與代碼頗有不符之處,可不看

This directory contains 8051 firmware for the Cypress Semiconductor EZ-USB FX2

chip.

此目錄包含Cypress半導體EZ-USB FX2芯片的8051固件

The purpose of this code is to demonstrate how to utilize EZUSB FX2 Slave Sync Mode

(in a back to back application - FX2 in SLAVE FIFO Sync).

本代碼的目的是演示如何使用EZ-USB FX2的從屬同步模式(在點對點(兩個FX2相連)應用中——FX2處於從屬FIFO同步模式)

The code is written in C and uses both the EZ-USB FX library and the FrameWorks.

此代碼用C語言編寫,使用了EZ-USB庫和框架

It configures FX2 as follows:

01). EP2 512 4x BULK OUT - 16-bit sync AUTO mode

02). EP6 512 4x BULK IN - 16-bit sync AUTO mode

它將FX2配置為如下模式:

EP2 4X512字節 批量輸出——16位同步自動模式

EP6 4X512字節 批量輸入——16位同步自動模式

.....from the slave (in this case is FX2 in Slave FIFO mode)

01). 512 byte buffer for EP2 OUT (master) -> EP6 IN data (slave)

02). 512 byte buffer for EP6 IN (master) -> EP2 OUT data (slave)

04). peripheral interface functions in 16-bit sync mode

從從屬端看(在這個例子中是運行於Slave FIFO模式的FX2)

(主控端)512字節緩沖區EP2 OUT——>EP6 IN 數據(從屬端)

(主控端)512字節緩沖區EP6 IN——>EP2 OUT 數據(從屬端)

外部接口功能處於16位同步模式

.....from "the user":

01). EP2 512 4x BULK OUT data is sent to EP6 512 4x BULK IN

02). EP6 512 4x BULK IN data is received from EP2 512 4x BULK OUT

從使用者角度

EP2數據發送到EP6

EP6數據從EP2處接受

NOTE: we'll initially test using 16-bit mode so the host application/driver doesn't need to pad odd data sizes, say 8191 bytes... etc.

注:我們最開始使用16位模式以便主機應用/驅動不需要填補零散的數據大小,比如8191字節……等等

The "slave_sync.hex" file loads into internal memory.

...issue "build -i" at the command prompt...

   

This example is for illustrative purpose(s) and unless you have an ext. slave that emulates the testing environment this example won't actually produce expected results when downloaded via Control Panel. The external slave in this case is EZUSB FX2 running in Slave FIFO mode

這個例子起演示作用,除非你有一個ext slave可以模仿測試環境,否則這個例子無法通過Control Panel下載得到正確的結果

external slave是指運行於Slave FIFO模式的EZUSB FX2

In this implementation the master to slave pin assignments are as follows:

在這個實現中,對slave的主控端的引腳配置如下:

slave(FX Slave FIFO SYNC mode) master(FX GPIF SYNC mode)

==================== =========================

SLRD <---- CTL0

SLWR <---- CTL1

SLOE <---- CTL2

FIFOADR0 <---- PA6

FIFOADR1 <---- PA7

FLAGA_PF ----> PA4

FLAGB_FF ----> RDY1

FLAGC_EF ----> RDY0

PA0 ----> INT0#

IFCLK <---> IFCLK

   

Control Panel 應用程序可能需要使用

The Control Panel Application may be used to drive this example as described in the tutorials.

___________________________________________________

FX2在復位后,IO引腳默認配置在"端口"模式,而不是Slave FIFO,

文檔解讀:

AN61345_Designing with EZ-USB FX2LP Slave FIFO Interface using FPGA

FX2LP-FPGA接口主要用於高速USB連接數據獲取、工業控制或監控以及圖像處理

FX2LP(以下簡稱FX2)運行在synchronous Slave-FIFO模式下,FPGA作為主控制器

這篇應用筆記提供了FX2的Slave-FIFO模式工作的例程固件,以及FPGA實現的VHDL和Verilog工程

FX2LP可以與FPGA以兩種模式接口,一個是GPIF,一個是Slave-FIFO

GPIF:FX2作為主控制器,並產生讀寫數據所需要的所有控制信號。GPIF模式一般用於外部系統無法作為主控制器的情況(例如向FPGA中下載目標代碼)。

這種情況下,大部分負載的接口實現工作由FX2的固件程序完成

Slave-FIFO:這種模式下,外部數據處理邏輯足以產生必要的讀寫控制信號

   

這篇應用筆記描述了16位同步Slave-FIFO的實現,包含了Verilog和VHDL語言的代碼

我們假定你已經熟悉了Slave FIFO接口(參考EZ-USB Technical Reference Manual.pdf),Verilog編程,以及FPGA綜合和實現工具

EZ-USB Technical Reference Manual.pdf中關於Slave FIFO

簡介:大部分設備都是簡單的使用EZ-USB作為USB和外在數據處理邏輯的通道(例如DSP,ASIC,FPGA,或硬盤上的IDE)

外部邏輯提供時序信號、握手信號(滿、空、可編程的層次),讀寫開關,輸出使能,等等

GPIF可以作為內部的主控制器(如果外部不能實現主控制的話,一般用於對外部邏輯進行操作(讀或寫),如下載目標代碼)

硬件:

下圖是FIFO的16位模式的原理說明,也可以配置為8位模式

下圖是與Slave FIFO相關的寄存器

部分寄存器詳細描述:

注意:官方給的Slave FIFO固件代碼只用了EP2,EP6

IFCONFIG:interface configuration(Ports, GPIF, Slave FIFOs)關於IFCLK時鍾、接口模式的設置

PINFLAGSAB:Slave FIFO FLAGA and FLAGB Pin Configuration

PINFLAGSCD:Slave FIFO FLAGC and FLAGD Pin Configuration FLAGA~D可通過4位編程代表不同的標志

例如:EP2EF,表示端點2 empty flag;EP4FF,表示端點4 full flag;EP8PF,表示端點8 Programmable Flag

PINFLAGSAB = 0x08;表示FLAGA是EP2EF,端點2空——官方固件代碼的注釋有誤

PINFLAGSCD = 0xE0;表示FLAGD是EP6FF,端點6滿——官方固件代碼的注釋有誤

OUT端點只有狀態空,表示OUT不空時,FPGA才可從OUT讀取數據

IN端點只有狀態滿,表示IN不滿時,FPGA才可向IN寫入數據

FIFORESET:Restore FIFOs to Default State,重置FIFO狀態,寫入0x80將對主機的所有傳輸不響應;繼續寫入0x82, 0x84, 0x86, 0x88繼續不響應,同時對2或4或6或8端點進行重置,寫入0x00恢復響應

——固件代碼此處可能有誤,寫入是0x02,0x04,0x06,0x08可能是錯的

FIFOPINPOLAR:Slave FIFO Interface Pins Polarity,管腳極性。默認是0x00,表示PKTEND、SLOE、SLRD、SLWR、EF、FF各信號均為低電平有效

EPxCFG:Endpoint 2, 4, 6 and 8 Configuration Registers

默認1 0 10 0 0 10,激活,輸出,批量,512字節(注:端點4和8只能設置為512字節),0,緩存類型(默認10是雙,00是四)

EP2CFG = 0xA0;表示激活,輸出,批量,512字節,4x緩存

EP6CFG = 0xE0;表示激活,輸入,批量,512字節,4x緩存

EPxFIFOCFG :Endpoint 2, 4, 6 and 8/Slave FIFO Configuration Registers

bit4-AUTOOUT,瞬間連接端點FIFO,只對輸出端點有效,默認0,設為1表示一旦buffer被USB數據填滿,buffer就自動和瞬間被提交到端點FIFO,而不經過CPU,端點FIFO標志和buffer計數立即表示FIFO的狀態改變

bit0-WORDWIDE,選擇PORTB/D引腳上的字節/字 FIFO,

EP2FIFOCFG = 0x11; //AUTOOUT=1, WORDWIDE=1,注意有些位對OUT端點無效

EP6FIFOCFG = 0x0D; // AUTOIN=1, ZEROLENIN=1, WORDWIDE=1,注意有些位對IN端點無效

關於WORDWIDE位的說明:

WORDWIDE=0,8位模式,FD[7:0]取代Port B

WORDWIDE=1,16位模式,FD[15:8]取代Port D,FD[7:0]取代Port B,復位默認值是16位

用FIFOADR[1:0]選通4個FIFO中的某一個與FD連接,如果都是8位模式,Port D才會被空出,若任意一個FIFO被設置為16位,Port D都會被占用

EPxAUTOINLENH:只用到低兩位

EPxAUTOINLENL:Endpoint 2, 4, 6, 8 AUTOIN Packet Length Low Registers(7:0)

表示smaller packets size,應該是只對IN端點有效,默認大小是10 0000 0000 即2^9=512Byte

EP6AUTOINLENH = 0x02;     // set core AUTO commit len = 512 bytes

SYNCDELAY;

EP6AUTOINLENL = 0x00;

SYNCDELAY;

EPxFIFOPFH:Endpoint Slave FIFO Programmable Level Flag High Registers當包達到此自定義大小時,PF發出警告,將滿或將空

EPxFIFOPFL

PORTACFG:控制Port A的復用功能

INPKTEND

   

關於寄存器的名稱

大部分寄存器都是用來處理端點(endpoint)的,命名規則為DDDnFFF

DDD是端點的方向,IN或OUT(相對於USB主機來說)

n是端點序號,其中ISO表示一類isochronous(等時的,同步的)端點

FFF表示功能:

CS是控制和狀態寄存器;

IRQ是中斷響應位

IE是中斷使能位

BC,BCL,BCH是字節計數寄存器。BC是單字節計數,BCH/BCL是16位計數器的高和低字節

DATA是single-register access to a FIFO

BUF是buffer的入口地址

USB表示全局(不只是端點)USB功能

ADDR表示地址

VAL表示有效

FRAME表示框架計數

PTR表示地址指針

   

15.15節

同步延時

在某種情況下,對寄存器的一些讀和寫操作必須被一些同步延時分開

以下情況必須加入同步延時:

0xE600-0xE6FF的任意寄存器的寫和表15-6寄存器的寫之間

表15-6寄存器的寫和0xE600-0xE6FF任意寄存器的讀之間

最小的延時長度是IFCLK和CLKOUT(CPU時鍾)頻率的函數,用下式計算

上式的單位是CPU指令周期

最典型的情況是下面的算式:

固件框架中包含了宏SYNCDELAY,實現了這個功能,此宏在fx2sdly.h文件中

注:這些延時周期不包含MOVX指令(取指令)所占用的兩個時鍾周期

—————————————————————————————————————————————————————

文檔解讀:

AN65209_Getting Started with FX2LP——重要

介紹EZ-USB FX2LP USB 2.0 設備控制器。

如果你是第一次看FX2LP,本文是一個最好的開始的地方。

在這篇應用筆記中,你會學到創建FX2LP工程、瀏覽不同的開發工具。

這篇筆記也提供了USB 2.0的背景知識,引導你去看適當的文檔,以便深入的學習FX2LP

   

簡介

EZ-USB FX2LP(以下簡稱FX2)是可編程的、低功耗 USB 2.0 外置控制器。

本文簡單的介紹了FX2,強調了它的基本特性。

參考數據手冊,應用筆記,視頻和其他技術參考材料是對於擴展你的FX2適應性和功能的知識。

講述了創建一個例程,並下載固件鏡像(.hex)到FX2的RAM中的步驟。

   

什么是FX2LP

FX2系列集成了USB 2.0收發器、串行接口引擎SIE,增強型8051微控制器,可編程外圍接口。

FX2的主要功能是在USB主機和外圍設備之間傳輸數據。並行(GPIF,從屬FIFO)和串行接口(I2C,UART)提供了與系統中其他設備的額外連接。

在FX2不需要處理數據的系統中,僅僅需要固件對接口間的數據傳輸初始化即可

FX2可枚舉為標准USB類型設備或廠商自定義設備。

   

FX2特性

USB接口:

集成的USB2.0 收發器和智能SIE

7個物理端點(包含控制端點)

4KB端點存儲

端點類型(批量、中斷和同步)和端點緩沖(雙、三和四)都是可編程的

   

串行接口:

集成的I2C主控制器,100~400KHz運行

兩個標准8051 USART,其引腳是獨立的,不與GPIO復用

多達40個GPIO,低速串行接口可以用這些通用IO實現

   

並行接口:

FX2有通用可編程接口GPIF,帶有8-16位外部數據接口

使用GPIF,FX2可以直接與大多數通用接口連接。

GPIF有9位地址線,6位控制線,和6個准備信號,典型應用於FX2作為主控端(例如用FX2下載程序到FPGA中)

從屬FIFO接口典型應用於FX2在接口上作為從屬設備的時候。

   

CPU和存儲

8051有2個USART,3個計數器/定時器,一個增強中斷系統

可用48MHz,24MHz,12MHz時鍾

16KB片上代碼/數據 RAM

   

啟動選項:

FX2沒有內置的Flash存儲,所以固件必須存儲於外部非易失性存儲器,或從USB主機下載

與其他Cypress EZ-USB系列相似,FX2使用RAM作為程序存儲,這個特性,加上Cypress的重枚舉特性,允許FX2的固件在上電時由主機下載。

當FX2上電時,內置的USB loader被激活,加載了固件后,FX2斷開並以固件所定義的設備重連USB。

這使得升級像web下載一樣簡單

   

56-pin封裝的FX2特性

3個8位IO口,port A,B,D

I2C可用

UART不可用

GPIF主控:8或16位GPIF與Port B和D復用,5個非復用的控制信號

從屬FIFO:8或16位從屬FIFO接口與Port B和D復用,5個非復用控制信號和4或5個與Port A復用的控制信號

   

FX2應用開發:

FPGA與FX2的接口

采用並行Slave FIFO接口

此時FX2作為與主機間的快速數據通道

廣泛使用的FPGA接口是同步FIFO

FX2提供了這種接口,如下圖(其中Data Source/Sink可以是FPGA本身):

   

開發FX2上位機應用程序:

上位機應用使用Visual C#或C++工具開發。

為了幫助用戶開發上位機應用,Cypress提供了C#(CyUSB.dll,Labview也可以調用)和C++(CyAPI.lib)的應用程序接口API。

可以參考AN70983

SuiteUSB 安裝中還包含了steamer 應用的C#和C++的源代碼

   

開發資源:

固件:Keil免費版(目標代碼最大4KB);固件例程;同步從屬FIFO固件例程,與FPGA接口(AN61345)

   

用一個Bulkloop(批量回環)工程作為例子說明如何創建和運行FX2固件。

Bulkloop的源碼從Firmware/Bulkloop目錄下找

Bulkloop程序使用OUT和IN端點:從PC端接收OUT數據,再將相同的數據從IN收發器傳給PC端。

Bulkloop使用了4個端點:EP2和EP4配置為OUT端點,EP6和EP8配置為IN端點;EP2OUT到EP6IN以及EP4OUT到EP8IN回環
原理圖如下:

————————————————————————————————————————————————

固件例程文件夾下的Readme.txt(從這里可以看出,安裝到默認路徑會省很多功夫

Please check all the below options for firmware examples to work:

檢查以下選項

1.setenv.bat: under bin folder is modified to

setenv.bat:在bin文件夾下,如果沒有用默認路徑安裝,需要相應的改變該文件的內容

@echo off

   

REM to create a shortcut to this environment use the command line:

REM COMMAND.COM /e:4096 /k C:\cypress\usb\CY3684_EZ-USB_FX2LP_DVK\1.0\bin\setenv.bat

REM

REM If you install the Keil or Cypress tools in a non-default location

REM you must update this file

   

path=c:\cypress\usb\CY3684_EZ-USB_FX2LP_DVK\1.0\bin;c:\keil\c51\bin;%path%

set CYUSB=c:\cypress\usb\CY3684_EZ-USB_FX2LP_DVK\1.0

set C51INC=%CYUSB%\Target\inc;C:\keil\c51\inc

   

@echo on

   

   

Open each firmware example using Keil uvision2 or higher

使用Keil2打開固件源碼

2.Under IDE keil-->Project-->"File Extensions,Books and Environment" the paths is changed to

..\..\Target\Inc\;C:\Keil\C51\INC\

這里寫錯了,應該是"Componets, Environment and Books"選項下的"Folders/Extensions"選項卡,INC里應填的內容

   

3.In the Project "Options for Target Target1" -->Output Tab--> Check if "Run User program1" option is checked. with the path

..\..\Bin\hex2bix -i -f 0xC2 -o xxx.iic xxx.hex

This option allows to generate EEPROM image in .IIC format.

這個選項用來產生IIC文件

All these changes are under the assumption that CY3684 DVK Installer.exe default installation directory is

c:\cypress\usb\CY3684_EZ-USB_FX2LP_DVK\1.0

以上所有這些都是在假設DVK安裝在默認路徑下

During Installation if the install directory is changed by the end user then steps 1 are to be repeated with modified path

   

4.During compilation of firmware examples if EZUSB.Lib and USBJmptbl.obj are not added and results in error during project build.

Select "Source Group1" folder in the Project Window Right click in project window and select "Add files to Group 'Source Group1' and browse to following folder for respctive kits

FX1:C:\Cypress\USB\CY3674_EZ-USB_FX1_DVK\<ver>\Target\Lib\LP

FX2LP:C:\Cypress\USB\CY3684_EZ-USB_FX2LP_DVK\<ver>\Target\Lib\LP

如果缺少這兩個文件(EZUSB.Lib和USBJmptbl.obj)會導致編譯失敗,

Note: if the path of installation directory is changed then relevant path must be chosen

    FX1:<Installed_directory>\CY3674_EZ-USB_FX1_DVK\<ver>\Target\Lib\LP

    FX2LP:<Installed_directory>\CY3684_EZ-USB_FX2LP_DVK\<ver>\Target\Lib\LP

   

In the browse window select Files to All types .

Then only EZUSB.Lib and USBJmptbl.obj files are visible

Press Ctrl key on your keyboard and select both these files at the same instant.多選

Observe files getting added to project window.

Build the project again and observe the build errors no longer exist.重新編譯,不再出錯

--------------------------------

固件例程

Target\Fw\LP目錄下提供了"固件框架"

這個框架簡化和加速了自定義固件開發的過程,通過使用Cypress代碼,用於一般的操作,例如初始化、USB標准設備請求處理、USB暫停-恢復電源管理。

這個框架還提供了函數hooks和固件例程,擦除固件開發進程

你可以寫下USB描述符表盒代碼實現想要的功能,而無需擔心底層USB細節

FX2固件框架使用Keil 2 IDE編寫。

自帶的Keil限制代碼在4KB,如果想要更大的目標代碼,需要自己從Keil購買許可

框架使用EZ-USB庫(EZUSB.LIB),此庫是一個8051 LIB文件,實現了對許多固件工程通用的函數(I2C讀寫路徑庫)。

這些函數不需要修改,因此以lib的形式提供

然而,套件中也提供了此庫的源代碼,Target\Lib\LP下

   

軟件工具:

為了有助於開發固件,實現與主機有效的通訊,Cypress提供了軟件工具,驅動和API庫。

這些組成了Cypress USB Control Center,GPIF Desinger,Cypress generic USB driver,以及Cypress USB class Library API

注:這些軟件都在持續的升級中,Cypress建議去官網下載最新版本

   

Cypress USB Control Center是主機應用程序,可以使用通用驅動(CyUSB.sys)與設備通訊。

SuiteUSB提供了對於Windows.NET語言(例如C#和Visual Basic.NET)的通用庫

   

Cypress generic USB driver是一個穩定的高性能Windows驅動,用於主機和USB目標設備通訊的

此驅動以二進制文件形式提供(沒有源碼),可以分配給基於FX2LP的設備

Cypress建議分配之前,先進行認證

   

Generic USB driver on Windows platform:(如果要自己開發可以自動下載固件的驅動,看)

Windows平台的通用USB驅動

WinUSB是USB設備的通用驅動,與Windows Driver Framework(WDF)一起為Windows XP開發的。

WinUSB構架用內核模式驅動(Winusb.sys)和用戶模式動態鏈接庫(Winusb.dll,引出WinUSB的函數)所組成。

通過使用這些高級的函數,你可以用用戶模式的軟件來操作USB設備。

Winusb.sys被Win XP/7/8系統所支持,更多關於WinUSB驅動可以從msdn網站得到。

   

Linux/Mac OS的通用驅動

   

Cypress USB Class Library API(開發上位機程序,調用底層的Cypress驅動)

CyAPI.lib是C++庫,簡化開發過程。

關於API如何使用,在C:\Cypress\Cypress Suite USB 3.4.7\ CyAPI\examples下有例程

API的文檔CyApi.pdf也在這個目錄下

-------------------------------------

CyUsb.dll(Labview可用)是Windows.NET庫,可用於所有的Cypress USB 2.0芯片系列

具體在C:\Cypress\Cypress Suite USB 3.4.7\CyUSB.NET目錄下

   

———————————————————————————————————————————————————————

文檔解讀CY3684 DVK Kit_Guide.pdf

第4章,關於開發套件的目錄

4.3節,驅動部分,看CyLoad目錄

   

5. EZ-USB Firmware Frameworks固件框架

框架已經實現了EZ-USB芯片初始化、USB標准設備響應握手、和USB掛起-恢復電源管理服務的8051代碼

用戶提供USB描述符表實現額外功能的代碼來實現一個完整的兼容USB設備

5.1框架概述

啟動時,框架初始化所有的內部狀態變量,然后調用用戶初始化函數TD_Init()

返回后,框架初始化USB接口到未配置的狀態並使能中斷,然后固件重枚舉,並開啟協同的任務分配器

任務分配器重復如下任務:

1、調用用戶函數TD_Poll()——此部分函數由用戶填寫,是實現自定義功能的主要代碼(Slave FIFO運行於自動模式,應該不需要)

2、判斷是否有標准設備請求等待處理,如果有,則分析請求並響應。框架會自動處理標准USB設備請求,但允許用戶覆寫默認的行為。

3、判斷USB內核是否收到USB掛起信號(USB Bus Idle flag is set),如果有,調用用戶程序TD_Suspend();

USB中斷由框架處理,它提供了USB事件的用戶代碼通知函數。

用戶定義的函數就是下面這些

void TD_Init(void);用戶定義的初始化

void TD_Poll(void);用戶定義的主循環

BOOL TD_Suspend(void);用戶定義的掛起前操作,此函數返回TRUE才真正的執行掛起

BOOL TD_Resume(void);用戶定義的恢復前操作

   

5.2框架編譯

此框架是用Keil uVision2寫的。只在這些工具上測試過。代碼用到了幾個Keil的C擴展,所以其他編譯器的適用性不能保證

如果要自定義設備框架,既可以從固件例程開始,也可以從"空"的框架代碼開始

運行Bin文件夾下的setenv.bat設置編譯環境(此批處理文件是基於假定你安裝DVK和Keil在默認目錄下的)

FW.C:main()——task dispatcher,setup command handler等,對於大部分固件 工程來說,沒必要修改這個文件

PERIPH.C:這是自定義的地方,還包含了所有的USB和GPIF中斷服務函數的框架

DSCR.A51:包含設備自定義描述符的編譯文件——此處可以自定義VID和PID

FX2.H/LP.H:包含通用EZ-USB常數、宏、數據類型和庫函數原型的頭文件

FX2REGS.H/LPREGS.H:寄存器聲明和位屏蔽常數

SYNCDLY.H/FX2SDLY.H:包含synchronization delay宏(兩個文件內容一致)

EZUSB.LIB:庫目標代碼

USBJMPTB.OBJ:包含USB和GPIF中斷的ISR(中斷服務路徑)跳轉表

BUILD.BAT:使用Keil命令行工具編譯/鏈接固件的批處理文件

FW.UV2:Keil 2工程文件,用於編譯/鏈接固件

   

函數被分為三類:任務分配類(以TD為名),標准設備請求類(以DR為名)和USB總線中斷處理(以ISR為名)

任務調度器:

TD_Init(),在框架初始化器件調用一次,在重枚舉和任務調度開始前調用,用於全局狀態變量和設備初始化

TD_Poll(),在設備運行期間循環調用,應包含實現用戶額外功能的狀態機,高優先級的功能可以在從該函數返回前完成。然而,返回失敗會造成框架無法響應設備請求和USB掛起事件。如果需要大量的處理時間,必須在多個TD_Poll()調用中分開執行。

采用SLAVE FIFO的芯片工作在自動模式,所需傳輸的數據均由芯片自動完成無需特別編寫代碼,因而TD_Poll應為空。

TD_Suspend():在框架進入掛起模式之前執行。該函數包含了將設備運行於低功耗狀態的代碼,然后返回TRUE。然而,返回FLASE可以阻止框架進入掛起模式。

TD_Resume():此功能在框架響應外部恢復事件恢復處理器之后被調用,,如外界產生wakeup中斷或發生USB總線傳輸活動,設備就會調用此函數來重啟處理器。此過程可看作是TD_Suspend()函數的逆操作。

設備請求函數

這些是SetupCommand調用的輔助函數

DR_GetDescriptor()

在框架解碼和實現GetDescriptor設備請求之前被調用

   

6. Cypress USB Drivers for EZ-USB Kits驅動程序

SuiteUSB提供了一系列C++和C#開發的主機應用程序,用於與任何cypress USB 2.0設備通訊

Cyxxx.cat - These are Windows Catalog files which contain Digital Signature. This file indicates that this driver-cyusb.sys passed Microsoft driver Certification process (WHQL) process.

Windows目錄文件,包含了數字簽名。表示cyusb.sys通過了微軟驅動證書過程

Cyusb.sys - This is the cypress provided generic USB driver for all USB 2.0 products.

USB2.0產品的通用驅動

Cyxx.INF - The file contains information about the .cat file and .sys file entries.

定義了驅動和腳本的目標目錄,拷貝到系統目錄,自動加載和注冊設備的入口

此包里提供的INF文件不要修改,這些是用於提供給中斷用戶測試EZ-USB的不同特性的

如果inf文件修改了,數字簽名就失效了,用的是和會有警告提示(其實警告無非就是自己定義的驅動沒有通過微軟認證,用起來應該是沒問題的)

推薦實驗室中自己定義時,VID采用原來的,PID自己稍改一下

默認的VID/PID也不應該用於任何其他的目的,除了用於測試基本功能

這些inf文件有兩類:

固件例程所使用的和默認EZ-USB配置的驅動

使用腳本將固件和Keil監控自動下載的驅動

   

6.3 用腳本自動下載固件和Keil Monitor的驅動

如果用戶想將固件下載的過程自動化,就應該使用腳本:任何時候,與腳本相對應的響應VID/PID的設備被檢測到,Windows系統就自動下載腳本中的固件。

CyLoad文件夾下包含CyLoad.spt,Cyload.cat,CyLoad.inf和cyusb.sys

6.3.1 如何生成腳本文件

腳本文件是與特定的固件相對應的。

CyScript.exe,打開相應的hex文件,設置好腳本文件的生成路徑和文件名,然后點創建按鈕

CyConsole錄制腳本,具體見文檔原文

CyControlCenter也可以生成腳本和錄制腳本

6.3.2 使用Cyload驅動包自動下載固件

Play腳本的過程(自動下載固件)可以用inf文件自動化,生成可自動下載固件的驅動包過程如下(自己總結的):

首先要有相應的固件hex(如slavefifo,自己開發),固件中包含自己定義的VID/PID,用上面的工具生成腳本spt文件

然后拷貝CyLoad.inf到一起,修改拷貝過來的inf文件中的VID/PID為默認的VID/PID(也就是默認的04B4,8613)

再拷貝cyusb.sys到一起,就組一個完整的沒有認證的驅動

CyLoad.inf文件:包含了CyLoad.spt和CyLoad.cat和cyusb.sys文件的細節和入口。驅動文件和腳本文件的相應的目標目錄也被提到。inf文件會使用這些自動固件加載過程

其重要參數有:

[SourceDisksFiles]包含了下載固件必要的文件——sys和spt文件

[DestinationDirs]指定了拷貝CYUSB.sys和CyLoad.spt的系統文件夾,system32\Drivers和system32\CyLoad

[CyLoadFW.Files]固件文件,實際是CyLoad.spt

[CYUSB.Files.Ext]外部文件,實際是CYUSB.sys

對於官方提供的演示腳本,其VID/PID=0x04B4/0x0084,與那個iic文件對應,windows觸發腳本執行的語句是

HKR, DriverEXECSCRIPT,,%CyLoad.EXECSCRIPT

   

   

刪除USB驅動的方法:

(a)打開Regedit, 找到 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Enum/USB 文件夾,刪除所有VID、PID相符的項(如"Vid_04b4&Pid_8613")——貌似刪不了

(b)在windows/inf 文件下,找到oemxx.inf 文件 (xx 是兩位數字),該文件包含相同的pid、vid。可以使用UltraEdit 進行全文搜索關鍵字來定位具體的文件,找到后在文件名后面加.bak。

———————————————————————————————————————————————————————

NI-VISA入門文檔:NI-Tutorial-4478-en.pdf(可參照NI-Tutorial-4478-zhs.pdf作為翻譯對比,但英文的較新)

是否應該使用NI-VISA作為USB的驅動(供Labview調用)

優缺點分析:

NI-VISA:使用簡單,通用性較好,某些設備專屬的功能可能無法實現

調用DLL(API)編程:編程麻煩,每個設備API不同,可實現設備專屬功能

NI-VISA生成的inf文件:

INF文件的安裝對 於每個版本的 Windows而言 都是不同的。

使用NI-VISA與您的USB設備進行通信:

USB INSTR類別(USBTMC)符合USB測試和測量類別(USBTMC)的設備使用NI-VISA USB INSTR類別。這些設備使用488.2格式通信。

對於這些設備而言,您簡單地使用VISA打開、VISA關閉、VISA讀取和VISA寫函數,與使用GPIB儀器通信相似的方式進行。

對於USB RAW設備,控制起來相對復雜些:

NI-VISA supports three types of USB pipes: control控制, bulk批量, and interrupt中斷.

When NI-VISA detects your USB instrument, it automatically scans your instrument for the lowest available最低可能的 endpoint端點 for each type.

When VISA detects the lowest available endpoint, it assigns that value to the appropriate VISA attribute對應的VISA屬性.

The bulk in endpoint and bulk out endpoint are stored in the VI_ATTR_USB_BULK_IN_PIPE attribute and the VI_ATTR_USB_BULK_OUT_PIPE attribute, respectively.

A value of -1 indicates that a USB device does not support that type of pipe.

If you are using the C API, use the viSetAttribute function to change endpoints. In LabVIEW, use a Write VISA Property node.

上面這句話是說,用C語言開發的程序也可以調用VISA驅動,此處說明了C語言開發的與LabVIEW開發的程序的區別

NI-VISA includes four functions to transfer data through USB pipes.

Before you can communicate with your device using these functions, you need to set up the communication protocol using the VISA USB attributes.

The following list describes the available functions:

Use VISA USB Control In and VISA USB Control Out to transfer data using the control pipe.

To transfer data using a bulk pipe, use VISA Read and VISA Write.

If you are using LabVIEW, VISA includes an additional function to use the interrupt pipe: VISA Get USB Interrupt Data.

In the C API, you can do this by accessing the VI_ATTR_USB_RECV_INTR_SIZE and VI_ATTR_USB_RECV_INTR_DATA attributes of the VI_EVENT_USB_INTR event object.

See the for more information about VISA Events. NI-VISA Help

重要例程:

USB RAW Bulk Communication with LabVIEW


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM