新聞中心

ARM入門筆記(10)

作者: 時間:2016-12-02 來源:網(wǎng)絡(luò) 收藏
USB設(shè)備實驗

一.背景

在ATMEL官方網(wǎng)站上提供了USB的應(yīng)用例子(詳情請參考“BasicUSB Application”說明),里面有源代碼(是用IAR編譯的,需要稍作修改才能用在ADS上),兩個不同的USB驅(qū)動程序。兩個不同的USB驅(qū)動程序,在PC機上是兩個不同的應(yīng)用例子。當安裝完兩個不同的驅(qū)動后,一個出現(xiàn)的是調(diào)制解調(diào)器的設(shè)備,可以用超級終端來完成USB數(shù)據(jù)的收發(fā)。另一個是USB 設(shè)備,用ATMEL提供的“BasicUSB_6124.exe”來完成USB數(shù)據(jù)的收發(fā)。我起初一直在用后面的例子來做實驗,但試了很久都沒有成功,后來改用前面的成功了。

二.USB驅(qū)動安裝說明

當?shù)谝淮闻chost PC機連接時,系統(tǒng)會彈出一個“找到新的硬件向?qū)?rdquo;窗口,選擇“從列表或指定位置安裝”后點擊“下一步”。在接下來的窗口中選擇“不要搜索。我要自己選擇要安裝的驅(qū)動程序”,然后點擊“下一步”。再在接下來的窗口中點擊“從磁盤安裝”,找到“atm6124ser.inf”所在的目錄后打開。再點擊“下一步”開始安裝,最后點“完成”就可以。

安裝完成后,會在設(shè)備管理器的“調(diào)制解調(diào)器”欄中查看到“ATMEL AT91 USB serial emulation #2”設(shè)備。此時就可以使用“超級終端”通過USB與AT91SAM7S64通訊了。詳請請查看該目錄的“BasicUSB Application.pdf”文件。

三.實驗?zāi)康?br />
用PC機上的超級終端發(fā)送數(shù)據(jù),AT91SAM7S64通過USB接收超級終端上發(fā)過來的數(shù)據(jù)(USB的讀操作),再通過USB將接收到的數(shù)據(jù)返回給PC機上的超級終端(USB的寫操作),這樣就完成了PC機與 AT91SAM7S64的USB通訊。如果AT91SAM7S64將接收到數(shù)據(jù)通過DBUG串口再發(fā)送出去,這樣AT91SAM7S64就可以當作一個 USB轉(zhuǎn)串口的設(shè)備使用。

四.實驗源程序

由于這個實驗的源程序比較多,且ATMEL提供了詳細的文檔和源代碼,故不再列出。有什么問題可以通過ccn422@hotmail.com聯(lián)系我。

另外因為ATMEL的源碼中沒有使能重映射功能,如果想將程序下載到地址為0x00200000的SRAM中調(diào)試,又要使用在0x0地址空間的中斷向量表,使程序跳轉(zhuǎn)到中斷處理程序,必須使用重映射的功能。所以我在起動代碼(AT91F_LowLevelInit)中加了重映射這條命令,如下:

if (Remap_Flag == 0)
{ //由于不能重復(fù)執(zhí)行重映射命令,所以加了Remap_Flag標志來避免多次執(zhí)行重映射命令
Remap_Flag = 0xff;
*AT91C_MC_RCR = AT91C_MC_RCB; //Remap Command Bit
}

五.出現(xiàn)的問題與解決方法

1> 每次重新裝載程序進行調(diào)試時,Remap_Flag沒有等于0。

原因是進入C代碼前,沒有初始化存儲器的內(nèi)容。用戶可以將起動代碼中的“bmain”改成“b__main”,即在跳入到main()函數(shù)前執(zhí)行__main初始化庫函數(shù),也可自己加入初始化存儲器的代碼。程序如下:

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驅(qū)動程序以及BasicUSB_6124.exe來做此實驗,當執(zhí)行BasicUSB_6124.exe后,總是出現(xiàn)“設(shè)備不能連接”。為此我專門去書店買了《USB2.0應(yīng)用與設(shè)計》參考,再研究和調(diào)試源代碼,再加上仔細的閱讀“BasicUSB Application.pdf”文件,后來改用atm6124ser.inf驅(qū)動程序與超級終端來完成了本次實驗。

六.總結(jié)

如果一開始就很成功的完成了本次實驗,我可能對USB的原理等不會了解到多少,正是因為出現(xiàn)了問題,我才會為了解決問題而去找相關(guān)的資料學(xué)習(xí),最終到問題的解決。因此出現(xiàn)問題并不是一件什么壞事,相反,問題的出現(xiàn)會引導(dǎo)我們靜下心來向更深層次去探究,最終更深刻更全面地掌握知識。


關(guān)鍵詞: ARM入門筆

評論


技術(shù)專區(qū)

關(guān)閉