嵌入式處理器MPC8250與CF卡的接口設計

發(fā)布時(shí)間:2010-11-16 15:49    發(fā)布者:eetech
關(guān)鍵詞: CF卡 , MPC8250 , 處理器 , 接口設計 , 嵌入式
從如何設計嵌入式處理器與CF卡之間的接口、如何高效率地編制讀寫(xiě)程序出發(fā),介紹了嵌入式處理器與CF卡的接口設計和編程技巧。

最近幾年,嵌入式處理器蓬勃發(fā)展,在通信、航空航天、醫療設備、消費類(lèi)電子產(chǎn)品等領(lǐng)域一展身手。嵌入式處理器的外圍設備也日新月異,例如記憶棒、USB口、CF卡等。本文從硬件和軟件角度出發(fā),介紹了CF卡在嵌入式系統中的設計和使用技巧。  

由于CF卡具有攜帶方便、易于升級、存儲量大、抗震性好等優(yōu)點(diǎn),應用范圍越來(lái)越廣。1995年10月,SanDisk、柯達、卡西歐、惠普、摩托羅拉、佳能等125家廠(chǎng)商發(fā)起成立了CompactFlash協(xié)會(huì ),致力于制定新一代的基于RAM和ROM技術(shù)的固態(tài)非易失的存儲介質(zhì)標準——CF卡標準?使不同廠(chǎng)家開(kāi)發(fā)的CF卡及其接口器件可以互相兼容。目前,CF卡標準已有1.4版本,容量從最早的2M字節到現今的1G字節。  

同時(shí),CF卡遵從ATA-IDE工業(yè)設計標準,連接裝置與 PCMCIA卡相似,只不過(guò)CF卡是50引腳(PCMCIA卡68引腳),可以很容易插入無(wú)源68引腳 TypeII適配卡并完全符合PCMCIA電力和機械接口規格。另外,CF卡的兼容性佳,不僅同時(shí)支持3.3V和5V的電壓,而且不同的CF卡都可以用單一的機構讀寫(xiě),特別是CF卡升級換代時(shí)也可以保證舊設備的兼容性。而純電子運動(dòng)的CF卡耗電量很低,僅為IBM微型硬盤(pán)的5%。





1 系統設計  

圖1是筆者開(kāi)發(fā)的嵌入式系統框圖。其中,嵌入式處理器是MPC8250,PCI1410A是連接PCI總線(xiàn)和CF卡的一種接口芯片。  

MPC8250芯片是Motorola公司開(kāi)發(fā)的一款PowerPC系列嵌入式處理器。芯片采用小巧而強大的32位超標量體系結構PowerPC 603e處理器內核,最高主頻為300MHz。它集成了PCI橋、CI仲裁器、存儲器控制器、中斷控制器、DMA控制器、16K字節指令高速緩存和16K字節數據高速緩存等部件。MPC8250具有三個(gè)可配置為百兆或十兆以太網(wǎng)的FCC口,四個(gè)可配置為串口或網(wǎng)口的SCC口,一個(gè)多通道HDLC接口。該芯片適用于對成本、空間、功耗和性能都有很高要求的應用領(lǐng)域,例如路由器/接線(xiàn)器、多路MODEM、網(wǎng)絡(luò )存儲應用和圖像顯示等系統。  

PCI1410A芯片是TI公司開(kāi)發(fā)的一種高性能的PCI到CF卡的控制器,支持遵循CF卡標準的各類(lèi)CF卡。它符合PCI總線(xiàn)標準,既可以工作于PCI主設備模式,也可以工作于PCI從設備模式。  

MPC8250與PCI1410A之間通過(guò)32位PCI局部總線(xiàn)連接,工作頻率33MHz。MPC8250用作PCI主設備,PCI1410A用作PCI從設備,同時(shí)采用MPC8250內部的PCI仲裁器。  

本設計選用SanDisk公司的型號為SDCFB-64-101的CF卡,64M字節容量,幾何尺寸為36.4mm%26;#215;42.8mm%26;#215;3mm。CI1410A與CF卡之間的連接遵循CF卡標準,由地址、數據、控制三組信號組成。CI1410A提供了五個(gè)通用I/O引腳,設計中將其中一個(gè)引腳GPIO1用作LED指示。當CF卡工作時(shí),LED會(huì )以64ms的周期閃爍。  

SDRAM選用了三星公司的K4S561632A,每片容量256M比特,共四片。

圖2 讀寫(xiě)CF卡技巧示意圖

2 接口編程  

在CF卡工作前,必須先進(jìn)行初始化,在整個(gè)系統的地址空間中確定CF卡的位置,預設置CF卡的工作模式及相關(guān)寄存器。本設計中,CF卡位于系統的0x9A000000~0x9DFFFFFF地址空間。在每次讀寫(xiě)CF卡時(shí),必須根據讀寫(xiě)數據的多少和操作特性來(lái)配置相應寄存器。  

2.1 CF卡初始化  

本系統中,CF卡的初始化由MPC8250通過(guò)PCI總線(xiàn)配置PCI1410A的寄存器實(shí)現,具體步驟如下:  

(1)設置CF卡的基地址,即配置ExCA寄存器(偏移量:0x10)。該寄存器定義了CF卡在PCI存儲器空間的基地址,即0x9A000000。  
(2)配置PCI命令寄存器(偏移量:0x04),允許CPU訪(fǎng)問(wèn)PCI存儲空間。  
(3)配置系統控制寄存器(偏移量:0x80)。該寄存器定義了一些系統控制位,例如,是否采用PCI中斷方式,是否采用內部振蕩器,是否采用DMA等。本設計采用PCI中斷方式,不采用內部振蕩器和DMA。



  
(4)配置多功能引腳寄存器(偏移量:0x8C)。該寄存器配置通用引腳。本設計配置GPIO1引腳為L(cháng)ED指示,GPIO2引腳為PCI中斷輸出。  
(5)配置設備控制寄存器(偏移量:0x92)。該寄存器選擇中斷方式,是并行PCI中斷還是串行PCI中斷。本設計選擇了傳統的并行PCI中斷方式。  
(6)配置ExCA電壓控制寄存器(偏移量:0x802),選擇Vcc為3.3V還是5V。本設計選擇Vcc為3.3V。  
(7)配置ExCA存儲窗口0起始地址低位寄存器(偏移量:0x810),即起始地址的A19~A12位。CI1410A具有五個(gè)存儲地址翻譯窗口和二個(gè)I/O地址翻譯窗口,用于配置CF卡內寄存器的訪(fǎng)問(wèn)地址,將CF卡的寄存器映射到系統的存儲空間或I/O空間,MPC8250訪(fǎng)問(wèn)這些寄存器就相當于訪(fǎng)問(wèn)一段存儲空間或I/O空間。本設計中只使用了存儲地址翻譯窗口0。  
(8)配置ExCA存儲窗口0起始地址高位寄存器(偏移量:0x811),即起始地址的A23~A20位。  
(9)配置ExCA存儲窗口0結束地址低位寄存器(偏移量:0x812),即結束地址的A19~A12位。  
(10)配置ExCA存儲窗口0結束地址高位寄存器(偏移量:0x813),即結束地址的A23~A20位。  
(11)配置ExCA存儲窗口0地址比較寄存器(偏移量:0x840)。在系統訪(fǎng)問(wèn)CF卡時(shí),如果地址的高8位與該寄存器數值相同,則允許訪(fǎng)問(wèn),系統將該地址翻譯到相應的CF卡空間;否則,拒之門(mén)外。  
(12)配置ExCA存儲窗口使能寄存器(偏移量:0x806)。該寄存器可以分別打開(kāi)或關(guān)閉五個(gè)存儲地址翻譯窗口和二個(gè)I/O地址翻譯窗口,因為每個(gè)窗口對應了寄存器中的一個(gè)使能位。芯片的默認值都是關(guān)閉的。在本設計中,打開(kāi)存儲地址翻譯窗口0。切記在初始化的收官階段打開(kāi)翻譯窗口使能位,以免功虧一簣。  

2.2 讀寫(xiě)CF卡技巧  

由于CF卡本身的特點(diǎn),CF卡由ATA控制器和Flash存儲器兩部分構成。系統訪(fǎng)問(wèn)Flash存儲器的速度遠遠小于訪(fǎng)問(wèn)內存的速度。如果系統頻繁訪(fǎng)問(wèn)CF卡,勢必影響系統的實(shí)時(shí)性和工作效率。所以必須考慮CF卡讀寫(xiě)程序的設計技巧。  

根據存儲器訪(fǎng)問(wèn)的局部性原理,CPU存取數據所訪(fǎng)問(wèn)的存儲單元都趨向于聚集在一個(gè)較小的連續區域。從時(shí)間上看,如果一個(gè)信息項正在被訪(fǎng)問(wèn),那么在近期它很可能還會(huì )被再次訪(fǎng)問(wèn)。從空間上看,在最近將用到的信息很可能與目前正在使用的信息在空間地址上是臨近的。  

本系統的程序設計中,開(kāi)辟了一個(gè)扇區的內存空間tempSect,用于存儲最近訪(fǎng)問(wèn)過(guò)的扇區數據;并設置了兩個(gè)全局變量:SaveSectorNum和SectorDirty。SaveSectorNum保存最近備份的扇區編號。SectorDirty說(shuō)明備份數據是否與CF卡中的相應數據一致。如果一致,為“0”;否則為“1”。這樣不但可以減少讀寫(xiě)CF卡的次數,而且提高了訪(fǎng)問(wèn)速度,滿(mǎn)足嵌入式操作系統的實(shí)時(shí)性要求。  

同時(shí),CF卡的物理結構也有利于以扇區為單元進(jìn)行操作。因為CF卡內部的Flash存儲器由若干個(gè)扇區組成,而且CF卡中設置了專(zhuān)門(mén)針對扇區操作的寄存器。  

所以,本設計中,無(wú)論是讀一段數據,還是寫(xiě)一段數據,都以扇區為基本單位。如果數據量在一個(gè)扇區內,并且地址范圍在同一扇區,則先讀取所在扇區的數據,然后按照在扇區中的偏移量獲得所需數據;如果數據量大于一個(gè)扇區,或者地址范圍橫跨兩個(gè)扇區,則按次讀取扇區,獲得所需數據。操作流程如圖2所示。  

系統初始化時(shí),設置SaveSectorNum為“0”, tempSect中備份了0號扇區的數據;SectorDirty也為“0”,即備份數據未作更改。  

當讀取一個(gè)扇區的數據時(shí),首先比較所讀取的扇區號(CurrSectorNum),是否與備份數據的扇區號(SaveSectorNum)一致,如果一致,則從備份數據中讀取,加快了訪(fǎng)問(wèn)速度;否則,判斷備份數據是否更改,即SectorDirty是否為“1”;如果不是,則從CF卡中讀取扇區號為CurrSectorNum的數據到tempSect中;否則,先把tempSect的數據寫(xiě)回CF卡,然后從CF卡中讀取扇區號為CurrSectorNum的數據到tempSect中。最后,設置備份數據扇區號SaveSectorNum為當前數據的扇區號CurrSectorNum,設置SectorDirty為“0”,并從備份數據中讀取所需數據。



  
當寫(xiě)入一個(gè)扇區的數據時(shí),首先比較所寫(xiě)入的扇區號(CurrSectorNum),是否與備份數據的扇區號(SaveSectorNum)一致,如果一致,則把數據寫(xiě)入備份數據中,并且設置SectorDirty為“1”;否則,判斷備份數據是否更改,即SectorDirty是否為“1”;如果不是,則從CF卡中讀取扇區號為CurrSectorNum的數據到tempSect中;否則,先把tempSect的數據寫(xiě)回CF卡,然后從CF卡中讀取扇區號為CurrSectorNum的數據到tempSect中。最后,設置備份數據扇區號SaveSectorNum為當前數據的扇區號CurrSectorNum,將指定數據寫(xiě)到備份數據中,并且設置SectorDirty為“1”。  

2.3 讀寫(xiě)數據的相關(guān)寄存器  

根據CF卡標準,不能直接訪(fǎng)問(wèn)CF卡的數據區域,而需要通過(guò)訪(fǎng)問(wèn)CF卡內的相關(guān)寄存器(這些寄存器的基地址在CF卡初始化時(shí)配置,見(jiàn)2.1節)間接讀取或者寫(xiě)入數據。在訪(fǎng)問(wèn)CF卡時(shí)必須對它們進(jìn)行正確配置:  

(1)扇區數目寄存器(Sector_CNT Register)  
讀寫(xiě)操作時(shí),保存需要傳送的扇區數目。如果為0,則選擇256個(gè)扇區;如果操作成功,操作結束時(shí)此寄存器為0;如果操作不成功,此寄存器包含了有待完成的扇區數目。  
(2)磁頭寄存器(Select_HEAD Register)  
其中包含了LBA位(1比特),用于設置地址訪(fǎng)問(wèn)方式。“1”?LBA_Mode 為邏輯地址訪(fǎng)問(wèn)方式,“0”為柱面/磁頭/扇區訪(fǎng)問(wèn)方式。本系統選擇邏輯地址訪(fǎng)問(wèn)方式,則該寄存器還包含了邏輯地址的24~27位。  
(3)扇區編號寄存器(Sector_NUM Register)  
在采用邏輯地址訪(fǎng)問(wèn)方式時(shí),該寄存器包含了邏輯地址的0~7位。  
(4)柱面低位寄存器(Cylinder_LO Register)  
在采用邏輯地址訪(fǎng)問(wèn)方式時(shí),該寄存器包含了邏輯地址的8~15位。  
(5)柱面高位寄存器(Cylinder_HI Register)  
在采用邏輯地址訪(fǎng)問(wèn)方式時(shí),該寄存器包含了邏輯地址的16~23位。  
(6)狀態(tài)寄存器(Status Register)  
反映了CF卡的狀態(tài),其中包含了CF卡忙(Busy)位、出錯位(Err)、是否準備就緒位(Rdy)等。  
(7)數據寄存器(Data Register)  
存放讀寫(xiě)數據,是一個(gè)16位寄存器。  

2.4 讀數據  

從CF卡讀取一個(gè)扇區的數據,如圖3所示。因為系統采用的CF卡的扇區大小為:SectorSize = 512字節,假設讀寫(xiě)數據的地址為Addr,則該地址所在的扇區號為:  
Sector = Addr % SectorSize。  
首先配置寄存器,設置讀取的扇區數目、相應地址和訪(fǎng)問(wèn)模式;然后發(fā)送讀命令(0x20),等待CF卡空閑且準備就緒,再從數據寄存器中連續讀取一個(gè)扇區的數據;完成讀取后,等待CF卡空閑;程序返回。  

2.5 寫(xiě)數據  

將數據寫(xiě)入CF卡的操作與從CF卡讀取數據的操作類(lèi)似,如圖4所示。首先配置寄存器,設置寫(xiě)入的扇區數目、相應地址和訪(fǎng)問(wèn)模式;然后發(fā)送寫(xiě)命令(0x30),等待CF卡空閑并且處于準備狀態(tài),連續向數據寄存器寫(xiě)入一個(gè)扇區的數據;完成寫(xiě)入后,等待CF卡空閑,程序返回。  

本設計采用的操作系統是μC/OS——一個(gè)源代碼完全公開(kāi)的嵌入式操作系統。所有讀寫(xiě)CF卡的函數都用C語(yǔ)言編制,并能在系統中有效工作。
本文地址:http://selenalain.com/thread-39765-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页