(這部分重點(diǎn)推薦了 SHARC 處理器的一些外設(shè)單元的程序)
PCG(外設(shè)時(shí)鐘發(fā)生器)編程
本部分主要討論使用 PCG(精確時(shí)鐘發(fā)生器)為 SHARC SPORT 提供時(shí)鐘的注意事項(xiàng)。
- 使用 PCG 產(chǎn)生的信號(hào)為 I 2 S 模式的 SPORT 提供 FS 和 SCLK 信號(hào)時(shí),需要配置 PCG 的延遲寄存 器,使信號(hào)時(shí)序與 I 2 S 協(xié)議時(shí)序一致。LRCLK 信號(hào)必須由串行時(shí)鐘的下降沿驅(qū)動(dòng)。 „
- 使用 PCG 為 TDM 模式的 SPORT 提供信號(hào)時(shí),要求幀同步信號(hào)僅在一個(gè)串行 bit 時(shí)鐘周期保持 有效。注意,TDM 模式的幀同步是電平觸發(fā)的,而不是邊沿觸發(fā)。PCG 脈寬寄存器(PCG_PW) 應(yīng)該置“1”,這樣幀同步僅在一個(gè)串行時(shí)鐘周期有效。在這樣的配置下,由于幀同步是單串行時(shí) 鐘周期有效,SPORT 是使能還是再次使能的狀態(tài)都沒關(guān)系。如果幀同步無效期間,SPORT 被使能,需要等待直到下個(gè)有效幀同步信號(hào)。在 PCG 配置需要 50%工作周期的系統(tǒng)下,使用 DAI 中斷來使能 SPORT。
假設(shè) PCG 幀同步和時(shí)鐘信號(hào)在 SPORT 使能或再次使能前啟動(dòng),由于串口可以在同步和時(shí)鐘信 號(hào)啟動(dòng)后的任何時(shí)候使能,可能有以下情形發(fā)生:串口在任何有效同步信號(hào)采樣時(shí),開始鎖存(接 收機(jī)情形)或驅(qū)動(dòng)數(shù)據(jù)(發(fā)送機(jī)情形)。注意,幀同步信號(hào)在 TDM 模式是電平觸發(fā)而不是邊沿觸發(fā) 的。這樣的情況會(huì)在串口禁止然后重新使能下反復(fù)發(fā)生,以致失去同步。這可能導(dǎo)致通道移位 或者數(shù)據(jù)丟失。啟動(dòng)串口的正確過程應(yīng)該是等待幀同步信號(hào)無效沿,然后在幀同步信號(hào)無效期 間使能串口。這就保證了串口在幀同步信號(hào)有效電平期間采樣數(shù)據(jù)。
這個(gè)過程還應(yīng)該在串口禁止和重新使能的時(shí)候采用,從而保證串口不會(huì)在有效幀的中部采樣數(shù) 據(jù)。這個(gè)操作由以下過程實(shí)現(xiàn)。PCG 幀同步映射到 DAI 中斷。幀同步無效邊沿觸發(fā) DAI 中斷, 這意味著幀同步信號(hào)會(huì)在一段時(shí)間無效,串口應(yīng)該在幀同步信號(hào)無效期間啟動(dòng),或者執(zhí)行串口 禁止和重新使能時(shí)操作。
使用 IDP 使能 I2S(數(shù)據(jù)輸入口)
使用 IDP 從外面的設(shè)備接收數(shù)據(jù),配置成 I2S 模式接收數(shù)據(jù)時(shí),需要按照一定步驟。如果不按此步 驟操作,可能導(dǎo)致通道漂移或交換。
1. 將幀同步信號(hào)通過 SRU(信號(hào)路由單元)連接到 DAI 中斷。
2. 將中斷配置成幀同步無效邊沿觸發(fā)。
3. 等待 DAI 中斷,在中斷服務(wù)子程序中使能 IDP 端口。
4. 通過讀 DAI 中斷鎖存寄存器清除 DAI 中斷。
這個(gè)步驟可以保證 IDP 端口在適當(dāng)時(shí)間被使能,從而避免在接收數(shù)據(jù)時(shí)發(fā)生通道漂移或交換的情況。
DAI 中斷
不同于其它中斷,DAI 中斷不是在 DAI 中斷子程序中自動(dòng)被清除的。一旦鎖存,中斷標(biāo)志將保持直 到通過讀 DAI 中斷鎖存寄存器顯式地清除鎖存狀態(tài)。DAI 中斷通過讀取 DAI 鎖存寄存器被清除。如 果此操作沒有發(fā)生,程序?qū)⒃诿看瓮顺鲋袛嗪笤俅芜M(jìn)入 DAI 中斷服務(wù)子程序。
在 DMA 中斷服務(wù)子程序中禁止外設(shè)功能
SHARC 處理器外設(shè)支持 DMA 數(shù)據(jù)傳輸模式。DMA 中斷在 DMA 傳輸計(jì)數(shù)器終止時(shí)發(fā)生。當(dāng)一個(gè) 外設(shè)被配置為接收數(shù)據(jù)時(shí),DMA 計(jì)數(shù)器在所有數(shù)據(jù)被接收并且搬移到內(nèi)部?jī)?nèi)存中以后終止。當(dāng)外設(shè)被配置為發(fā)送數(shù)據(jù),即使 DMA 計(jì)數(shù)器終止并產(chǎn)生中斷,數(shù)據(jù)還保存在 DMA FIFO 中。如果軟件在 ISR 中關(guān)閉 DMA 和外設(shè),應(yīng)該先查詢 DMA FIFO 狀態(tài)。當(dāng) FIFO 為空時(shí),可以安全關(guān)閉外設(shè),否則 會(huì)導(dǎo)致數(shù)據(jù)丟失。
SPORT/SPI 雙觸發(fā)
這部分僅適用于 ADSP-21367/8/9 和 ADSP-2137x 處理器。假定 SPI 用于內(nèi)核模式的數(shù)據(jù)傳輸。當(dāng)內(nèi) 核遇到傳輸緩存空的狀態(tài)時(shí),即產(chǎn)生發(fā)送中斷。在發(fā)送中斷子程序中,軟件將寫一個(gè)新的數(shù)值到發(fā) 送緩存中,然后從中斷返回。在此情況,從 ISR 返回后,處理器再次檢測(cè)到發(fā)送緩存的空狀態(tài),然 后重新進(jìn)入 SPI 發(fā)送中斷服務(wù)子程序。這樣的狀態(tài)都是由于高度流水線的 IOP 寫操作。寫入發(fā)送緩 存以后,直到數(shù)據(jù)真正被發(fā)送以及傳輸緩存狀態(tài)變化到“非空”狀態(tài),需要 10 個(gè)內(nèi)核時(shí)鐘周期。因此, 在此情況下,從中斷子程序返回需要延遲至少 10 個(gè)內(nèi)核時(shí)鐘周期。
SHARC PLL 編程
ADSP-2116x SHARC 處理器中,使用 CLKCFG(時(shí)鐘配置)信號(hào)配置 PLL(以及內(nèi)核時(shí)鐘和外部端口時(shí) 鐘頻率)。對(duì)于 ADSP-2126x,ADSP-2136x 和 ADSP-2137x SHARC 處理器,需要額外的外部 CLKCFG 信號(hào),PLL 可以通過軟件配置。這樣,軟件可以利用電源控制寄存器(PMCTL)中的 PLL 乘法器和分 頻計(jì)數(shù)器實(shí)現(xiàn)多樣的可編程比率。這也為用戶通過軟件改變內(nèi)核頻率提供了靈活性。為恰當(dāng)?shù)嘏渲?PLL,推薦使用 Managing the Core PLL on ADSP-2136x SHARC Processor(EE-290)[3]中記述的方法。 EE-290 還提供了代碼例程,以及利用 elfar 工具集成 C 可調(diào)用的 PLL 配置函數(shù)到庫中的詳細(xì)步驟。 確保 DIVEN 位在進(jìn)入和退出 by-pass 模式前被清除。
SPORTs 和門控時(shí)鐘設(shè)備的接口
有的系統(tǒng)設(shè)計(jì)需要將SHARC的SPORT和諸如數(shù)據(jù)轉(zhuǎn)換器或SPI主處理器之類的門控時(shí)鐘設(shè)備接口。 為保證與門控時(shí)鐘設(shè)備間的恰當(dāng)操作和數(shù)據(jù)傳輸,Interfacing Gated Clocks to ADSP-21065L SHARC Processors (EE-244)Interfacing AD7676 ADCs to ADSP-21065L SHARC Processor(EE-247)以及 Interfacing AD7676 ADCs to ADSP-21365 SHARC Processor(EE-248)可供參考,同時(shí)還有例子說明。
調(diào)試技巧
俗話說,防患于未然。系統(tǒng)設(shè)計(jì)工程師和軟件工程師應(yīng)該經(jīng)常查看他們打算使用的 SHARC 處理器 的異常文檔。了解已知硅片問題和建議解決方法,也縮短了開發(fā)周期。對(duì)于必須從硬件(例如電路板 設(shè)計(jì))上解決的問題,它能夠幫助您避免昂貴和長(zhǎng)時(shí)間的電路再版。
這一部分講述了通?赡苡龅降膯栴}以及調(diào)試技巧。這些技巧能夠彌補(bǔ)您的其它調(diào)試努力。以下是 最常見的情況。
引導(dǎo)失敗
用戶可以使用 JTAG ICE 下載執(zhí)行應(yīng)用程序,卻不能在引導(dǎo)裝載下執(zhí)行應(yīng)用程序,這是十分常見的 案例。調(diào)試時(shí)請(qǐng)注意以下幾點(diǎn):
- 檢查處理器的 BOOTBFG 管腳,確保各自連在適當(dāng)?shù)臄?shù)字電壓電平高或者低。如果使用電阻來 增加改變引導(dǎo)模式靈活性,確保阻值選擇正確。檢查電平的最好方法就是通過示波器檢測(cè)處理 器管腳。
- 確保 JTAG ICE 的/TRST 信號(hào)通過電路板接地。不要讓此信號(hào)線懸空。懸空可能導(dǎo)致引導(dǎo)失敗或 其它內(nèi)存訪問失敗。
- 確保在生成啟動(dòng)文件(.LDR)前使用正確的引導(dǎo)內(nèi)核。如果使用改進(jìn)的引導(dǎo)內(nèi)核,請(qǐng)使用 VisualDSP++®應(yīng)用例程中(例如標(biāo)志鎖定)提供的默認(rèn)引導(dǎo)內(nèi)核并使用簡(jiǎn)單的例子(比如管腳切換) 來確認(rèn)基本的引導(dǎo)裝載。
- 確保在生成.LDR 文件時(shí),選擇正確的參數(shù)。選擇不合適的參數(shù)可能導(dǎo)致引導(dǎo)失敗。
- 檢查是否使用 ICE(在線硬件仿真器)引導(dǎo)裝載代碼。連接 ICE 到目標(biāo)板,打開 VisualDSP++的仿 真環(huán)境。打開目標(biāo)板開始引導(dǎo)裝載。把環(huán)境從“simulator”改變成“emulator”,觀察匯編窗口。它 顯示是否從外部資源裝載引導(dǎo)應(yīng)用程序。如果沒有看到期望的代碼,引導(dǎo)失敗。還可以使用本 方法檢查處理器是否下載初始的 256 個(gè)指令。
- 確保上電的重啟時(shí)序與數(shù)據(jù)手冊(cè)一致。
- 檢查 CLKCFG 信號(hào),保證 PLL 沒有過驅(qū)動(dòng)。確保所選的比例和 CLKIN 頻率沒有超過內(nèi)核時(shí)鐘 的預(yù)定范圍。
- 檢測(cè)與引導(dǎo)相關(guān)的信號(hào),例如/BMS(ADSP-21367/8/9 和 ADSP-2137x 的/MS1),/RD,ADD 以及 總線上的 DATA。檢查板上電路完整性,是否板上有開路或者短路情況。還能觀察 RSTOUT 來 確定 PLL 是否鎖定。
- 檢查引導(dǎo)裝載操作過程中外部總線是否有總線沖突。例如,以 ADSP-21367/8/9 和 ADSP-2137x 處理器為例,/MS2 和/MS3(如果使用)應(yīng)該有外部的上拉電阻。否則,接口到/MS2 和/MS3 的內(nèi) 存驅(qū)動(dòng)總線,在引導(dǎo)期間導(dǎo)致總線沖突。
應(yīng)用崩潰
大部分情況,這類問題是在運(yùn)行應(yīng)用程序時(shí)導(dǎo)致軟件崩潰。有時(shí)也會(huì)出現(xiàn)處理器停在不明地址,或 重新開始整個(gè)應(yīng)用。導(dǎo)致此結(jié)果的因素有以下幾個(gè):
- 處理器執(zhí)行間接訪問,可能導(dǎo)致.LDF 文件定義的堆?臻g被破壞。這可能導(dǎo)致程序在運(yùn)行時(shí)所 需要的關(guān)鍵數(shù)據(jù)被損壞,從而導(dǎo)致軟件崩潰。由于可能導(dǎo)致破壞,保證應(yīng)用程序不會(huì)執(zhí)行這樣 的內(nèi)存訪問。程序運(yùn)行時(shí),可以通過 ICE 利用 V, isualDSP++的硬件斷點(diǎn)特性來調(diào)試。如果處理器 執(zhí)行了這些區(qū)域的非法訪問,這些訪問會(huì)被檢測(cè)到。
- „ 檢查應(yīng)用程序是否執(zhí)行了破壞性的/無意的系統(tǒng)寄存器或 IOP 寄存器訪問,這可能導(dǎo)致應(yīng)用暫停 或者重新開始。例如,檢查應(yīng)用程序是否在代碼中設(shè)置了軟重啟/重新引導(dǎo)。檢查間接跳轉(zhuǎn)或調(diào) 用。
- 由于不合適的退耦/旁路電容,電路板可能出現(xiàn)無法預(yù)計(jì)的行為,常常是某段代碼錯(cuò)誤執(zhí)行。保 證電路板上處理器和其它設(shè)備使用了合適的退耦電容和散電容(電容型號(hào)/電容值以及放置點(diǎn)都 是關(guān)鍵),這樣才能在系統(tǒng)運(yùn)行期間提供有效的電流/功率切換。頻繁的內(nèi)核或 I/O 切換需要額外 的切換電流。如果未提供相應(yīng)電流,一些系統(tǒng)關(guān)閉,應(yīng)用崩潰或特定代碼的錯(cuò)誤執(zhí)行的現(xiàn)象可 能發(fā)生。
- 很好的習(xí)慣就是使用校驗(yàn)和驗(yàn)證確認(rèn)引導(dǎo)裝載應(yīng)用程序的正確性,確保數(shù)據(jù)和代碼是完全正確 下載。bit 錯(cuò)誤可能在噪聲環(huán)境中發(fā)生。由于 bit 錯(cuò)誤,處理器可能執(zhí)行錯(cuò)誤(非法)的指令或處理 錯(cuò)誤數(shù)據(jù),從而導(dǎo)致不可預(yù)料的行為。
- 當(dāng)不作為循環(huán)緩存使用時(shí),確保 DAG(數(shù)據(jù)地址發(fā)生器)的長(zhǎng)度寄存器(Lx)是顯式被初始化為 0。 當(dāng)使用 ICE 下載和執(zhí)行代碼,相關(guān)的癥狀可能沒被注意到,因?yàn)?ICE 會(huì)將長(zhǎng)度寄存器初始化為 0,這樣癥狀只有在作為獨(dú)立系統(tǒng)進(jìn)行引導(dǎo)裝載和執(zhí)行時(shí)才被發(fā)現(xiàn)。
- 查找特定工具版本(或升級(jí)包)下,VisualDSP++編譯器的已知問題。編譯器可能生成錯(cuò)誤代碼, 導(dǎo)致無法預(yù)料的行為。建議您使用最新版的 VisualDSP++。
最新版 VisualDSP++的發(fā)布記錄放在 Analog Device 網(wǎng)站: www.analog.com/processors/sharc/evaluationDevelopment/crosscore/toolsUpgrades/index.html
同時(shí),舊版本 VisualDSP++的發(fā)布記錄位于: www.analog.com/processors/sharc/evaluationDevelopment/crosscore/toolsUpgrades/archives.html
數(shù)據(jù)丟失
這是關(guān)于使用 SPORT,SPI 或其它串形接口接收數(shù)據(jù)時(shí),丟失開始的幾個(gè)數(shù)據(jù)。這種情況下,確保 從機(jī)總是在主機(jī)開啟之前啟動(dòng)。主機(jī)提供諸如串行時(shí)鐘和幀同步信號(hào),從機(jī)從主機(jī)接收這些信號(hào)。
數(shù)據(jù)損壞
這是關(guān)于使用 SPORT,SPI,鏈接端口等串行鏈路接收數(shù)據(jù)時(shí)發(fā)生數(shù)據(jù)損壞的情況。這種情況下, 確認(rèn)信號(hào)完整性,考慮由于超調(diào)/欠調(diào)以及由于串話或其它噪聲源產(chǎn)生的噪聲毛刺。嘗試在可能的地 方使用內(nèi)部回環(huán)來排除處理器功能性問題。在無限持續(xù)模式下使用示波器查找 SI 問題。在此情況下, 嘗試對(duì)串行時(shí)鐘,幀同步等信號(hào)使用終端(盡可能是串行終端)。有時(shí),盡管在設(shè)計(jì)中有其它功能性建 議彌補(bǔ),還是出現(xiàn)接收通道的漂移/交替的問題
VisualDSP++的小問題
當(dāng)更換(或升級(jí))VisualDSP++版本時(shí),會(huì)出現(xiàn)一些問題。在此情況下,檢查編譯器的差別,已知的工 具問題等。嘗試關(guān)閉代碼優(yōu)化以便進(jìn)一步找到編譯器優(yōu)化相關(guān)的問題。從一開始盡可能使用最新的 VisualDSP++版本/升級(jí)版。 |