www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 消費電子 > 消費電子
[導讀]  1.前言  隨著信息技術(shù)的飛速發(fā)展,各種數(shù)據(jù)的實時采集和處理在現(xiàn)代工業(yè)控制和科學研究中已成為必不可少的部分,尤其在信號測量、圖像處理、音頻信號處理等一些高速、

  1.前言

  隨著信息技術(shù)的飛速發(fā)展,各種數(shù)據(jù)的實時采集和處理在現(xiàn)代工業(yè)控制和科學研究中已成為必不可少的部分,尤其在信號測量、圖像處理、音頻信號處理等一些高速、高精度的測量中需要對高性能的數(shù)據(jù)采集技術(shù)。這就為數(shù)據(jù)采集設(shè)備的設(shè)計提出了兩個的要求:1)要求接口簡單靈活且有較高的數(shù)據(jù)傳輸率; 2)由于數(shù)據(jù)量通常都較大,要求主機能夠?qū)?shù)據(jù)做出快速響應(yīng),并進行實時分析、處理。

  在基于軟件無線電的接收機架構(gòu)中,數(shù)字下變頻(DDC)技術(shù)起著非常重要的作用,也是軟件無線電的核心技術(shù)之一。數(shù)字下變頻位于模數(shù)轉(zhuǎn)換(ADC)之后,需要處理高速高容量的數(shù)據(jù),因此難度較大,不容易實現(xiàn)。針對數(shù)字下變頻中的這一實際問題以及數(shù)據(jù)采集設(shè)備的兩個要求,本報告采用了一種基于FPGA與USB 2.0的數(shù)據(jù)采集與實時傳輸方案。

  本文所研究的基于Spartan-6的高速數(shù)據(jù)采集、處理和實時傳輸系統(tǒng),就是實現(xiàn)將寬帶中頻數(shù)字接收機輸出的高速正交IQ數(shù)據(jù)傳輸給FPGA去實現(xiàn)軟件無線電的后續(xù)信號處理算法。利用Cypress的EZ-USB FX2高速數(shù)據(jù)傳輸方案實現(xiàn)將基帶數(shù)據(jù)或者經(jīng)FPGA處理后輸出的數(shù)據(jù)進行傳輸,并利用上位機軟件進行上位機存儲和顯示。本文主要從系統(tǒng)的硬件設(shè)計和軟件設(shè)計兩個方面分別對高速數(shù)據(jù)采集模塊(寬帶中頻數(shù)字下變頻模塊)、高速數(shù)據(jù)傳輸模塊以及上位機軟件三個方面進行詳細介紹。

  2.系統(tǒng)總體方案設(shè)計

  整個系統(tǒng)分成3個子模塊,分別是:(1)高速數(shù)據(jù)采集模塊(寬帶中頻數(shù)字下變頻模塊);(2)高速數(shù)據(jù)實時處理和傳輸模塊;(3)上位機軟件模塊。整個系統(tǒng)框圖如圖1所示:

  其中高速數(shù)據(jù)采集模塊與EZ-USB高速數(shù)據(jù)處理和傳輸模塊分別由對應(yīng)的硬件電路和軟件組成。上位機軟件模塊主要是利用Microsoft Visual2008軟件利用MFC進行開發(fā)。系統(tǒng)整體硬件框圖如圖2所示:

  系統(tǒng)整體工作原理:首先高速數(shù)據(jù)采集模塊對70MHz中頻模擬信號進行模數(shù)轉(zhuǎn)換,采樣速率為60MHz(基于帶通采樣定理),然后利用Atmel公司的高性能微控制器Atmega16A作為控制單元以異步控制方式對專用數(shù)字下變頻進行設(shè)置和編程,實現(xiàn)將中心為70MHz的數(shù)字中頻信號搬移到數(shù)字基帶,基帶數(shù)據(jù)速率仍然為60MHz,因此需要對高速的數(shù)字基帶信號進行抽取和濾波得到低速的數(shù)字基帶信號,抽取倍數(shù)可通過編程設(shè)置,抽取倍數(shù)越大得到的數(shù)字基帶信號速率就越小,低速的數(shù)據(jù)基帶信號再傳輸給FPGA實現(xiàn)基帶數(shù)據(jù)的碼元恢復,得到原始信息。EZ-USB既可以對數(shù)字基帶信號數(shù)據(jù)進行實時數(shù)據(jù)采集和傳輸也可以對FPGA輸出的原始碼元信息進行傳輸,最后通過USB2.0接口將這些數(shù)據(jù)傳輸?shù)缴衔粰C進行數(shù)據(jù)實時存儲和顯示。

  3.高速數(shù)據(jù)采集模塊(寬帶中頻數(shù)字下變頻模塊)

  傳統(tǒng)的數(shù)據(jù)采集系統(tǒng)往往采用單片機或數(shù)字信號處理器(DSP)作為控制器,控制模/數(shù)轉(zhuǎn)換器(ADC)、存儲器和其他外圍電路的工作。但由于單片機本身的指令周期以及處理速度的影響,其時鐘頻率較低,各種功能都要靠軟件的運行來實現(xiàn),軟件運行時間在整個采樣時間中占有很大的比例,效率較低,很難滿足系統(tǒng)對數(shù)據(jù)采集系統(tǒng)實時性和同步性的要求。基于DSP的數(shù)據(jù)采集系統(tǒng),雖然處理速度快,但成本較高,過于頻繁的中斷會使CPU的效率降低,響應(yīng)速度變差。近年來,基于FPGA的數(shù)據(jù)采集方案逐漸成為一種具有特殊優(yōu)勢的一種方案,其中最主要的一個優(yōu)點就是可以實現(xiàn)對數(shù)據(jù)的并行處理。另外還具有開發(fā)周期短,集成度高,功耗低,工作頻率高,設(shè)計費用低,編程配置靈活等一系列優(yōu)點。

  本報告中采用的高速數(shù)據(jù)采集與實時傳輸方案,主要包括以下幾個部分:1)高速數(shù)據(jù)采集以及數(shù)字下變頻處理部分;(2).高速數(shù)據(jù)傳輸部分;(3).上位機數(shù)據(jù)采集控制部分。系統(tǒng)首先將外部真實世界的模擬信號進行數(shù)字化,然后將模數(shù)轉(zhuǎn)換器的高速數(shù)字信號進行數(shù)據(jù)緩沖,然后將緩沖數(shù)據(jù)經(jīng)過數(shù)字下變頻處理后傳輸給FPGA,采用FPGA控制CY7C68013A實現(xiàn)高速數(shù)據(jù)實時傳輸與存儲,并進行顯示。

  3.1 高速數(shù)據(jù)采集及數(shù)字下變頻處理部分硬件設(shè)計

  高速數(shù)據(jù)采集及數(shù)字下變頻模塊是利用ADI的高速模數(shù)轉(zhuǎn)換器AD6640按照奈奎斯特帶通采用定理進行數(shù)據(jù)采集(本報告中選擇的采樣速率為60MHz),然后將60MHz的數(shù)字中頻信號傳輸給專用數(shù)字下變頻器件AD6620(也可以利用FPGA實現(xiàn)數(shù)字下變頻以及信號抽取濾波等)進行數(shù)字下變頻和抽取濾波等處理。

  高速數(shù)據(jù)采集(主要是采集70MHz的中頻模擬信號)及數(shù)字下變頻(將70MHz中頻搬移到數(shù)字基帶)處理部分的硬件設(shè)計方案如下圖1所示:

  在該部分的硬件設(shè)計中:1)ADC采用的是ADI公司的高性能AD6640來實現(xiàn)對數(shù)據(jù)的高速采集。AD6640具有如下優(yōu)點:12位的采樣精度,具有65MSPS最小采樣率,在25MHz帶寬上具有高達80

的無雜散動態(tài)范圍(SFDR),中頻采樣率可達70MSPS, 功率消耗大約710mW,采用采用5V單電源供電,片上自帶T/R和參考電壓,數(shù)據(jù)以二進制補碼形式輸出,CMOS輸出電平兼容3.3V和5V。2)下變頻部分,采用的是美國ADI公司的中頻數(shù)字接收機專用數(shù)字信號處理器AD6620。它的內(nèi)部集成了NCO(數(shù)控晶體振蕩器)、數(shù)字混頻器、二階級聯(lián)積分梳妝濾波器(CIC2)、五階級聯(lián)積分梳妝濾波器(CIC5)、系數(shù)可編程的抽取濾波器(RCF)等。3)控制部分,選用了Xilinx公司的Spartan 6芯片來進行采集控制、數(shù)據(jù)緩沖、數(shù)據(jù)處理、數(shù)據(jù)傳輸控制及通信等。

 

  3.2 高速數(shù)據(jù)采集及下變頻處理部分軟件設(shè)計

  寬帶中頻數(shù)字下變頻器件AD6620內(nèi)部主要由以下單元組成:頻率變換單元、二階固定系數(shù)級聯(lián)積分梳狀濾波器(CIC2)單元、五階固定系數(shù)級聯(lián)積分梳狀濾波器(CIC5)單元以及一個可變系數(shù)的RAM系數(shù)抽取濾波器(RCF)單元。其中頻率變換模塊實現(xiàn)中頻到數(shù)字基帶的下變頻,CIC2單元和CIC5單元是完成采樣速率的抽取功能,通過設(shè)置不同的抽取倍數(shù)可得到不同速率的基帶信號,而可變系數(shù)的 RCF單元則是將抽取后的信號進行整形濾波處理,使得濾波器的通帶紋波、過渡帶帶寬以及阻帶衰減等設(shè)計參數(shù)設(shè)計的更優(yōu)化。

  下面分別對頻率轉(zhuǎn)換單元、CIC2和CIC5濾波器單元以及可變系數(shù)RCF濾波器單元分別進行編程介紹。

  3.2.1頻率變換單元編程設(shè)置

  頻率變換單元主要是利用片內(nèi)集成的數(shù)控晶體振蕩器(NCO)來產(chǎn)生一組正交的數(shù)字本振信號。NCO模塊的目標就是產(chǎn)生理想的正弦波和余弦波,以便與高速模數(shù)轉(zhuǎn)換器件AD6640傳輸?shù)闹蓄l實信號進行頻率轉(zhuǎn)換,把中頻信號的頻譜搬移到數(shù)字基帶。NCO模塊產(chǎn)生的正交數(shù)字本振信號頻率是通過式來計算:

   (式 1)

 

  其中, 為NCO模塊的本振頻率, 為相應(yīng)通道IF信號輸入的頻率,在本文中為70Mhz, 為采樣頻率,本文中應(yīng)為56MHz,實際為60MHz,

根據(jù)式可計算得到 的值為:0010 1010 1010 1010 1010 1010 1010 1010共32位二進制數(shù),那么通過FPGA向地址為0x303的地址寫入上述32bit的二進制數(shù)。

 

  3.2.2 固定系數(shù)CIC濾波器設(shè)計及其編程

  二階和五階級聯(lián)積分梳狀濾波器都是固定系數(shù)的抽取濾波器。CIC2處理的信號時頻率變換后輸出的I、Q兩路數(shù)字基帶信號,

均為60MHz,為了減輕后續(xù)處理器的處理難度,需要利用CIC2和CIC5抽取濾波器進行合理抽取濾波,經(jīng)CIC2抽取濾波后的信號頻率為式所示:

 

  

(式 1)

 

  其中, 為經(jīng)過抽取系數(shù) 抽取濾波降速后的信號頻率。可通過微控制器對CIC2濾波器抽取系數(shù) 進行編程,取值范圍為2~6中得某一個整數(shù)值。第一級的抽取系數(shù)取值越大相應(yīng)的整個芯片功耗就越低。CIC2濾波器的增益和通帶衰減計算公式如式2和式3所示:

 

  

(式 2)

 

  

(式 3)

 

  其中, 為CIC2濾波器增益衰減因子,取值范圍為0~6之間的整數(shù)值。為了獲得最優(yōu)的動態(tài)范圍需要將 設(shè)置為最小值,但是要注意防止出現(xiàn)溢出。

為輸入信號的電平。

 

  CIC2濾波器的離散和連續(xù)頻率響應(yīng)公式分別如式4和5所示:

  

(式 4)
(式 5)

 

  相應(yīng)的CIC5濾波器和CIC2濾波器的功能是一致的,也是實現(xiàn)抽取和濾波,CIC5濾波器是對CIC2這一級處理后的信號再一次抽取。下面利用ADI公司的SoftCell濾波器設(shè)計軟件,設(shè)計CIC2、CIC5、RCF濾波器,以便獲得相應(yīng)濾波器參數(shù),進行因為對于70MHz中頻信號而言,依據(jù)射頻帶通采樣定理,可以確定帶通采樣率為56MSPS就可以滿足要求,但是為了增大信噪比的性能可將降采樣率設(shè)成60MHz,輸出頻率為0.4MSPS,那么抽取倍數(shù)為140。打開濾波器設(shè)計軟件后的界面如圖3所示:

  在軟件的PortSelect菜單中選擇AD6620作為設(shè)計的對象,然后在面板的左中間位置輸入信號頻率60MHz,以及抽取濾波后的輸出頻率0.4MHz,在Passband這個地方輸入通帶帶寬4MHz,通帶紋波設(shè)置為0.18,另外在Stopband這個地方設(shè)置阻帶頻率為4.5MHz,衰減為60dB,在5MHz這個頻率點,設(shè)置衰減為80dB。然后點擊compute按鈕后就可以計算得到設(shè)計好的濾波器頻率相應(yīng)以及相應(yīng)的各級濾波器系數(shù)和RCF濾波器的抽頭數(shù)。設(shè)計完成后CIC2以及CIC5以及RCF濾波器系數(shù)可能有多種組合,這種情況下可以對比分析濾波器的響應(yīng),選擇一種最佳的設(shè)計方案。表 1為不同抽取倍數(shù)下的帶寬和混疊衰減規(guī)格: 

  最后確定選擇CIC2濾波器抽取倍數(shù)為15,CIC5抽取倍數(shù)為2,RCF抽取倍數(shù)為2就可以滿足系統(tǒng)設(shè)計的要求。

  3.2.3 可變系數(shù)RCF濾波器參數(shù)設(shè)置

  根據(jù)2.2.1節(jié)設(shè)計得到的RCF抽取倍數(shù)為30,可以根據(jù)式來計算得到抽取濾波器的抽頭數(shù)為150。

  

 

  其中, 為60MHz, 為15, 為CIC5濾波器抽取降速后的頻率也即2MHz,當輸入通道模式時單通道實模式時為1。對可變系數(shù)的RCF濾波器進行編程設(shè)置時需要先向地址0x30C寫入整數(shù) 149( =59)。然后濾波器的響應(yīng) 逐一寫入到地址0x000~0xFF中。這樣就完成了RCF寄存器的編程設(shè)置。

 

  3.2.4 AD6620工作模式寄存器編程

  對頻率變換單元、固定系數(shù)的CIC2和CIC5以及RCF濾波器變化進行編程設(shè)置后,要使AD6620正常工作還需要對其工作方式和相關(guān)寄存器進行配置。AD6620的工作方式主要由地址0x300H的寄存器中低四位決定,其中,bit0=1時系統(tǒng)處于軟復位狀態(tài),bit0=0則處于正常狀態(tài);bit1=1時系統(tǒng)處于雙通道實數(shù)輸入模式;bit2=1時系統(tǒng)處于單通道復數(shù)輸入模式;如果bit0~bit2都是0,那么系統(tǒng)處于單通道實數(shù)輸入模式;bit3=1/0為時鐘主從工作模式。因此,當各寄存器配置完成后需要將寄存器bit0拉低,也即置為0狀態(tài)使其脫離軟復位狀態(tài),進入正常工作模式。另外,在本文中AD6620讀寫內(nèi)部寄存器是采用的異步讀寫時序,數(shù)據(jù)輸出是并行16位輸出模式。[!--empirenews.page--]

  總的來說,采用FPGA實現(xiàn)AD6620初始化的過程如下:

  1)首先判斷AD6620有沒有經(jīng)過硬件復位,如果沒有經(jīng)過硬件復位而又要實現(xiàn)系統(tǒng)復位,那么可以通過程序去編程地址0x300H的寄存器的bit0位置為1,使得AD6620處于軟件復位狀態(tài),這樣就可以對非動態(tài)的寄存器進行相關(guān)編程;

  2)對NCO單元、CIC2、CIC5濾波器的抽取倍數(shù)和系數(shù)進行編程,將相應(yīng)的控制系數(shù)寫入相對應(yīng)的地址寄存器中;

  3)對RCF濾波器系數(shù)進行編程,分別向地址0x000H~0xFF中寫入 這150個抽頭系數(shù),剩下的寫入0。

 

  4)對AD6620所有配置工作完成后,必須向地址0x300H的bit0寫入0,使其脫離軟復位狀態(tài),這樣AD6620才可以在所配置工作方式下對輸入的數(shù)據(jù)進行處理?! ?/p>

  4.實時數(shù)據(jù)傳輸模塊

  基于USB2.0的數(shù)據(jù)傳輸設(shè)計主要包括以下幾個部分:(1)基于EZ-USB FX2的硬件電路設(shè)計(2)EZ-USB FX2系列器件CY7C68013A的固件程序(設(shè)置CY7C68013A工作模式、傳輸方式等,需要對其內(nèi)部寄存器進行相關(guān)配置),主要通過Keil C51軟件進行開發(fā)。

  4.1 實時數(shù)據(jù)傳輸部分的硬件設(shè)計

  實時數(shù)據(jù)傳輸部分(USB2.0的數(shù)據(jù)傳輸)的硬件設(shè)計方案如圖10所示,USB模塊與FPGA間的連線如圖11所示。

  在高速數(shù)據(jù)傳輸部分采用了Cypress公司的EZ-USB FX2 CY7C68013A芯片,采用單片USB 2.0外設(shè)可以避免用FPGA直接實現(xiàn)USB通信協(xié)議時可靠性低的問題。在數(shù)據(jù)采集、傳輸以及測試過程中,CY7C68013A作為從機,負責將FPGA發(fā)送給它的基帶數(shù)據(jù),利用其16位SLAVE FIFO(關(guān)于SLAVE FIFO的傳輸示意圖如圖所示)將數(shù)據(jù)緩沖發(fā)送給上位機。在SLAVE FIFO數(shù)據(jù)傳輸中,上位機應(yīng)用程序、固件程序和FPGA程序都非常關(guān)鍵,要配合好才能完成數(shù)據(jù)的高速數(shù)據(jù)傳輸。在這個系統(tǒng)中,F(xiàn)PGA起著主控制器作用,CY7C68013A則相當于一個從設(shè)備。具體的工作流程是:FPGA把接收過來的16位數(shù)字基帶信號發(fā)送給CY7C68013A,CY7C68013A以SLAVE FIFO的方式將這些數(shù)據(jù)緩沖,并以批量數(shù)據(jù)傳輸?shù)姆绞桨l(fā)送給上位機,上位機接收到這些數(shù)據(jù)后加以存儲和顯示。

  4.2 CY7C68013A的固件程序設(shè)計

  固件程序是指運行在設(shè)備CPU中的程序,只有在該程序運行時,外設(shè)才能稱之為具有給定功能的外部設(shè)備。固件程序負責初始化單元,重新設(shè)置設(shè)備。主要包括設(shè)備描述符信息、設(shè)備功能代碼。設(shè)備描述信息描述USB設(shè)備的一半特性和配置,如設(shè)備類別、接口配置、VID和PID等。主機在設(shè)備列舉時要獲取USB設(shè)備的描述符,從而獲得設(shè)備的配置信息和相關(guān)驅(qū)動信息。用戶可以通過修改固件中的描述符來改變設(shè)備的特性。設(shè)備功能代碼有設(shè)備的功能需求決定。通信控制功能代碼執(zhí)行主機請求分析處理和數(shù)據(jù)交換處理功能。

  采用ARM公司的Keil C51 uVision4.02開發(fā)CY7C68013A的固件程序。為了簡化固件編程,CYPRESS提供了固件編程框架,在此基礎(chǔ)上添加我們所需要的配置代碼即可完成軟件編程?! ?/p>

  復位上電時,固件先初始化一些全局變量,然后調(diào)用初始化函數(shù)ID_Init(),初始化設(shè)備一直到?jīng)]有配置的狀態(tài)和打開中斷,循環(huán)1s后枚舉,直到端點0接收到SETUP包退出循環(huán),進入循環(huán)語句while,執(zhí)行任務(wù)函數(shù),函數(shù)包括:

  (a)TD_POLL()用戶任務(wù)調(diào)度函數(shù);

  (b)如果發(fā)現(xiàn)USB設(shè)備請求,則執(zhí)行對應(yīng)的USB請求;

  (c)如果發(fā)現(xiàn)USB空閑置位,則調(diào)用TD_Suspend()這個掛起函數(shù),調(diào)用成功后則內(nèi)核掛起,直到出現(xiàn)USB遠程喚醒信號,調(diào)用TD_Resume(),內(nèi)核喚醒后重新進入while循環(huán)。

  固件框架程序需要以下幾個文件:

  (1)FX2.h:庫函數(shù)申明,以及變量、宏定義、數(shù)據(jù)類型定義;

  (2)Fxregs.h:FX2LP寄存器頭文件;

  (3)Fw.c:固件框架源文件;

  (4)Periph.c:用戶調(diào)度函數(shù)、用戶可以修改,在不同的應(yīng)用中文件名不一樣;

  (5)Dscr.a51:USB描述符列表,用戶可以修改;

  (6)Ezusb.lib:EZUSB庫文件;

  (7)USBJmpTb.OBJ:中斷跳轉(zhuǎn)函數(shù)目標文件

  這種情況下,需要在固件程序中,進行相應(yīng)的修改。在SLAVE FIFO中,特別是自動傳輸(CY7C68013A單片機不干預(yù)數(shù)據(jù)傳輸),固件程序主要完成各個端口的初始化。因此我們要修改兩個地方:(1)USB設(shè)備描述符列表Dscr.a51,根據(jù)實際情況修改里面的端口數(shù)和傳輸方式等;(2)初始化函數(shù)void TD_Init(void)。在SLAVE FIFO這種方式下,設(shè)置EP2為4緩沖的輸出端口,EP6為4緩沖的輸入端口。

  5. 上位機軟件設(shè)計

  上位機應(yīng)用程序是系統(tǒng)與用戶之間交流的接口,它通過通用驅(qū)動程序完成對外設(shè)的控制和通信。主機端應(yīng)用程序負責向FX2的FIFO發(fā)送或者接收數(shù)據(jù)。本報告中采用的固件架構(gòu)是EZ-USB FX2/FX2LP(CY7C68013, 驅(qū)動程序是Cyusb.sys。用Visual Studio2008軟件進行上位機開發(fā),利用C++/MFC來開發(fā)基于對話框的應(yīng)用程序,系統(tǒng)的主要功能模塊有:打開USB設(shè)備、復位USB設(shè)備、系統(tǒng)數(shù)據(jù)測試與顯示等。

  在VS2008中建立一個MFC 單文檔/對話框應(yīng)用程序后,在路徑項目中包含頭文件cyapi.h和cyapi.lib所在的路徑。然后手動導入cyapi.lib,注意是CV6_7的lib,不要導入BCB的。

  開發(fā)USB應(yīng)用程序的一般工作流程如下。

  1)首先要創(chuàng)建一個USB設(shè)備對象

  CCyUSBDevice *USBDevice = new CCyUSBDev(Handle);括號中的Handle是USB所關(guān)聯(lián)對象的句柄,一般在MFC中直接就是m_hwnd。

  2)打開USB設(shè)備。

  可以用到兩個函數(shù)open();isopen()這兩個都可以用來打開USB設(shè)備,isopen()還可以判斷能否獲得USB設(shè)備句柄,一般來說,如果只有一個USB設(shè)備連接,可以這樣打開:

  USBDevice->open(0)//打開0號USB設(shè)備;如果要判斷,可以:

  if(!USBDevice->open(0)) //打開失敗

  {messagebox("USB未連接");}

  或者if(!USBDevice->Isopen())

  如果連接有多個USB設(shè)備,那么可以枚舉所有的USB,用到DeviceCount()函數(shù);具體的可以參考cybulk的例子。執(zhí)行USBDevice->DeviceCount()后,返回所連接的USB設(shè)備個數(shù):

  if (USBDevice->DeviceCount()) //保證至少有一個USB設(shè)備連接

  {

  for (i = 0; i DeviceCount(); i++) //枚舉所有USB設(shè)備

  {

  USBDevice->Open(i);//打開第i號USB設(shè)備

  m_DeviceListComBox.AddString(USBDevice->DeviceName);//所選擇的當前設(shè)備名}

  }

  3)端點枚舉

  在cybulk的例子中介紹了如何枚舉固件中使用的所有端點,也就是使用多個端點的情況,其枚舉步驟主要包括一下幾個端點:

  (1)創(chuàng)建USB設(shè)備并打開該設(shè)備

  CCyUSBDevice *USBDevice=new CCyUSBDevice(m_hWnd);//USB設(shè)備USBDevice->Open(0);//打開0號USB設(shè)備。

  (2)獲取所用的端點數(shù)目

  intepts = USBDevice->EndPointCount();

  EndPointCount();函數(shù)返回當前所用的端點數(shù)+1,也就是包含了控制端點。例如在固件接口描述符Interface Descriptor中設(shè)置Number of end points項(第5項)的值為4,則epts的值為4+1=5。

  (3)定義端點指針

  CCyUSBEndPoint *endpt;CCyUSBEndPoint建立一個端點對象,可建立所有的端點類型,控制端點,bulk端點,ISO端點等;

  (4)枚舉端點,并獲得其屬性:端點號,傳輸方向

  for (i=1; i

  {

  endpt = USBDevice->EndPoints[i];//EndPoints-端點列表,最大16.EndPoints[0]指向控制端點(CCyControlEndPoint),未使用的端點設(shè)置為NULL。

  if (endpt->Attributes == 2) // Bulk Attributes 判斷傳輸類型bulk,control,等。

  {

  sprintf(s, "0x%02x", endpt->Address);

  if (endpt->Address & 0x80) //Address--判斷傳輸方向in or out 0x8_-in;0x0_-out

  {

  m_InEndptComBox.AddString(s); //最高位為8,in端點,添加到in組合框m_InEndptComBox.SetItemData(m_InEndptComBox.GetCount()-1,i);

  else

  {

  m_OutEndptComBox.AddString(s); //否則,最高位為0,out端點,添加到out組合框m_OutEndptComBox.SetItemData(m_OutEndptComBox.GetCount()-1,i);

  }}}[!--empirenews.page--]

  這樣,就完成了某個具體端點的選擇。如果只需要使用一個端點的話,那上面的代碼無疑就顯得冗長不夠簡潔了。僅使用一個端點,可以使用EndPointOf()函數(shù),該函數(shù)直接使用指定的端點,返回其指針;例如,要使用端點2,in傳輸,那么,可以這樣:

  CCyUSBDevice *USBDevice=new CCyUSBDevice(m_hWnd); //USB設(shè)備

  USBDevice->Open(0); //打開0號設(shè)備,

  CCyUSBEndPoint *endpt = USBDevice->EndPointOf(0X82); //使用端點2,in傳輸可以看到,上面的只需要3行代碼,比枚舉簡潔方便多了。至于獲取USB其他屬性,這里列出經(jīng)常使用的幾個:(1)USBDevice->DeviceCount()//返回連接到電腦的USB設(shè)備個數(shù),從0,1,2.開始命名(2)USBDevice->DeviceName()//返回USB設(shè)備名稱,也就是固件中 StringDscr2:字段字符串。(3)USBDevice->VendorID//返回USB設(shè)備VIDUSBDevice->ProductID//返回USB設(shè)備PID。具體的可參考cyapi的文檔,在CCyUSBDevice和CCyUSBEndPoint這兩個類里可查詢到。

  4)傳輸命令控制

  可以說,寫USB上位機,要對固件進行自定義命令傳輸,通常都是用輸入輸出控制傳輸進行的,即使用控制傳輸in或者out方式實現(xiàn)對固件的自定義命令。

  (1)out控制傳輸發(fā)送vendor命令

  采用out方式應(yīng)該比較符合大家的思維,因為是從上位機發(fā)命令到下位機,怎么看都應(yīng)該是out而不是in。例如你在固件里設(shè)置了out的接收buf:

  BOOL DR_VendorCmnd(void)

  {

  switch (SETUPDAT[1])

  {

  case 0xDD:

  { temp=EP0BUF[0];

  EP0BCH=0;

  EP0BCL=1;

  EP0CS |=bmHSNAK;

  break;

  }

  default:

  return(TRUE);

  }

  return(FALSE);

  }

  在VS2008的C++/MFC中:

  CCyControlEndPoint* CtlEndpoint;//定義一個控制端點

  CtlEndpoint->Target = TGT_DEVICE;//不必關(guān)注,固定

  CtlEndpoint->ReqType = REQ_VENDOR; //請求類型:自定義請求(標準請求等)CtlEndpoint->Direction = DIR_TO_DEVICE; //傳輸方向:主機->usb設(shè)備(out)

  CtlEndpoint->ReqCode = 0XDD; //自定義請求碼

  CtlEndpoint->Value = 0; //這里的設(shè)定值將傳給setupdat的[2:3]位

  CtlEndpoint->Index = 0; //這里的設(shè)定值將傳給setupdat的[4:5];PUCHAR buf=new UCHAR[1];

  ZeroMemory(buf,1);//用0填充buf區(qū),填充大小(1字節(jié))

  long buflen=1;//傳輸?shù)钠渌止?jié)數(shù):cy控制臺console中l(wèi)ength的值。

  CtlEndpoint->XferData(buf,buflen);

  當然,沒有規(guī)定說一定必須傳給下位機至少一個字節(jié)的數(shù)據(jù);你也可以不傳;不過最好下位機同樣設(shè)置接收字節(jié)為0,否則小心有莫名奇妙的錯誤(XX內(nèi)存不能為只讀等等)。

  將temp=EP0BUF[0];去掉,上位機:

  PUCHAR buf=new UCHAR; //用0填充buf區(qū),填充大小(1字節(jié))

  long buflen=0;

  CtlEndpoint->XferData(buf,buflen);

  也是可以的,另外,控制傳輸請盡量用同步的xferdata()而不是異步的begindataxfer()。

  (2)in控制傳輸發(fā)送vendor命令

  基本上,跟out區(qū)別不大。固件中:

  BOOL DR_VendorCmnd(void)

  {

  switch (SETUPDAT[1])

  {

  case 0xDD:

  {

  *EP0BUF=0XDD;

  EP0BCH=0;

  EP0BCL=1;

  EP0CS |=bmHSNAK;

  break;

  }

  default:

  return(TRUE);

  }

  return(FALSE);

  }

  VC中:CCyControlEndPoint* CtlEndpoint; //定義一個控制端點

  CtlEndpoint->Target = TGT_DEVICE;//不必關(guān)注,固定

  CtlEndpoint->ReqType= REQ_VENDOR; //請求類型:自定義請求(標準請求等)CtlEndpoint->Direction = DIR_FROM_DEVICE; //傳輸方向:usb設(shè)備->主機(in)CtlEndpoint->ReqCode = 0XDD; //自定義請求碼CtlEndpoint->Value = 0;//這里的設(shè)定值將傳給setupdat的[2:3]位CtlEndpoint->Index = 0; //這里的設(shè)定值將傳給setupdat的[4:5]位PUCHAR buf=new UCHAR[1];

  ZeroMemory(buf,1); //用0填充buf區(qū),填充大小(1字節(jié))

  long buflen=1; //傳輸?shù)钠渌止?jié)數(shù):cy控制臺console中l(wèi)ength的值CtlEndpoint->XferData(buf,buflen);這里的話,推薦盡量設(shè)置接收緩沖,不要將buflen設(shè)置為0.同樣,控制傳輸請盡量用同步的xferdata()而不是異步的begindataxfer()。

  (3)另外,還有兩個簡化版本的函數(shù)Write(out傳輸)和Read(in傳輸)也可以進行控制傳輸。其作用同XferData()是一樣的,因為已經(jīng)明確表示了是in還是out,所以Direction 項的值就省略了。只是看起來代碼更加簡潔,輸入效率更高而已?;旧希蠖鄶?shù)時候,使用Write和Read會方便很多。

  CCyControlEndPoint* CtlEndpoint; //定義一個控制端點

  CtlEndpoint->Target = TGT_DEVICE; //不必關(guān)注,固定

  CtlEndpoint->ReqType = REQ_VENDOR; //請求類型:自定義請求(標準請求等)CtlEndpoint->ReqCode = 0XDD; //自定義請求碼CtlEndpoint->Value = 0; //這里的設(shè)定值將傳給setupdat的[2:3]位CtlEndpoint->Index = 0; //這里的設(shè)定值將傳給setupdat的[4:5]位PUCHAR buf=new UCHAR[1];ZeroMemory(buf,1);//用0填充buf區(qū),填充大小(1字節(jié)) long buflen=1; //傳輸?shù)钠渌止?jié)數(shù):cy控制臺console中l(wèi)ength的值CtlEndpoint->Write(buf,buflen);

  Read的話同理。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉