文章目錄
1、存儲(chǔ)芯片分類(lèi)
2、NOR Flash 與NAND Flash的區(qū)別
3、什么是SD卡?
4、什么是SD NAND?
5、SD NAND的控制時(shí)序
6、FPGA實(shí)現(xiàn)SD NAND讀寫(xiě)
6.1、設(shè)計(jì)思路
6.2、仿真結(jié)果
6.3、實(shí)驗(yàn)結(jié)果
1、存儲(chǔ)芯片分類(lèi)
目前市面上的存儲(chǔ)芯片,大致可以將其分為3大類(lèi):
① EEPROM
EEPROM (Electrically Erasable Programmable read only memory)是指帶電可擦可編程只讀存儲(chǔ)器,是一種掉電后數(shù)據(jù)不丟失的存儲(chǔ)芯片。EEPROM 可以在電腦上或?qū)S迷O(shè)備上擦除已有信息,重新編程。
這類(lèi)產(chǎn)品容量小,讀取速度慢,且無(wú)法在應(yīng)用過(guò)程中寫(xiě)入數(shù)據(jù),十分不便。目前多存在于一些MCU內(nèi)部,如遙控器,電風(fēng)扇等各類(lèi)低端、低速消費(fèi)類(lèi)產(chǎn)品。相信你讀大學(xué)如果玩單片機(jī)的話(huà),那么應(yīng)該是不陌生。
② NOR Flash
NOR Flash由Intel在1988年發(fā)明,是市場(chǎng)上兩種主要的非易失閃存技術(shù)之一。NOR Flash 技術(shù)的出現(xiàn),徹底改變了原先由EPROM和EEPROM一統(tǒng)天下的局面。
NOR Flash可能是目前應(yīng)用領(lǐng)域最廣泛的一種存儲(chǔ)芯片了,基本上主流的電子產(chǎn)品里都有使用,比如手機(jī)攝像頭內(nèi)部,或者屏幕驅(qū)動(dòng)電路板。主要用來(lái)存儲(chǔ)代碼和一些比較小的數(shù)據(jù)文件。NOR Flash架構(gòu)決定了它的容量不能做大,而且讀取速度比較慢。好處在于簡(jiǎn)單易用,其接口可以實(shí)現(xiàn)地址尋址,也就意味著可以做到直接對(duì)某個(gè)地址直接操作,而不需要建立額外的文件系統(tǒng)。
③ NAND Flash
雖然很多人平常說(shuō)的Flash 存儲(chǔ)器一半默認(rèn)其就是NOR Flash ,但這無(wú)疑是不嚴(yán)謹(jǐn)?shù)摹LASH產(chǎn)品可以分為兩個(gè)大類(lèi):NOR Flash 和 NAND Flash 。
NAND Flash 是市場(chǎng)上兩種主要的非易失閃存技術(shù)之一,由東芝公司在1989年發(fā)明。其強(qiáng)調(diào)降低每比特的成本,并擁有更高的性能,可以像磁盤(pán)一樣可以通過(guò)接口輕松升級(jí)。
NAND Flash應(yīng)該是目前最熱門(mén)的存儲(chǔ)芯片了。因?yàn)槲覀兩钪薪?jīng)常使用的電子產(chǎn)品都會(huì)涉及到它。比如你買(mǎi)手機(jī),肯定會(huì)考慮64GB,還是256GB?買(mǎi)筆記本是買(mǎi)256GB,還是512GB容量的硬盤(pán)呢?(目前電腦大部分采用了基于NAND Flash產(chǎn)品的固態(tài)硬盤(pán))
2、NOR Flash 與 NAND Flash的區(qū)別
Flash 閃存是非易失存儲(chǔ)器,可以對(duì)稱(chēng)為塊的存儲(chǔ)器單元塊進(jìn)行擦寫(xiě)和再編程。任何Flash 器件的寫(xiě)入操作都只能在空或已擦除的單元內(nèi)進(jìn)行,所以大多數(shù)情況下,在進(jìn)行寫(xiě)入操作之前必須先執(zhí)行擦除。NAND器件執(zhí)行擦除操作是十分簡(jiǎn)單的,而NOR則要求在進(jìn)行擦除前先要將目標(biāo)塊內(nèi)所有的位都寫(xiě)為0。
執(zhí)行擦除時(shí)塊尺寸的不同進(jìn)一步拉大了NOR和NAND之間的性能差距,統(tǒng)計(jì)表明,對(duì)于給定的一套寫(xiě)入操作(尤其是更新小文件時(shí)),更多的擦除操作必須在基于NOR的單元中進(jìn)行。這樣,當(dāng)選擇存儲(chǔ)解決方案時(shí),用戶(hù)必須權(quán)衡以下因素:
NOR Flash支持隨機(jī)訪(fǎng)問(wèn),所以支持XIP(execute In Place),NAND Flash需要按塊進(jìn)行讀取,所以不支持XIP
NAND FLASH理論讀取速度與NOR Flash相近,實(shí)際情況會(huì)根據(jù)接口不同有些差異
NOR 與 NAND 寫(xiě)入前都需要先擦除,NOR在擦除時(shí)以64~128KB的塊進(jìn)行,執(zhí)行一個(gè)寫(xiě)入/擦除操作的時(shí)間約5s,NAND在擦除時(shí)以8~32KB的塊進(jìn)行,執(zhí)行一個(gè)寫(xiě)入/擦除操作的時(shí)間約4ms
NAND 理論最大擦除次數(shù)比NOR多
NOR 驅(qū)動(dòng)比NAND簡(jiǎn)單,NAND FLASH需要通過(guò)專(zhuān)門(mén)的NFI(NAND FLASH Interface)與Host端進(jìn)行通信,驅(qū)動(dòng)相對(duì)復(fù)雜
所有Flash 都會(huì)有位反轉(zhuǎn)的問(wèn)題,NAND 位反轉(zhuǎn)概率要比NOR高,NAND Flash 必須要使用ECC
NAND的單元尺寸幾乎是NOR器件的一半,所以NAND成本更低
NOR 與 NAND 各有特點(diǎn),應(yīng)用場(chǎng)景與應(yīng)用難度也不同,一般來(lái)講,NOR適用于小容量、略低速且需要直接對(duì)地址塊進(jìn)行操作的應(yīng)用,而NADN則適用于大容量的高速應(yīng)用。SD NAND 在保留了NAND架構(gòu)優(yōu)質(zhì)特性的同時(shí)改進(jìn)了不足之處,內(nèi)置的控制器能自行管理NAND Flash,無(wú)需在外部處理ECC和進(jìn)行壞塊管理,免去了MTD層,不需要寫(xiě)繁瑣的驅(qū)動(dòng)代碼。
3、什么是SD卡?
①概述
SD卡的英文全稱(chēng)是Secure Digital Card,即安全數(shù)字卡(又叫安全數(shù)碼卡),是在MMC 卡(Multimedia Card,多媒體卡)的基礎(chǔ)上發(fā)展而來(lái),主要增加了兩個(gè)特色:更高的安全性和更快的讀寫(xiě)速度。
②容量標(biāo)準(zhǔn)和速度等級(jí)
若按照容量 對(duì) SD 卡進(jìn)行等級(jí)劃分,SD 卡可分為 4 個(gè)等級(jí),SD(Secure Digital Card,安全數(shù)字卡) 卡、SDHC 卡(Secure Digital High Capacity,高容量安全數(shù)字卡)、SDXC 卡( SD eXtended Capacity,容量擴(kuò)大化的安全數(shù)字卡)和 SDUC(Secure Digital Ultra Capacity,超 容量安全數(shù)字卡)?,F(xiàn)今,市場(chǎng)的主流 SD 產(chǎn)品是 SDHC 和 SDXC 這兩種較大容量的存儲(chǔ) 卡,SD 卡因容量過(guò)小,已逐漸被市場(chǎng)淘汰,SDUC 則是容量太大,預(yù)計(jì)會(huì)出現(xiàn)在未來(lái)市 場(chǎng)。SD 卡的四種容量標(biāo)準(zhǔn),具體見(jiàn)下圖:
不同品牌和廠(chǎng)商生產(chǎn)的 SD 卡在對(duì)存取速度上的定義標(biāo)準(zhǔn)不同,這會(huì)使用戶(hù)在選擇 SD卡時(shí)產(chǎn)生困擾。所以 SD 協(xié)會(huì)根據(jù)視頻勻速寫(xiě)入到 SD 卡的最低持續(xù)速度來(lái)劃分不同等級(jí), 每個(gè)等級(jí)的速率是以每秒傳輸多少 MB 來(lái)衡量的,單位為 MB/S。
SD 協(xié)會(huì)定義了三種速度等級(jí):速度等級(jí)、UHS 速度等級(jí)與視頻速度等級(jí)。三種速度等級(jí)的具體傳輸速度如下圖:
4、什么是SD NAND?
上文中提到的SD卡其實(shí)更應(yīng)該叫做TF卡,在日常生活中最常見(jiàn)的應(yīng)用就是數(shù)碼相機(jī)的存儲(chǔ)卡。因?yàn)樗强刹鹦兜?,所以這類(lèi)SD卡最大的優(yōu)點(diǎn)就是便攜方便,但同時(shí)也有容易丟失和接觸不良等毛病,所以多用于消費(fèi)類(lèi)產(chǎn)品。
在工業(yè)級(jí)應(yīng)用中,更多見(jiàn)的是一類(lèi)貼片式的SD NAND產(chǎn)品,俗稱(chēng)貼片式T卡或貼片式SD卡。雖然SD NAND 和TF卡稱(chēng)呼上有些類(lèi)似,但是SD NAND和TF卡有著本質(zhì)上的區(qū)別:
為什么SD NAND和 TF卡 之間有這么大區(qū)別呢?因?yàn)?SD NAND是為內(nèi)置存儲(chǔ)而生,是焊接在PCB板上的,是針對(duì)工業(yè)級(jí)應(yīng)用的產(chǎn)品,所以品質(zhì)穩(wěn)定、一致性高、使用穩(wěn)定性高、同時(shí)尺寸也小。而TF卡主要是針對(duì)普通消費(fèi)者,品質(zhì)和一致性、使用穩(wěn)定性等相對(duì)要求不高,再加上國(guó)內(nèi)魚(yú)龍混雜的市場(chǎng)環(huán)境,導(dǎo)致內(nèi)置存儲(chǔ)用TF卡的品質(zhì)風(fēng)險(xiǎn)高。
NAND Flash產(chǎn)品的一個(gè)特質(zhì)就是它的品質(zhì)并不是0和1這么簡(jiǎn)單,有些品質(zhì)隱患是使用一段時(shí)間之后才被發(fā)現(xiàn),如果這個(gè)產(chǎn)品已經(jīng)銷(xiāo)往海外,處理起來(lái)會(huì)變得異常麻煩。使用SD NAND可以為客戶(hù)產(chǎn)品帶來(lái)整體品質(zhì)的提升,提供確定性,是客戶(hù)產(chǎn)品良好品牌和口碑的穩(wěn)定基石。而使用TF卡時(shí),產(chǎn)品整機(jī)不可控因素會(huì)增高,比如常見(jiàn)的卡座老化松動(dòng)、TF觸點(diǎn)氧化、TF卡遺失、抗震性能減退等等。綜上所述,雖然SD NAND與TF卡使用的協(xié)議相同,但從外觀(guān)到內(nèi)在都有區(qū)別。正在使用TF卡的客戶(hù)需要提升產(chǎn)品穩(wěn)定性及耐用性時(shí),SD NAND 是絕佳選擇。
盡管 SD NAND和 TF卡之間有著這么大的區(qū)別,但具體到實(shí)際應(yīng)用,其對(duì)外接口和驅(qū)動(dòng)程序都是一樣了,這說(shuō)明可移植性非常好。
① 物理結(jié)構(gòu)
SD NAND從物理結(jié)構(gòu)看包括 5 個(gè)部分,分別為存儲(chǔ)單元、存儲(chǔ)單元接口、電源檢測(cè)、卡及接口控制器和對(duì)外接口,具體見(jiàn)下圖。
存儲(chǔ)單元是存儲(chǔ)數(shù)據(jù)部件,存儲(chǔ)單元通過(guò)存儲(chǔ)單元接口與卡控制單元進(jìn)行數(shù)據(jù)傳輸
存儲(chǔ)單元接口是接口控制器與存儲(chǔ)單元的數(shù)據(jù)交互通道
電源檢測(cè)單元保證 SD NAND工作在合適的電壓下,如出現(xiàn)掉電或上電狀態(tài)時(shí),它會(huì)使控制單元和存儲(chǔ)單元接口復(fù)位
卡及接口控制單元控制 SDNAND的運(yùn)行狀態(tài),它包括 8 個(gè)寄存器
對(duì)外接口單元控制 SD NAND引腳的輸入輸出,一般包含SDIO接口和SPI接口
② 對(duì)外接口
SD NAND共有 9 個(gè)引腳,其中包括 3 根電源線(xiàn)、1 根時(shí)鐘線(xiàn)、1 根命令線(xiàn)和 4根數(shù)據(jù)線(xiàn)。如下:
CLK:同步時(shí)鐘線(xiàn),由主機(jī)產(chǎn)生,即由主控制器(FPGA)輸出; 使用 SPI 模式 時(shí),該引腳與 SPI 總線(xiàn)的 SCK 時(shí)鐘信號(hào)相連
CMD:命令控制線(xiàn), SDIO 主機(jī)通過(guò)該線(xiàn)發(fā)送命令控制 SD NAND,如果命令要求 SD NAND 提供應(yīng)答(響應(yīng)), SD NAND也是通過(guò)該線(xiàn)傳輸應(yīng)答信息; 使用 SPI 模式時(shí),該引腳與 SPI總線(xiàn)的 MOSI 信號(hào)相連, SPI 主機(jī)通過(guò)它向 SD NAND發(fā)送命令及數(shù)據(jù),但因?yàn)?SPI 總線(xiàn) 的 MOSI 僅用于主機(jī)向從機(jī)輸出信號(hào),所以 SD NAND返回應(yīng)答信息時(shí)不使用該信號(hào)線(xiàn);
DAT0-3:在 SDIO 模式下,它們均為數(shù)據(jù)線(xiàn),傳輸讀寫(xiě)數(shù)據(jù), SD NAND可將 D0 拉低表 示忙狀態(tài); 在 SPI 模式下, DAT0 與 SPI 總線(xiàn)的 MISO 信號(hào)相連, SD NAND通過(guò)該信號(hào)線(xiàn)向主機(jī)發(fā)送數(shù)據(jù)或響應(yīng), DAT3 與總線(xiàn)的 CS 信號(hào)相連, SPI 主機(jī)通過(guò)該信號(hào)線(xiàn)選擇要通訊的 SD NAND。
VDD、VSS1、VSS2:電源和地信號(hào)。
③ 工作模式
SD NAND有兩種工作模式:SDIO 模式與SPI模式
在 SDIO 模式下,SD NAND共使用到 CLK、CMD、DAT[3:0] 6根信號(hào)線(xiàn);SDIO 總線(xiàn)與多個(gè) SD NAND連接時(shí),可以共用 CLK 時(shí)鐘信號(hào)線(xiàn),對(duì)于 CMD、DAT[3:0]信號(hào)線(xiàn),每個(gè) SD NAND都要獨(dú)立連接。SDIO 總線(xiàn)與 SD 卡連接方式,具體見(jiàn)下圖。此模式使用IO引腳多,但傳輸速度高。
在 SPI 模式下,SD NAND共使用到 CS(DAT[3])、CLK、MISO(DAT[0])、MOSI(CMD) 4根信號(hào)線(xiàn);SPI 總線(xiàn)與多個(gè) SD NAND連接時(shí),除 CS 片選信號(hào)線(xiàn)不可共用外,其他信號(hào)均可公用。SPI 總線(xiàn)與 SD NAND連方式,具體見(jiàn)下圖。此模式使用IO引腳少,但傳輸速度慢。
④ 內(nèi)部寄存器
SD NAND總共有 8 個(gè)寄存器,用于設(shè)定或表示 SD NAND信息,寄存器描述具體見(jiàn)下圖。 這些寄存器只能通過(guò)對(duì)應(yīng)的命令訪(fǎng)問(wèn),對(duì) SD NAND的控制操作是通過(guò)命令來(lái)執(zhí)行的, SD NAND定義了 64 個(gè)命令(部分命令不支持 SPI 模式) ,每個(gè)命令都有特殊意義,可以實(shí)現(xiàn)某一特定功能, SD NAND接收到命令后,根據(jù)命令要求對(duì) SD NAND內(nèi)部寄存器進(jìn)行修改,程序控制中只需要發(fā)送組合命令就可以實(shí)現(xiàn) SD NAND的控制以及讀寫(xiě)操作。
內(nèi)部寄存器就不展開(kāi)講了,我們用FPGA實(shí)現(xiàn)讀寫(xiě)測(cè)試也不需要了解那么多寄存器。
5、SD NAND的控制時(shí)序
① 命令與讀寫(xiě)時(shí)序
SD NAND的通信是基于命令和數(shù)據(jù)傳輸?shù)?。通訊由一個(gè)起始位(“0”)開(kāi)始,由一個(gè)停止位(“1”)終止。SD NAND通信一般是主機(jī)發(fā)送一個(gè)命令(Command),從設(shè)備在接收到命令后作出響應(yīng)(Response),如有需要會(huì)有數(shù)據(jù)(Data)傳輸參與。SD NAND的基本交互是命令與響應(yīng)交互, 見(jiàn)下圖:
SD NAND數(shù)據(jù)是以塊(Block)形式傳輸?shù)?,SDHC 規(guī)格數(shù)據(jù)塊長(zhǎng)度一般為 512 字節(jié),數(shù)據(jù)可以從主機(jī)到芯片,也可以是從芯片到主機(jī)。數(shù)據(jù)塊需要 CRC 位來(lái)保證數(shù)據(jù)傳輸成功,CRC 位由 SD NAND系統(tǒng)硬件生成。單個(gè)數(shù)據(jù)塊的讀、寫(xiě)時(shí)序分別見(jiàn)下2圖:
讀寫(xiě)操作都是由主機(jī)發(fā)起的,主機(jī)發(fā)送不同的命令表示讀或?qū)懀?SD NAND接收到命令后先針對(duì)命令返回響應(yīng)。在讀操作中, SD NAND返回一個(gè)數(shù)據(jù)塊,數(shù)據(jù)塊中包含 CRC校驗(yàn)碼;在寫(xiě)操作中,主機(jī)接收到命令響應(yīng)后需要先發(fā)送一個(gè)標(biāo)志(TOKEN)然后緊跟一個(gè)要寫(xiě)入的數(shù)據(jù)塊,SD NAND接收完數(shù)據(jù)塊后會(huì)返回一個(gè)數(shù)據(jù)響應(yīng)及忙碌標(biāo)志,當(dāng) SD NAND把接收到的數(shù)據(jù)寫(xiě)入到內(nèi)部存儲(chǔ)單元完成后,會(huì)停止發(fā)送忙碌標(biāo)志,主機(jī)確認(rèn) SD NAND空閑后,才可以發(fā)送下一個(gè)命令。
SD NAND數(shù)據(jù)傳輸支持單塊和多塊讀寫(xiě),它們分別對(duì)應(yīng)不同的操作命令, 結(jié)束多塊讀寫(xiě)時(shí)需要使用命令來(lái)停止操作。
② 命令格式
SD NAND命令由主機(jī)發(fā)出,命令格式固定為 48bit,通過(guò) CMD 信號(hào)線(xiàn)連續(xù)傳輸。SD NAND命令格式,具體見(jiàn)下圖:
起始位和終止位:命令的主體包含在起始位與終止位之間,它們都只包含一個(gè)數(shù)據(jù)位,起始位為 0,終止位為 1。
傳輸標(biāo)志:用于區(qū)分傳輸方向,該位為 1 時(shí)表示命令,方向?yàn)橹鳈C(jī)傳輸?shù)?SD NAND,該位為 0 時(shí)表示響應(yīng),方向?yàn)?SD NAND傳輸?shù)街鳈C(jī)。命令主體內(nèi)容包括命令、地址信息/參數(shù)和 CRC 校驗(yàn)三個(gè)部分。
命令號(hào):它固定占用 6bit,所以總共有 64 個(gè)命令,每個(gè)命令都有特定的用途,部分命令不適用于 SPI 總線(xiàn),或不適用于 SD NAND操作,只是專(zhuān)門(mén)用于 MMC 卡或者 SD I/O卡。
地址/參數(shù):每個(gè)命令有 32bit 地址信息/參數(shù)用于命令附加內(nèi)容,例如,廣播命令沒(méi)有地址信息,這 32bit 用于指定參數(shù),而尋址命令這 32bit 用于指定目標(biāo) SD NAND的地址, 當(dāng)使用 SDIO 驅(qū)動(dòng)多個(gè) SD NAND時(shí),通過(guò)地址信息區(qū)分控制不同的SD NAND,使用 SPI 總線(xiàn)驅(qū)動(dòng)時(shí),通過(guò)片選引腳來(lái)選擇不同的SD NAND,所以使用這些命令時(shí)地址可填充任意值。
CRC7 校驗(yàn):長(zhǎng)度為 7bit 的校驗(yàn)位用于驗(yàn)證命令傳輸內(nèi)容正確性,如果發(fā)生外部干擾 導(dǎo)致傳輸數(shù)據(jù)個(gè)別位狀態(tài)改變將導(dǎo)致校準(zhǔn)失敗,也意味著命令傳輸失敗, SD NAND不執(zhí)行命令。 使用 SDIO 驅(qū)動(dòng)時(shí),命令中必須包含正確的 CRC7 校驗(yàn)值;而使用 SPI 驅(qū)動(dòng)時(shí),命令中的 CRC7 校驗(yàn)?zāi)J(rèn)是關(guān)閉的,即這 CRC7 校驗(yàn)位中可以寫(xiě)入任意值而不影響通訊,僅在發(fā)送 CMD0 命令時(shí)需要強(qiáng)制帶標(biāo)準(zhǔn)的 CRC7 校驗(yàn)。
③ 命令內(nèi)容
SD NAND命令可分為標(biāo)準(zhǔn)命令 (如 CMD0)和特殊應(yīng)用命令 (如 ACMD41),其中特殊應(yīng)用命令只有在先寫(xiě)入 CMD55 命令后才能被識(shí)別。按照指令類(lèi)型又可將 SD NAND命令分為基本命令、數(shù)據(jù)塊寫(xiě)命令、數(shù)據(jù)塊讀命令、擦除命令等 12 種(class0 ~ class11)。
本次實(shí)驗(yàn)將會(huì)使用 SPI 模式實(shí)現(xiàn) SD NAND的數(shù)據(jù)讀寫(xiě)操作,所以接下來(lái)只列舉 SPI 模式下常用的 SD 卡命令,具體見(jiàn)下表:
SPI 模式下,上述各命令中,命令 CMD0 的 CRC7 校驗(yàn)為固定的 1001_010;命令CMD8 的 CRC7 校驗(yàn)為固定的 1000_011;其他命令的 CRC7 校驗(yàn)在 SPI 模式下無(wú)作用,賦值為 1111_111 即可。
④ 響應(yīng)格式
當(dāng) SD NAND接收到命令時(shí),會(huì)向 SD NAND回傳命令響應(yīng)。SD NAND有 5 種類(lèi)型的命令響應(yīng):R1、R1b、R2、R3、R7;SDIO NAND還支持另外兩種命令響應(yīng):R4、R5。下文只對(duì)部分響應(yīng)做介紹。
R1 響應(yīng)格式,具體見(jiàn)下圖:
in idle state:當(dāng)該位為 1 時(shí),表示 SD NAND處于空閑狀態(tài)
erase reset:因?yàn)榻邮盏綗o(wú)需擦除操作的命令,擦除操作被復(fù)位
illegal command:接收到一個(gè)無(wú)效的命令代碼
com crc error:接收到的上一個(gè)命令的 CRC 校驗(yàn)錯(cuò)誤
erase sequence error:擦除命令的控制順序錯(cuò)誤
address error:讀寫(xiě)的數(shù)據(jù)地址不對(duì)齊(數(shù)據(jù)地址需要按塊大小對(duì)齊)
parameter error:命令的參數(shù)錯(cuò)誤
R3 響應(yīng)格式,具體見(jiàn)下圖:
R3 響應(yīng)包括 5 個(gè)字節(jié),首先返回的第 1 個(gè)字節(jié)內(nèi)容為 R1,剩下的其余字節(jié)為 OCR( Operation Conditions Register, 操作條件寄存器)寄存器的內(nèi)容。
R7 響應(yīng)格式,具體見(jiàn)下圖:
R7 響應(yīng)包括 5 個(gè)字節(jié),首先返回的第 1 個(gè)字節(jié)內(nèi)容為 R1,R7 [31:28]位為命令版本,R7[27:12]為保留位,R7[11:8]為反饋的電壓范圍,最后 1 個(gè)字節(jié)為檢查模式。
6、FPGA實(shí)現(xiàn)SD NAND讀寫(xiě)
接下來(lái)編寫(xiě)FPGA的Verilog代碼實(shí)現(xiàn)向SD NAND的指定扇區(qū)中寫(xiě)入512個(gè)字節(jié)的數(shù)據(jù),寫(xiě)完后將數(shù)據(jù)讀出,并通過(guò)指示燈的方式驗(yàn)證數(shù)據(jù)是否被正確讀寫(xiě)。需要說(shuō)明的是,后文的讀寫(xiě)操作均采用SPI模式。
6.1、設(shè)計(jì)思路
① 上電時(shí)序
SD NAND同其他的許多芯片一樣上電后需要保持一定的時(shí)間以便維持電壓穩(wěn)定,這個(gè)時(shí)間通常是74+個(gè)時(shí)鐘周期,一般實(shí)際應(yīng)用中可設(shè)置參數(shù)為74~100。只有經(jīng)過(guò)這個(gè)過(guò)渡時(shí)間后,才可以執(zhí)行后續(xù)的SD NAND初始化操作。
② 初始化時(shí)序
SD NAND在正常讀寫(xiě)操作之前,必須先對(duì)SD NAND進(jìn)行初始化,使其工作在預(yù)期的工作模式。初始化流程如下:
1.SD NAND完成上電后,主機(jī)FPGA先對(duì)從機(jī)SD NAND發(fā)送至少74個(gè)以上的同步時(shí)鐘,在上電同步期間,片選CS引腳和MOSI引腳必須為高電平(MOSI引腳除發(fā)送命令或數(shù)據(jù)外,其余時(shí)刻都為高電平);
2.拉低片選CS引腳,發(fā)送命令CMD0(0x40)復(fù)位SD NAND,命令發(fā)送完成后等待SD NAND返回響應(yīng)數(shù)據(jù);
3.SD NAND返回響應(yīng)數(shù)據(jù)后,先等待8個(gè)時(shí)鐘周期再拉高片選CS信號(hào),此時(shí)判斷返回的響應(yīng)數(shù)據(jù)。如果返回的數(shù)據(jù)為復(fù)位完成信號(hào)0x01,在接收返回信息期間片選CS為低電平, 此時(shí)SD NAND進(jìn)入SPI模式,并開(kāi)始進(jìn)行下一步,如果返回的值為其它值,則重新執(zhí)行第2步;
4.拉低片選CS引腳,發(fā)送命令CMD8(0x48)查詢(xún)SD NAND的版本號(hào),只有SD2.0版本才支持此命令,命令發(fā)送完成后等待SD NAND返回響應(yīng)數(shù)據(jù);
5.SD NAND返回響應(yīng)數(shù)據(jù)后,先等待8個(gè)時(shí)鐘周期再拉高片選CS信號(hào),此時(shí)判斷返回的響應(yīng)數(shù)據(jù)。如果返回的電壓范圍為4’b0001即2.7V~3.6V,說(shuō)明2.0版本,進(jìn)行下一步,否則重新執(zhí)行第4步;
6.拉低片選CS引腳,發(fā)送命令CMD55(0x77)告訴SD NAND下一次發(fā)送的命令是應(yīng)用相關(guān)命令,命令發(fā)送完成后等待SD NAND返回響應(yīng)數(shù)據(jù);
7.SD NAND返回響應(yīng)數(shù)據(jù)后,先等待8個(gè)時(shí)鐘周期再拉高片選CS信號(hào),此時(shí)判斷返回的響應(yīng)數(shù)據(jù)。如果返回的數(shù)據(jù)為空閑信號(hào)0x01,開(kāi)始進(jìn)行下一步,否則重新執(zhí)行第6步。
8.拉低片選CS引腳,發(fā)送命令A(yù)CMD41(0x69)查詢(xún)SD NAND是否初始化完成,命令發(fā)送完成后等待SD NAND返回響應(yīng)數(shù)據(jù);
9.SD NAND返回響應(yīng)數(shù)據(jù)后,先等待8個(gè)時(shí)鐘周期再拉高片選CS信號(hào),此時(shí)判斷返回的響應(yīng)數(shù)據(jù)。如果返回的數(shù)據(jù)為0x00,此時(shí)初始化完成,否則重新執(zhí)行第6步。
③ 寫(xiě)操作時(shí)序
至此,SD NAND完成了復(fù)位以及初始化操作,進(jìn)入到SPI模式的讀寫(xiě)操作。SD NAND讀寫(xiě)一次的數(shù)據(jù)量必須為512字節(jié)的整數(shù)倍,即對(duì)SD NAND讀寫(xiě)操作的最少數(shù)據(jù)量為512 個(gè)字節(jié)。我們可以通過(guò)命令CMD16來(lái)配置單次讀寫(xiě)操作的數(shù)據(jù)長(zhǎng)度,以使每次讀寫(xiě)的數(shù)據(jù)量為 (n*512)個(gè)字節(jié)(n≥1),本次SD NAND的讀寫(xiě)操作使用默認(rèn)配置,即單次讀寫(xiě)操作的數(shù)據(jù)量為512個(gè)字節(jié)。
SD NAND的寫(xiě)操作時(shí)序圖如下圖所示:
拉低片選信號(hào) CS_N,向 SD NAND寫(xiě)入命令 CMD24,命令號(hào)為 0x58,攜帶參數(shù)為 4字節(jié)的 SD NAND寫(xiě)扇區(qū)地址,CRC 校驗(yàn)字節(jié)未使用直接寫(xiě)入 0xFF,命令發(fā)送完成后 等待 SD NAND返回響應(yīng)數(shù)據(jù)
若 SD NAND返回正確響應(yīng)數(shù)據(jù) R1 為 0x00,等待 8 個(gè)時(shí)鐘周期,向 SD NAND寫(xiě)入令牌0xFE,緊隨其后寫(xiě)入 512 個(gè)字節(jié)的數(shù)據(jù)
數(shù)據(jù)發(fā)送完成后,再向 SD NAND寫(xiě)入 2 個(gè)字節(jié)的 CRC 校驗(yàn)字節(jié)。SPI 模式下不對(duì)數(shù)據(jù)進(jìn)行 CRC 校驗(yàn),直接寫(xiě)入兩個(gè)字節(jié)的 0xFF
校驗(yàn)數(shù)據(jù)發(fā)送完成后, SD NAND會(huì)有響應(yīng)數(shù)據(jù)返回,隨后 SD NAND將 Miso 信號(hào)拉低進(jìn)入寫(xiě)忙狀態(tài)
MISO 信號(hào)再次拉高后 SD NAND退出寫(xiě)忙狀態(tài),等待 8 個(gè)時(shí)鐘周期后拉高片選信號(hào),SD NAND數(shù)據(jù)寫(xiě)操作完成,可以執(zhí)行其它操作
④ 讀操作時(shí)序
SD NAND的讀操作時(shí)序圖如下圖所示:
1.拉低片選信號(hào) CS_N, 向 SD NAND寫(xiě)入命令 CMD17,命令號(hào)為 0x51,攜帶參數(shù)為 4字節(jié)的 SD NAND讀扇區(qū)地址,CRC 校驗(yàn)字節(jié)未使用直接寫(xiě)入 0xFF,命令發(fā)送完成后 等待 SD NAND返回響應(yīng)數(shù)據(jù)
2.若 SD NAND返回正確響應(yīng)數(shù)據(jù) R1 為 0x00,以 SD NAND返回的數(shù)據(jù)頭 0xFE 為標(biāo)志,接收自 SD NAND讀出的 512 字節(jié)數(shù)據(jù)和 2 字節(jié)的 CRC 校驗(yàn)字節(jié)
3.解析到數(shù)據(jù)頭 0xFE 后,接下來(lái)接收 SD NAND返回的 512 個(gè)字節(jié)的數(shù)據(jù)
4.數(shù)據(jù)解析完成后,接下來(lái)接收2個(gè)字節(jié)的 CRC 校驗(yàn)值。 由于 SPI 模式下不對(duì)數(shù)據(jù)進(jìn)行 CRC 校驗(yàn),可直接忽略這兩個(gè)字節(jié)
5.CRC 校驗(yàn)字節(jié)接收完畢,等待 8 個(gè)時(shí)鐘周期,拉高片選信號(hào) CS_N,一次數(shù)據(jù)讀操作完成
⑤ 程序設(shè)計(jì)
通過(guò)前面介紹的SD NAND初始化、寫(xiě)操作以及讀操作可知,SD NAND的這3個(gè)操作是相互獨(dú)立且不能同時(shí)進(jìn)行的,因此我們可以將SD NAND的初始化、寫(xiě)操作以及讀操作分別劃分為3個(gè)獨(dú)立的模塊,最后將這三個(gè)模塊例化在SD NAND的控制器模塊中,便于在其它工程項(xiàng)目中使用。
下圖是系統(tǒng)框圖,PLL時(shí)鐘模塊(PLL)為各個(gè)模塊提供驅(qū)動(dòng)時(shí)鐘,SD NAND測(cè)試數(shù)據(jù)產(chǎn)生模塊產(chǎn)生測(cè)試數(shù)據(jù)寫(xiě)入SD NAND,寫(xiě)完后從SD NAND中讀出數(shù)據(jù),最終讀寫(xiě)測(cè)試結(jié)果由LED顯示模塊通過(guò)控制LED燈的顯示狀態(tài)來(lái)指示。
頂層模塊:頂層模塊完成了對(duì)其它四個(gè)模塊的例化,SD NAND測(cè)試數(shù)據(jù)產(chǎn)生模塊產(chǎn)生的開(kāi)始寫(xiě)入信號(hào)及數(shù)據(jù)連接至SD NAND控制器模塊,數(shù)據(jù)寫(xiě)完后從SD NAND控制器中讀出數(shù)據(jù), 并驗(yàn)證數(shù)據(jù)的正確性,將驗(yàn)證的結(jié)果連接至LED顯示模塊。
PLL時(shí)鐘模塊:PLL時(shí)鐘模塊通過(guò)調(diào)用鎖相環(huán)(PLL)IP核來(lái)實(shí)現(xiàn),總共輸出2個(gè)時(shí)鐘,頻率都是50Mhz,但兩個(gè)時(shí)鐘相位相差180度。我們知道,SD卡的SPI通信模式為CPOL=1, CPHA=1;即SPI_CLK在空閑時(shí)為高電平,數(shù)據(jù)發(fā)送是在時(shí)鐘的第一個(gè)邊沿,也就是SPI_CLK由高 電平到低電平的跳變,所以數(shù)據(jù)采集是在上升沿,數(shù)據(jù)發(fā)送是在下降沿。為了在程序代碼中統(tǒng) 一使用上升沿,我們使用兩個(gè)相位相差180度的時(shí)鐘來(lái)對(duì)SD NAND進(jìn)行操作。
SD NAND測(cè)試數(shù)據(jù)產(chǎn)生模塊:SD NAND測(cè)試數(shù)據(jù)產(chǎn)生模塊產(chǎn)生的開(kāi)始寫(xiě)入信號(hào)和數(shù)據(jù)寫(xiě)入SD NAND控制器模塊中,數(shù)據(jù)寫(xiě)完后從SD NAND控制器中讀出數(shù)據(jù),并驗(yàn)證數(shù)據(jù)的正確性,將驗(yàn)證的結(jié)果發(fā)送給LED顯示模塊。
SD NAND控制器模塊:SD NAND控制器模塊例化了SD NAND初始化模塊、 SD NAND寫(xiě)數(shù)據(jù)模塊和SD NAND讀數(shù)據(jù)模塊。SD NAND初始化模塊完成對(duì)SD NAND的上電初始化操作;SD NAND寫(xiě)數(shù)據(jù)模塊完成對(duì)SD NAND的寫(xiě)操作;SD NAND讀數(shù)據(jù)模塊完成對(duì)SD NAND的讀操作。 由于這三個(gè)模塊都操作了SD NAND的引腳信號(hào),且這三個(gè)模塊在同一時(shí)間內(nèi)不會(huì)同時(shí)操作,所以此模塊實(shí)現(xiàn)了對(duì)其它三個(gè)模塊的例化以及選擇SD NAND的引腳連接至其中某一個(gè)模塊。
LED顯示模塊:LED顯示模塊將SD NAND測(cè)試數(shù)據(jù)產(chǎn)生模塊輸出的驗(yàn)證結(jié)果值, 通過(guò)控制LED燈的顯示狀態(tài)來(lái)指示。
SD NAND控制器部分代碼如下:
module sd_ctrl_top(
input clk_ref , //時(shí)鐘信號(hào)
input clk_ref_180deg, //時(shí)鐘信號(hào),與clk_ref相位相差180度
input rst_n , //復(fù)位信號(hào),低電平有效
//SD卡接口
input sd_miso , //SD卡SPI串行輸入數(shù)據(jù)信號(hào)
output sd_clk , //SD卡SPI時(shí)鐘信號(hào)
output reg sd_cs , //SD卡SPI片選信號(hào)
output reg sd_mosi , //SD卡SPI串行輸出數(shù)據(jù)信號(hào)
//用戶(hù)寫(xiě)SD卡接口
input wr_start_en , //開(kāi)始寫(xiě)SD卡數(shù)據(jù)信號(hào)
input [31:0] wr_sec_addr , //寫(xiě)數(shù)據(jù)扇區(qū)地址
input [15:0] wr_data , //寫(xiě)數(shù)據(jù)
output wr_busy , //寫(xiě)數(shù)據(jù)忙信號(hào)
output wr_req , //寫(xiě)數(shù)據(jù)請(qǐng)求信號(hào)
//用戶(hù)讀SD卡接口
input rd_start_en , //開(kāi)始讀SD卡數(shù)據(jù)信號(hào)
input [31:0] rd_sec_addr , //讀數(shù)據(jù)扇區(qū)地址
output rd_busy , //讀數(shù)據(jù)忙信號(hào)
output rd_val_en , //讀數(shù)據(jù)有效信號(hào)
output [15:0] rd_val_data , //讀數(shù)據(jù)
output sd_init_done //SD卡初始化完成信號(hào)
);
//wire define
wire init_sd_clk ; //初始化SD卡時(shí)的低速時(shí)鐘
wire init_sd_cs ; //初始化模塊SD片選信號(hào)
wire init_sd_mosi ; //初始化模塊SD數(shù)據(jù)輸出信號(hào)
wire wr_sd_cs ; //寫(xiě)數(shù)據(jù)模塊SD片選信號(hào)
wire wr_sd_mosi ; //寫(xiě)數(shù)據(jù)模塊SD數(shù)據(jù)輸出信號(hào)
wire rd_sd_cs ; //讀數(shù)據(jù)模塊SD片選信號(hào)
wire rd_sd_mosi ; //讀數(shù)據(jù)模塊SD數(shù)據(jù)輸出信號(hào)
//*****************************************************
//** main code
//*****************************************************
//SD卡的SPI_CLK
assign sd_clk = (sd_init_done==1'b0) ? init_sd_clk : clk_ref_180deg;
//SD卡接口信號(hào)選擇
always @(*) begin
//SD卡初始化完成之前,端口信號(hào)和初始化模塊信號(hào)相連
if(sd_init_done == 1'b0) begin
sd_cs = init_sd_cs;
sd_mosi = init_sd_mosi;
end
else if(wr_busy) begin
sd_cs = wr_sd_cs;
sd_mosi = wr_sd_mosi;
end
else if(rd_busy) begin
sd_cs = rd_sd_cs;
sd_mosi = rd_sd_mosi;
end
else begin
sd_cs = 1'b1;
sd_mosi = 1'b1;
end
end
//SD卡初始化
sd_init u_sd_init(
.clk_ref (clk_ref),
.rst_n (rst_n),
.sd_miso (sd_miso),
.sd_clk (init_sd_clk),
.sd_cs (init_sd_cs),
.sd_mosi (init_sd_mosi),
.sd_init_done (sd_init_done)
);
//SD卡寫(xiě)數(shù)據(jù)
sd_write u_sd_write(
.clk_ref (clk_ref),
.clk_ref_180deg (clk_ref_180deg),
.rst_n (rst_n),
.sd_miso (sd_miso),
.sd_cs (wr_sd_cs),
.sd_mosi (wr_sd_mosi),
//SD卡初始化完成之后響應(yīng)寫(xiě)操作
.wr_start_en (wr_start_en & sd_init_done),
.wr_sec_addr (wr_sec_addr),
.wr_data (wr_data),
.wr_busy (wr_busy),
.wr_req (wr_req)
);
//SD卡讀數(shù)據(jù)
sd_read u_sd_read(
.clk_ref (clk_ref),
.clk_ref_180deg (clk_ref_180deg),
.rst_n (rst_n),
.sd_miso (sd_miso),
.sd_cs (rd_sd_cs),
.sd_mosi (rd_sd_mosi),
//SD卡初始化完成之后響應(yīng)讀操作
.rd_start_en (rd_start_en & sd_init_done),
.rd_sec_addr (rd_sec_addr),
.rd_busy (rd_busy),
.rd_val_en (rd_val_en),
.rd_val_data (rd_val_data)
);
endmodule
SD NAND控制器模塊輸出的sd_init_done(SD NAND初始化完成信號(hào))連接至SD NAND測(cè)試數(shù)據(jù)產(chǎn)生模塊,只有在SD NAND初始化完成之后(sd_init_done為高電平),才能對(duì)SD NAND進(jìn)行讀寫(xiě)測(cè)試。SD NAND控制器模塊將SD NAND的初始化以及讀寫(xiě)操作封裝成方便用戶(hù)調(diào)用的接口,SD NAND測(cè)試數(shù)據(jù)產(chǎn)生模塊只需對(duì)SD NAND控制器模塊的用戶(hù)接口進(jìn)行操作即可完成對(duì)SD NAND的讀寫(xiě)操作。
6.2、仿真結(jié)果
一般的測(cè)試中,我們都需要先進(jìn)行仿真來(lái)觀(guān)察時(shí)序等測(cè)試行為。此次實(shí)驗(yàn)由于找不到好的SD NAND的Verilog模型,所以仿真測(cè)試略。
6.3、實(shí)驗(yàn)結(jié)果
上文已經(jīng)說(shuō)了常用的相機(jī)中的TF卡與工業(yè)級(jí)的SD NAND(貼片式T卡)的區(qū)別,所以本次實(shí)驗(yàn)我選用的是深圳雷龍公司的一款SD NAND產(chǎn)品----CSNP32GCR01-AOW。
這是一家專(zhuān)業(yè)做存儲(chǔ)產(chǎn)品的公司,NAND Flash是其主要產(chǎn)品。 該公司專(zhuān)注NAND Flash設(shè)計(jì)研發(fā)13年,在這一塊可以說(shuō)是相當(dāng)專(zhuān)業(yè)。如果你對(duì)NAND Flash仍有疑惑的問(wèn)題,或者你想在你的設(shè)計(jì)中使用NAND Flash產(chǎn)品,都可以直接聯(lián)系:深圳市雷龍發(fā)展有限公司
實(shí)驗(yàn)結(jié)果其實(shí)沒(méi)什么好看的,LED燈常量表明說(shuō)明從SD NAND讀出的512個(gè)字節(jié)(256個(gè)16位數(shù)據(jù)) 與寫(xiě)入的數(shù)據(jù)相同,SD NAND讀寫(xiě)測(cè)試程序下載驗(yàn)證成功。
PS:有個(gè)小細(xì)節(jié)可以說(shuō)下,雷龍公司的SD NAND開(kāi)發(fā)板還是蠻用心的,封裝都是標(biāo)準(zhǔn)的Micro SD的封裝,只要你的FPGA開(kāi)發(fā)板上有SD卡座,就可以直接插上使用了,即插即用十分方便,有心了。
【本文轉(zhuǎn)載自CSDN,作者:孤獨(dú)的單刀】
親愛(ài)的卡友們,歡迎光臨雷龍官網(wǎng),如果看完文章之后還是有疑惑或不懂的地方,請(qǐng)聯(lián)系我們,自己去理解或猜答案是件很累的事,請(qǐng)把最麻煩的事情交給我們來(lái)處理,術(shù)業(yè)有專(zhuān)攻,聞道有先后,深圳市雷龍發(fā)展專(zhuān)注存儲(chǔ)行業(yè)13年,專(zhuān)業(yè)提供小容量存儲(chǔ)解決方案。
-
FPGA
+關(guān)注
關(guān)注
1625文章
21634瀏覽量
601308 -
NAND
+關(guān)注
關(guān)注
16文章
1671瀏覽量
135946 -
FlaSh
+關(guān)注
關(guān)注
10文章
1614瀏覽量
147665 -
SD卡
+關(guān)注
關(guān)注
2文章
558瀏覽量
63753
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論