首先要實現對寄存器的配置,可以參考手冊《Development kit User Guide》,如下圖所示:
此文件包含在 文件中。上述的應用文檔詳細介紹了如何利用KEIL實現對固件程序的編寫。
對於USB 配置程序,下圖是幾個重要的模塊,其中fw.c是主程序框架,periph.c文件是用戶用來進行配置的主程序。
在《Development kit User Guide》手冊中,有如下描述:
手冊中也有講到,TD_init需要用戶針對所用設備名稱進行修改,fw.c中的程序可以不用修改。
1.TD_init()
注意到TD_init()在此函數內進行設備的初始化,包括時鍾頻率,端口,FIFO的使用等,具體可以參看之前博客《EZ-USB重要寄存器的配置》。
2.TD_Poll()
TD_Poll()是供用戶外部設備使用,也就是在TD_Poll() 這個函數內寫用戶外部接口程序,控制外部設備。
3.TD_suspend()
這個函數是當主函數進入掛起模式時被調用,在這個函數內寫程序可以執行低功耗,關閉其他外部設備。如返回ture指示主函數使得FX2LP進入USB掛起模式。false可以使得不進入掛起模式。
4.TD_resume()
這個函數是針對掛起模式函數而言的,當主函數退出掛起模式時,此函數被調用
下圖是官方固件中給出的函數。
圖上的TD_Suspend()和TD_resume
5.EZ library
EZUSB-library 包含了EZUSB所需要的所有的寄存器文件。
以上是簡單的介紹了一下關於主函數內部函數和用戶編程函數內部函數介紹,更多的介紹請參看DVK手冊。
6.端點配置以及緩沖區域
在之前的博客《EZ-USB重要寄存器的配置》中,關於端點的緩沖區和定義使用哪幾個端點如圖所示:
上述是對於端口配置的解釋,在設置為EP2CFG = 0xE0 ,緩沖區設置的是4緩沖區,每個緩沖區的大小為512字節。
關於緩沖區的設置原因,有如下的說法:(轉載自某網友的回復)
1,說FIFO滿了就自動上傳給電腦——這話是錯的。USB2.0及1.1設備不能中斷主機,只能是主機主動去訪問設備。就是說,即便FIFO滿了,如果主機不取,數據依然在設備的RAM里,RAM寫滿之后固件就不應該再寫了。
2,端點0,1比較簡單,緩沖區長度固定,64字節,沒有多重緩沖。端點2468比較靈活,4和8可以配置成512字節的雙緩沖,2和6可以配置成512字節、1024字節的2、3、4倍緩沖。
3,多重緩沖的目的是,主機(USB數據)可以和端點外部邏輯(如DSP,FPGA)直接交換信息,數據不用從CPU導進導出,從而提高了性能。多重緩沖的目的,可以提高系統性能,減少大數據進出時的等待,使突發數據變得平滑。這樣說更恰當。
4,緩沖是指對於端點有效的內存區塊數。比如,雙重緩沖,在USB數據進出一個端點的同時,外部邏輯的信息也可以進出同一端點。這是手冊說的。
5,假定端點2緩沖區設置為512字節,4倍緩沖,盡管這一端點占有了2048字節RAM,但CPU只認識“激活的”512字節緩沖區。這可以從寄存器長度看得出來,比如,EP2BCH:L是11位,可對1024字節的最大緩沖區長度進行計數,EP4BCH:L是10位,可對512自己的最大緩沖區長度進行計數。
6,從第5點可以看出,FIFO讀寫數據是自動完成的,至於乒乓方式也是隱式實現的,CPU不了解也無需了解如何乒乓。CPU可以對FIFO進行少量的控制,傳輸有自動和CPU干預兩種。了解FIFO的工作狀況,可以通過中斷、獲取其EPxBCH:L長度、空、滿、空閑等等一系列寄存器。寄存器太多了,所以顯得這塊特別復雜。
7,一般地,在TD_Poll循環中,對輸出緩沖區判斷是否空,空則繼續寫給外部邏輯,將主機來的USB數據寫到外部邏輯;對輸入緩沖區判斷是否滿,滿則不再寫,外部邏輯來的數據將被固件自行拋棄。這可以回答你的第二個問題,緩沖區滿是指所有輸入緩沖區都滿了,不管幾重緩沖區都沒地可寫了。
8,再深入地探討一下。對輸入緩沖區,如果主機長時間不讀取USB設備的數據,那么它再次讀到的數據,將是設備之前寫滿的數據。而外部邏輯新來的數據,將在主機將緩沖區讀出空間之后才能更新。實際上,此時的數據會“跳”。你所說的“交替傳輸”將無法實現。這是USB2.0不能申請主機中斷的弊病,在實時采集時,主機必需有個線程不停地讀數。據介紹,USB3.0可以中斷主機,值得期待。