第十一章 USB 設備實驗 一.背景 在ATMEL官方網站上提供了USB的應用例子(詳情請參考“BasicUSB Application”說明),里面有源代碼(是用IAR編譯的,需要稍作修改才能用在ADS上),兩個不同的USB驅動程序。兩個不同的USB驅動程序,在PC機上是兩個不同的應用例子。當安裝完兩個不同的驅動后,一個出現的是調制解調器的設備,可以用超級終端來完成USB數據的收發。另一個是USB 設備,用ATMEL提供的“BasicUSB_6124.exe”來完成USB數據的收發。我起初一直在用后面的例子來做實驗,但試了很久都沒有成功,后來改用前面的成功了。 二.USB驅動安裝說明 當第一次與host PC機連接時,系統會彈出一個“找到新的硬件向導”窗口,選擇“從列表或指定位置安裝”后點擊“下一步”。在接下來的窗口中選擇“不要搜索。我要自己選擇要安裝的驅動程序”,然后點擊“下一步”。再在接下來的窗口中點擊“從磁盤安裝”,找到“atm6124ser.inf”所在的目錄后打開。再點擊“下一步”開始安裝,最后點“完成”就可以。 安裝完成后,會在設備管理器的“調制解調器”欄中查看到“ATMEL AT91 USB serial emulation #2”設備。此時就可以使用“超級終端”通過USB與AT91SAM7S64通訊了。詳請請查看該目錄的“BasicUSB Application.pdf”文件。 三.實驗目的 用PC機上的超級終端發送數據,AT91SAM7S64通過USB接收超級終端上發過來的數據(USB的讀操作),再通過USB將接收到的數據返回給PC機上的超級終端(USB的寫操作),這樣就完成了PC機與 AT91SAM7S64的USB通訊。如果AT91SAM7S64將接收到數據通過DBUG串口再發送出去,這樣AT91SAM7S64就可以當作一個 USB轉串口的設備使用。 四.實驗源程序 由于這個實驗的源程序比較多,且ATMEL提供了詳細的文檔和源代碼,故不再列出。有什么問題可以通過ccn422@hotmail.com聯系我。 另外因為ATMEL的源碼中沒有使能重映射功能,如果想將程序下載到地址為0x00200000的SRAM中調試,又要使用在0x0地址空間的中斷向量表,使程序跳轉到中斷處理程序,必須使用重映射的功能。所以我在起動代碼(AT91F_LowLevelInit)中加了重映射這條命令,如下: if (Remap_Flag == 0) { //由于不能重復執行重映射命令,所以加了Remap_Flag標志來避免多次執行重映射命令 Remap_Flag = 0xff; *AT91C_MC_RCR = AT91C_MC_RCB; //Remap Command Bit } 五.出現的問題與解決方法 1> 每次重新裝載程序進行調試時,Remap_Flag沒有等于0。 原因是進入C代碼前,沒有初始化存儲器的內容。用戶可以將起動代碼中的“b main”改成“b __main”,即在跳入到main()函數前執行__main初始化庫函數,也可自己加入初始化存儲器的代碼。程序如下: InitReset IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data) IMPORT |Image$$RW$$Base| ; Base of RAM to initialise IMPORT |Image$$ZI$$Base| ; Base and limit of area IMPORT |Image$$ZI$$Limit| ; to zero initialise ;******************************************************** ;* Copy and paste RW data/zero initialized data * ;******************************************************** LDR r0, =|Image$$RO$$Limit| ; Get pointer to ROM data LDR r1, =|Image$$RW$$Base| ; and RAM copy LDR r3, =|Image$$ZI$$Base| ;Zero init base => top of initialised data CMP r0, r1 ; Check that they are different BEQ %F1 0 CMP r1, r3 ; Copy init data LDRCC r2, [r0], #4 ;--> LDRCC r2, [r0] + ADD r0, r0, #4 STRCC r2, [r1], #4 ;--> STRCC r2, [r1] + ADD r1, r1, #4 BCC %B0 1 LDR r1, =|Image$$ZI$$Limit| ; Top of zero init segment MOV r2, #0 2 CMP r3, r1 ; Zero init STRCC r2, [r3], #4 BCC %B2 如果想詳細了解該部分的原理,可以參考三星公司為44B0寫的起動代碼部分資料。 2> 這個實驗浪費了很多的時間,原因就是因為我一直用的atm6124.sys和atm6124.inf驅動程序以及BasicUSB_6124.exe來做此實驗,當執行BasicUSB_6124.exe后,總是出現“設備不能連接”。為此我專門去書店買了《USB2.0應用與設計》參考,再研究和調試源代碼,再加上仔細的閱讀“BasicUSB Application.pdf”文件,后來改用atm6124ser.inf驅動程序與超級終端來完成了本次實驗。 六.總結 如果一開始就很成功的完成了本次實驗,我可能對USB的原理等不會了解到多少,正是因為出現了問題,我才會為了解決問題而去找相關的資料學習,最終到問題的解決。因此出現問題并不是一件什么壞事,相反,問題的出現會引導我們靜下心來向更深層次去探究,最終更深刻更全面地掌握知識。 |