文章目錄
1、存儲芯片分類
2、NOR Flash 與NAND Flash的區(qū)別
3、什么是SD卡?
4、什么是SD NAND?
5、SD NAND的控制時序
6、FPGA實現(xiàn)SD NAND讀寫
6.1、設(shè)計思路
6.2、仿真結(jié)果
6.3、實驗結(jié)果
1、存儲芯片分類
目前市面上的存儲芯片,大致可以將其分為3大類:

① EEPROM
EEPROM (Electrically Erasable Programmable read only memory)是指帶電可擦可編程只讀存儲器,是一種掉電后數(shù)據(jù)不丟失的存儲芯片。EEPROM 可以在電腦上或?qū)S迷O(shè)備上擦除已有信息,重新編程。
這類產(chǎn)品容量小,讀取速度慢,且無法在應(yīng)用過程中寫入數(shù)據(jù),十分不便。目前多存在于一些MCU內(nèi)部,如遙控器,電風(fēng)扇等各類低端、低速消費(fèi)類產(chǎn)品。相信你讀大學(xué)如果玩單片機(jī)的話,那么應(yīng)該是不陌生。
② NOR Flash
NOR Flash由Intel在1988年發(fā)明,是市場上兩種主要的非易失閃存技術(shù)之一。NOR Flash 技術(shù)的出現(xiàn),徹底改變了原先由EPROM和EEPROM一統(tǒng)天下的局面。
NOR Flash可能是目前應(yīng)用領(lǐng)域最廣泛的一種存儲芯片了,基本上主流的電子產(chǎn)品里都有使用,比如手機(jī)攝像頭內(nèi)部,或者屏幕驅(qū)動電路板。主要用來存儲代碼和一些比較小的數(shù)據(jù)文件。NOR Flash架構(gòu)決定了它的容量不能做大,而且讀取速度比較慢。好處在于簡單易用,其接口可以實現(xiàn)地址尋址,也就意味著可以做到直接對某個地址直接操作,而不需要建立額外的文件系統(tǒng)。
③ NAND Flash
雖然很多人平常說的Flash 存儲器一半默認(rèn)其就是NOR Flash ,但這無疑是不嚴(yán)謹(jǐn)?shù)?。FLASH產(chǎn)品可以分為兩個大類:NOR Flash 和 NAND Flash 。
NAND Flash 是市場上兩種主要的非易失閃存技術(shù)之一,由東芝公司在1989年發(fā)明。其強(qiáng)調(diào)降低每比特的成本,并擁有更高的性能,可以像磁盤一樣可以通過接口輕松升級。
NAND Flash應(yīng)該是目前最熱門的存儲芯片了。因為我們生活中經(jīng)常使用的電子產(chǎn)品都會涉及到它。比如你買手機(jī),肯定會考慮64GB,還是256GB?買筆記本是買256GB,還是512GB容量的硬盤呢?(目前電腦大部分采用了基于NAND Flash產(chǎn)品的固態(tài)硬盤)
2、NOR Flash 與 NAND Flash的區(qū)別
Flash 閃存是非易失存儲器,可以對稱為塊的存儲器單元塊進(jìn)行擦寫和再編程。任何Flash 器件的寫入操作都只能在空或已擦除的單元內(nèi)進(jìn)行,所以大多數(shù)情況下,在進(jìn)行寫入操作之前必須先執(zhí)行擦除。NAND器件執(zhí)行擦除操作是十分簡單的,而NOR則要求在進(jìn)行擦除前先要將目標(biāo)塊內(nèi)所有的位都寫為0。
執(zhí)行擦除時塊尺寸的不同進(jìn)一步拉大了NOR和NAND之間的性能差距,統(tǒng)計表明,對于給定的一套寫入操作(尤其是更新小文件時),更多的擦除操作必須在基于NOR的單元中進(jìn)行。這樣,當(dāng)選擇存儲解決方案時,用戶必須權(quán)衡以下因素:
NOR Flash支持隨機(jī)訪問,所以支持XIP(execute In Place),NAND Flash需要按塊進(jìn)行讀取,所以不支持XIP
NAND FLASH理論讀取速度與NOR Flash相近,實際情況會根據(jù)接口不同有些差異
NOR 與 NAND 寫入前都需要先擦除,NOR在擦除時以64~128KB的塊進(jìn)行,執(zhí)行一個寫入/擦除操作的時間約5s,NAND在擦除時以8~32KB的塊進(jìn)行,執(zhí)行一個寫入/擦除操作的時間約4ms
NAND 理論最大擦除次數(shù)比NOR多
NOR 驅(qū)動比NAND簡單,NAND FLASH需要通過專門的NFI(NAND FLASH Interface)與Host端進(jìn)行通信,驅(qū)動相對復(fù)雜
所有Flash 都會有位反轉(zhuǎn)的問題,NAND 位反轉(zhuǎn)概率要比NOR高,NAND Flash 必須要使用ECC
NAND的單元尺寸幾乎是NOR器件的一半,所以NAND成本更低

NOR 與 NAND 各有特點(diǎn),應(yīng)用場景與應(yīng)用難度也不同,一般來講,NOR適用于小容量、略低速且需要直接對地址塊進(jìn)行操作的應(yīng)用,而NADN則適用于大容量的高速應(yīng)用。SD NAND 在保留了NAND架構(gòu)優(yōu)質(zhì)特性的同時改進(jìn)了不足之處,內(nèi)置的控制器能自行管理NAND Flash,無需在外部處理ECC和進(jìn)行壞塊管理,免去了MTD層,不需要寫繁瑣的驅(qū)動代碼。
3、什么是SD卡?
①概述
SD卡的英文全稱是Secure Digital Card,即安全數(shù)字卡(又叫安全數(shù)碼卡),是在MMC 卡(Multimedia Card,多媒體卡)的基礎(chǔ)上發(fā)展而來,主要增加了兩個特色:更高的安全性和更快的讀寫速度。
②容量標(biāo)準(zhǔn)和速度等級
若按照容量 對 SD 卡進(jìn)行等級劃分,SD 卡可分為 4 個等級,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)今,市場的主流 SD 產(chǎn)品是 SDHC 和 SDXC 這兩種較大容量的存儲 卡,SD 卡因容量過小,已逐漸被市場淘汰,SDUC 則是容量太大,預(yù)計會出現(xiàn)在未來市 場。SD 卡的四種容量標(biāo)準(zhǔn),具體見下圖:

不同品牌和廠商生產(chǎn)的 SD 卡在對存取速度上的定義標(biāo)準(zhǔn)不同,這會使用戶在選擇 SD卡時產(chǎn)生困擾。所以 SD 協(xié)會根據(jù)視頻勻速寫入到 SD 卡的最低持續(xù)速度來劃分不同等級, 每個等級的速率是以每秒傳輸多少 MB 來衡量的,單位為 MB/S。
SD 協(xié)會定義了三種速度等級:速度等級、UHS 速度等級與視頻速度等級。三種速度等級的具體傳輸速度如下圖:

4、什么是SD NAND?
上文中提到的SD卡其實更應(yīng)該叫做TF卡,在日常生活中最常見的應(yīng)用就是數(shù)碼相機(jī)的存儲卡。因為它是可拆卸的,所以這類SD卡最大的優(yōu)點(diǎn)就是便攜方便,但同時也有容易丟失和接觸不良等毛病,所以多用于消費(fèi)類產(chǎn)品。
在工業(yè)級應(yīng)用中,更多見的是一類貼片式的SD NAND產(chǎn)品,俗稱貼片式T卡或貼片式SD卡。雖然SD NAND 和TF卡稱呼上有些類似,但是SD NAND和TF卡有著本質(zhì)上的區(qū)別:

為什么SD NAND和 TF卡 之間有這么大區(qū)別呢?因為 SD NAND是為內(nèi)置存儲而生,是焊接在PCB板上的,是針對工業(yè)級應(yīng)用的產(chǎn)品,所以品質(zhì)穩(wěn)定、一致性高、使用穩(wěn)定性高、同時尺寸也小。而TF卡主要是針對普通消費(fèi)者,品質(zhì)和一致性、使用穩(wěn)定性等相對要求不高,再加上國內(nèi)魚龍混雜的市場環(huán)境,導(dǎo)致內(nèi)置存儲用TF卡的品質(zhì)風(fēng)險高。
NAND Flash產(chǎn)品的一個特質(zhì)就是它的品質(zhì)并不是0和1這么簡單,有些品質(zhì)隱患是使用一段時間之后才被發(fā)現(xiàn),如果這個產(chǎn)品已經(jīng)銷往海外,處理起來會變得異常麻煩。使用SD NAND可以為客戶產(chǎn)品帶來整體品質(zhì)的提升,提供確定性,是客戶產(chǎn)品良好品牌和口碑的穩(wěn)定基石。而使用TF卡時,產(chǎn)品整機(jī)不可控因素會增高,比如常見的卡座老化松動、TF觸點(diǎn)氧化、TF卡遺失、抗震性能減退等等。綜上所述,雖然SD NAND與TF卡使用的協(xié)議相同,但從外觀到內(nèi)在都有區(qū)別。正在使用TF卡的客戶需要提升產(chǎn)品穩(wěn)定性及耐用性時,SD NAND 是絕佳選擇。
盡管 SD NAND和 TF卡之間有著這么大的區(qū)別,但具體到實際應(yīng)用,其對外接口和驅(qū)動程序都是一樣了,這說明可移植性非常好。
① 物理結(jié)構(gòu)
SD NAND從物理結(jié)構(gòu)看包括 5 個部分,分別為存儲單元、存儲單元接口、電源檢測、卡及接口控制器和對外接口,具體見下圖。

存儲單元是存儲數(shù)據(jù)部件,存儲單元通過存儲單元接口與卡控制單元進(jìn)行數(shù)據(jù)傳輸
存儲單元接口是接口控制器與存儲單元的數(shù)據(jù)交互通道
電源檢測單元保證 SD NAND工作在合適的電壓下,如出現(xiàn)掉電或上電狀態(tài)時,它會使控制單元和存儲單元接口復(fù)位
卡及接口控制單元控制 SDNAND的運(yùn)行狀態(tài),它包括 8 個寄存器
對外接口單元控制 SD NAND引腳的輸入輸出,一般包含SDIO接口和SPI接口
② 對外接口
SD NAND共有 9 個引腳,其中包括 3 根電源線、1 根時鐘線、1 根命令線和 4根數(shù)據(jù)線。如下:
CLK:同步時鐘線,由主機(jī)產(chǎn)生,即由主控制器(FPGA)輸出; 使用 SPI 模式 時,該引腳與 SPI 總線的 SCK 時鐘信號相連
CMD:命令控制線, SDIO 主機(jī)通過該線發(fā)送命令控制 SD NAND,如果命令要求 SD NAND 提供應(yīng)答(響應(yīng)), SD NAND也是通過該線傳輸應(yīng)答信息; 使用 SPI 模式時,該引腳與 SPI總線的 MOSI 信號相連, SPI 主機(jī)通過它向 SD NAND發(fā)送命令及數(shù)據(jù),但因為 SPI 總線 的 MOSI 僅用于主機(jī)向從機(jī)輸出信號,所以 SD NAND返回應(yīng)答信息時不使用該信號線;
DAT0-3:在 SDIO 模式下,它們均為數(shù)據(jù)線,傳輸讀寫數(shù)據(jù), SD NAND可將 D0 拉低表 示忙狀態(tài); 在 SPI 模式下, DAT0 與 SPI 總線的 MISO 信號相連, SD NAND通過該信號線向主機(jī)發(fā)送數(shù)據(jù)或響應(yīng), DAT3 與總線的 CS 信號相連, SPI 主機(jī)通過該信號線選擇要通訊的 SD NAND。
VDD、VSS1、VSS2:電源和地信號。
③ 工作模式
SD NAND有兩種工作模式:SDIO 模式與SPI模式
在 SDIO 模式下,SD NAND共使用到 CLK、CMD、DAT[3:0] 6根信號線;SDIO 總線與多個 SD NAND連接時,可以共用 CLK 時鐘信號線,對于 CMD、DAT[3:0]信號線,每個 SD NAND都要獨(dú)立連接。SDIO 總線與 SD 卡連接方式,具體見下圖。此模式使用IO引腳多,但傳輸速度高。

在 SPI 模式下,SD NAND共使用到 CS(DAT[3])、CLK、MISO(DAT[0])、MOSI(CMD) 4根信號線;SPI 總線與多個 SD NAND連接時,除 CS 片選信號線不可共用外,其他信號均可公用。SPI 總線與 SD NAND連方式,具體見下圖。此模式使用IO引腳少,但傳輸速度慢。

④ 內(nèi)部寄存器
SD NAND總共有 8 個寄存器,用于設(shè)定或表示 SD NAND信息,寄存器描述具體見下圖。 這些寄存器只能通過對應(yīng)的命令訪問,對 SD NAND的控制操作是通過命令來執(zhí)行的, SD NAND定義了 64 個命令(部分命令不支持 SPI 模式) ,每個命令都有特殊意義,可以實現(xiàn)某一特定功能, SD NAND接收到命令后,根據(jù)命令要求對 SD NAND內(nèi)部寄存器進(jìn)行修改,程序控制中只需要發(fā)送組合命令就可以實現(xiàn) SD NAND的控制以及讀寫操作。

內(nèi)部寄存器就不展開講了,我們用FPGA實現(xiàn)讀寫測試也不需要了解那么多寄存器。
5、SD NAND的控制時序
① 命令與讀寫時序
SD NAND的通信是基于命令和數(shù)據(jù)傳輸?shù)?。通訊由一個起始位(“0”)開始,由一個停止位(“1”)終止。SD NAND通信一般是主機(jī)發(fā)送一個命令(Command),從設(shè)備在接收到命令后作出響應(yīng)(Response),如有需要會有數(shù)據(jù)(Data)傳輸參與。SD NAND的基本交互是命令與響應(yīng)交互, 見下圖:

SD NAND數(shù)據(jù)是以塊(Block)形式傳輸?shù)?,SDHC 規(guī)格數(shù)據(jù)塊長度一般為 512 字節(jié),數(shù)據(jù)可以從主機(jī)到芯片,也可以是從芯片到主機(jī)。數(shù)據(jù)塊需要 CRC 位來保證數(shù)據(jù)傳輸成功,CRC 位由 SD NAND系統(tǒng)硬件生成。單個數(shù)據(jù)塊的讀、寫時序分別見下2圖:


讀寫操作都是由主機(jī)發(fā)起的,主機(jī)發(fā)送不同的命令表示讀或?qū)懀?SD NAND接收到命令后先針對命令返回響應(yīng)。在讀操作中, SD NAND返回一個數(shù)據(jù)塊,數(shù)據(jù)塊中包含 CRC校驗碼;在寫操作中,主機(jī)接收到命令響應(yīng)后需要先發(fā)送一個標(biāo)志(TOKEN)然后緊跟一個要寫入的數(shù)據(jù)塊,SD NAND接收完數(shù)據(jù)塊后會返回一個數(shù)據(jù)響應(yīng)及忙碌標(biāo)志,當(dāng) SD NAND把接收到的數(shù)據(jù)寫入到內(nèi)部存儲單元完成后,會停止發(fā)送忙碌標(biāo)志,主機(jī)確認(rèn) SD NAND空閑后,才可以發(fā)送下一個命令。
SD NAND數(shù)據(jù)傳輸支持單塊和多塊讀寫,它們分別對應(yīng)不同的操作命令, 結(jié)束多塊讀寫時需要使用命令來停止操作。
② 命令格式
SD NAND命令由主機(jī)發(fā)出,命令格式固定為 48bit,通過 CMD 信號線連續(xù)傳輸。SD NAND命令格式,具體見下圖:

起始位和終止位:命令的主體包含在起始位與終止位之間,它們都只包含一個數(shù)據(jù)位,起始位為 0,終止位為 1。
傳輸標(biāo)志:用于區(qū)分傳輸方向,該位為 1 時表示命令,方向為主機(jī)傳輸?shù)?SD NAND,該位為 0 時表示響應(yīng),方向為 SD NAND傳輸?shù)街鳈C(jī)。命令主體內(nèi)容包括命令、地址信息/參數(shù)和 CRC 校驗三個部分。
命令號:它固定占用 6bit,所以總共有 64 個命令,每個命令都有特定的用途,部分命令不適用于 SPI 總線,或不適用于 SD NAND操作,只是專門用于 MMC 卡或者 SD I/O卡。
地址/參數(shù):每個命令有 32bit 地址信息/參數(shù)用于命令附加內(nèi)容,例如,廣播命令沒有地址信息,這 32bit 用于指定參數(shù),而尋址命令這 32bit 用于指定目標(biāo) SD NAND的地址, 當(dāng)使用 SDIO 驅(qū)動多個 SD NAND時,通過地址信息區(qū)分控制不同的SD NAND,使用 SPI 總線驅(qū)動時,通過片選引腳來選擇不同的SD NAND,所以使用這些命令時地址可填充任意值。
CRC7 校驗:長度為 7bit 的校驗位用于驗證命令傳輸內(nèi)容正確性,如果發(fā)生外部干擾 導(dǎo)致傳輸數(shù)據(jù)個別位狀態(tài)改變將導(dǎo)致校準(zhǔn)失敗,也意味著命令傳輸失敗, SD NAND不執(zhí)行命令。 使用 SDIO 驅(qū)動時,命令中必須包含正確的 CRC7 校驗值;而使用 SPI 驅(qū)動時,命令中的 CRC7 校驗?zāi)J(rèn)是關(guān)閉的,即這 CRC7 校驗位中可以寫入任意值而不影響通訊,僅在發(fā)送 CMD0 命令時需要強(qiáng)制帶標(biāo)準(zhǔn)的 CRC7 校驗。
③ 命令內(nèi)容
SD NAND命令可分為標(biāo)準(zhǔn)命令 (如 CMD0)和特殊應(yīng)用命令 (如 ACMD41),其中特殊應(yīng)用命令只有在先寫入 CMD55 命令后才能被識別。按照指令類型又可將 SD NAND命令分為基本命令、數(shù)據(jù)塊寫命令、數(shù)據(jù)塊讀命令、擦除命令等 12 種(class0 ~ class11)。
本次實驗將會使用 SPI 模式實現(xiàn) SD NAND的數(shù)據(jù)讀寫操作,所以接下來只列舉 SPI 模式下常用的 SD 卡命令,具體見下表:

SPI 模式下,上述各命令中,命令 CMD0 的 CRC7 校驗為固定的 1001_010;命令CMD8 的 CRC7 校驗為固定的 1000_011;其他命令的 CRC7 校驗在 SPI 模式下無作用,賦值為 1111_111 即可。
④ 響應(yīng)格式
當(dāng) SD NAND接收到命令時,會向 SD NAND回傳命令響應(yīng)。SD NAND有 5 種類型的命令響應(yīng):R1、R1b、R2、R3、R7;SDIO NAND還支持另外兩種命令響應(yīng):R4、R5。下文只對部分響應(yīng)做介紹。
R1 響應(yīng)格式,具體見下圖:

in idle state:當(dāng)該位為 1 時,表示 SD NAND處于空閑狀態(tài)
erase reset:因為接收到無需擦除操作的命令,擦除操作被復(fù)位
illegal command:接收到一個無效的命令代碼
com crc error:接收到的上一個命令的 CRC 校驗錯誤
erase sequence error:擦除命令的控制順序錯誤
address error:讀寫的數(shù)據(jù)地址不對齊(數(shù)據(jù)地址需要按塊大小對齊)
parameter error:命令的參數(shù)錯誤
R3 響應(yīng)格式,具體見下圖:

R3 響應(yīng)包括 5 個字節(jié),首先返回的第 1 個字節(jié)內(nèi)容為 R1,剩下的其余字節(jié)為 OCR( Operation Conditions Register, 操作條件寄存器)寄存器的內(nèi)容。
R7 響應(yīng)格式,具體見下圖:

R7 響應(yīng)包括 5 個字節(jié),首先返回的第 1 個字節(jié)內(nèi)容為 R1,R7 [31:28]位為命令版本,R7[27:12]為保留位,R7[11:8]為反饋的電壓范圍,最后 1 個字節(jié)為檢查模式。
6、FPGA實現(xiàn)SD NAND讀寫
接下來編寫FPGA的Verilog代碼實現(xiàn)向SD NAND的指定扇區(qū)中寫入512個字節(jié)的數(shù)據(jù),寫完后將數(shù)據(jù)讀出,并通過指示燈的方式驗證數(shù)據(jù)是否被正確讀寫。需要說明的是,后文的讀寫操作均采用SPI模式。
6.1、設(shè)計思路
① 上電時序
SD NAND同其他的許多芯片一樣上電后需要保持一定的時間以便維持電壓穩(wěn)定,這個時間通常是74+個時鐘周期,一般實際應(yīng)用中可設(shè)置參數(shù)為74~100。只有經(jīng)過這個過渡時間后,才可以執(zhí)行后續(xù)的SD NAND初始化操作。

② 初始化時序
SD NAND在正常讀寫操作之前,必須先對SD NAND進(jìn)行初始化,使其工作在預(yù)期的工作模式。初始化流程如下:


1.SD NAND完成上電后,主機(jī)FPGA先對從機(jī)SD NAND發(fā)送至少74個以上的同步時鐘,在上電同步期間,片選CS引腳和MOSI引腳必須為高電平(MOSI引腳除發(fā)送命令或數(shù)據(jù)外,其余時刻都為高電平);
2.拉低片選CS引腳,發(fā)送命令CMD0(0x40)復(fù)位SD NAND,命令發(fā)送完成后等待SD NAND返回響應(yīng)數(shù)據(jù);
3.SD NAND返回響應(yīng)數(shù)據(jù)后,先等待8個時鐘周期再拉高片選CS信號,此時判斷返回的響應(yīng)數(shù)據(jù)。如果返回的數(shù)據(jù)為復(fù)位完成信號0x01,在接收返回信息期間片選CS為低電平, 此時SD NAND進(jìn)入SPI模式,并開始進(jìn)行下一步,如果返回的值為其它值,則重新執(zhí)行第2步;
4.拉低片選CS引腳,發(fā)送命令CMD8(0x48)查詢SD NAND的版本號,只有SD2.0版本才支持此命令,命令發(fā)送完成后等待SD NAND返回響應(yīng)數(shù)據(jù);
5.SD NAND返回響應(yīng)數(shù)據(jù)后,先等待8個時鐘周期再拉高片選CS信號,此時判斷返回的響應(yīng)數(shù)據(jù)。如果返回的電壓范圍為4’b0001即2.7V~3.6V,說明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個時鐘周期再拉高片選CS信號,此時判斷返回的響應(yīng)數(shù)據(jù)。如果返回的數(shù)據(jù)為空閑信號0x01,開始進(jìn)行下一步,否則重新執(zhí)行第6步。
8.拉低片選CS引腳,發(fā)送命令A(yù)CMD41(0x69)查詢SD NAND是否初始化完成,命令發(fā)送完成后等待SD NAND返回響應(yīng)數(shù)據(jù);
9.SD NAND返回響應(yīng)數(shù)據(jù)后,先等待8個時鐘周期再拉高片選CS信號,此時判斷返回的響應(yīng)數(shù)據(jù)。如果返回的數(shù)據(jù)為0x00,此時初始化完成,否則重新執(zhí)行第6步。
③ 寫操作時序
至此,SD NAND完成了復(fù)位以及初始化操作,進(jìn)入到SPI模式的讀寫操作。SD NAND讀寫一次的數(shù)據(jù)量必須為512字節(jié)的整數(shù)倍,即對SD NAND讀寫操作的最少數(shù)據(jù)量為512 個字節(jié)。我們可以通過命令CMD16來配置單次讀寫操作的數(shù)據(jù)長度,以使每次讀寫的數(shù)據(jù)量為 (n*512)個字節(jié)(n≥1),本次SD NAND的讀寫操作使用默認(rèn)配置,即單次讀寫操作的數(shù)據(jù)量為512個字節(jié)。
SD NAND的寫操作時序圖如下圖所示:

拉低片選信號 CS_N,向 SD NAND寫入命令 CMD24,命令號為 0x58,攜帶參數(shù)為 4字節(jié)的 SD NAND寫扇區(qū)地址,CRC 校驗字節(jié)未使用直接寫入 0xFF,命令發(fā)送完成后 等待 SD NAND返回響應(yīng)數(shù)據(jù)
若 SD NAND返回正確響應(yīng)數(shù)據(jù) R1 為 0x00,等待 8 個時鐘周期,向 SD NAND寫入令牌0xFE,緊隨其后寫入 512 個字節(jié)的數(shù)據(jù)
數(shù)據(jù)發(fā)送完成后,再向 SD NAND寫入 2 個字節(jié)的 CRC 校驗字節(jié)。SPI 模式下不對數(shù)據(jù)進(jìn)行 CRC 校驗,直接寫入兩個字節(jié)的 0xFF
校驗數(shù)據(jù)發(fā)送完成后, SD NAND會有響應(yīng)數(shù)據(jù)返回,隨后 SD NAND將 Miso 信號拉低進(jìn)入寫忙狀態(tài)
MISO 信號再次拉高后 SD NAND退出寫忙狀態(tài),等待 8 個時鐘周期后拉高片選信號,SD NAND數(shù)據(jù)寫操作完成,可以執(zhí)行其它操作
④ 讀操作時序
SD NAND的讀操作時序圖如下圖所示:

1.拉低片選信號 CS_N, 向 SD NAND寫入命令 CMD17,命令號為 0x51,攜帶參數(shù)為 4字節(jié)的 SD NAND讀扇區(qū)地址,CRC 校驗字節(jié)未使用直接寫入 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 校驗字節(jié)
3.解析到數(shù)據(jù)頭 0xFE 后,接下來接收 SD NAND返回的 512 個字節(jié)的數(shù)據(jù)
4.數(shù)據(jù)解析完成后,接下來接收2個字節(jié)的 CRC 校驗值。 由于 SPI 模式下不對數(shù)據(jù)進(jìn)行 CRC 校驗,可直接忽略這兩個字節(jié)
5.CRC 校驗字節(jié)接收完畢,等待 8 個時鐘周期,拉高片選信號 CS_N,一次數(shù)據(jù)讀操作完成
⑤ 程序設(shè)計
通過前面介紹的SD NAND初始化、寫操作以及讀操作可知,SD NAND的這3個操作是相互獨(dú)立且不能同時進(jìn)行的,因此我們可以將SD NAND的初始化、寫操作以及讀操作分別劃分為3個獨(dú)立的模塊,最后將這三個模塊例化在SD NAND的控制器模塊中,便于在其它工程項目中使用。
下圖是系統(tǒng)框圖,PLL時鐘模塊(PLL)為各個模塊提供驅(qū)動時鐘,SD NAND測試數(shù)據(jù)產(chǎn)生模塊產(chǎn)生測試數(shù)據(jù)寫入SD NAND,寫完后從SD NAND中讀出數(shù)據(jù),最終讀寫測試結(jié)果由LED顯示模塊通過控制LED燈的顯示狀態(tài)來指示。

頂層模塊:頂層模塊完成了對其它四個模塊的例化,SD NAND測試數(shù)據(jù)產(chǎn)生模塊產(chǎn)生的開始寫入信號及數(shù)據(jù)連接至SD NAND控制器模塊,數(shù)據(jù)寫完后從SD NAND控制器中讀出數(shù)據(jù), 并驗證數(shù)據(jù)的正確性,將驗證的結(jié)果連接至LED顯示模塊。
PLL時鐘模塊:PLL時鐘模塊通過調(diào)用鎖相環(huán)(PLL)IP核來實現(xiàn),總共輸出2個時鐘,頻率都是50Mhz,但兩個時鐘相位相差180度。我們知道,SD卡的SPI通信模式為CPOL=1, CPHA=1;即SPI_CLK在空閑時為高電平,數(shù)據(jù)發(fā)送是在時鐘的第一個邊沿,也就是SPI_CLK由高 電平到低電平的跳變,所以數(shù)據(jù)采集是在上升沿,數(shù)據(jù)發(fā)送是在下降沿。為了在程序代碼中統(tǒng) 一使用上升沿,我們使用兩個相位相差180度的時鐘來對SD NAND進(jìn)行操作。
SD NAND測試數(shù)據(jù)產(chǎn)生模塊:SD NAND測試數(shù)據(jù)產(chǎn)生模塊產(chǎn)生的開始寫入信號和數(shù)據(jù)寫入SD NAND控制器模塊中,數(shù)據(jù)寫完后從SD NAND控制器中讀出數(shù)據(jù),并驗證數(shù)據(jù)的正確性,將驗證的結(jié)果發(fā)送給LED顯示模塊。
SD NAND控制器模塊:SD NAND控制器模塊例化了SD NAND初始化模塊、 SD NAND寫數(shù)據(jù)模塊和SD NAND讀數(shù)據(jù)模塊。SD NAND初始化模塊完成對SD NAND的上電初始化操作;SD NAND寫數(shù)據(jù)模塊完成對SD NAND的寫操作;SD NAND讀數(shù)據(jù)模塊完成對SD NAND的讀操作。 由于這三個模塊都操作了SD NAND的引腳信號,且這三個模塊在同一時間內(nèi)不會同時操作,所以此模塊實現(xiàn)了對其它三個模塊的例化以及選擇SD NAND的引腳連接至其中某一個模塊。
LED顯示模塊:LED顯示模塊將SD NAND測試數(shù)據(jù)產(chǎn)生模塊輸出的驗證結(jié)果值, 通過控制LED燈的顯示狀態(tài)來指示。
SD NAND控制器部分代碼如下:
module sd_ctrl_top(
input clk_ref , //時鐘信號
input clk_ref_180deg, //時鐘信號,與clk_ref相位相差180度
input rst_n , //復(fù)位信號,低電平有效
//SD卡接口
input sd_miso , //SD卡SPI串行輸入數(shù)據(jù)信號
output sd_clk , //SD卡SPI時鐘信號
output reg sd_cs , //SD卡SPI片選信號
output reg sd_mosi , //SD卡SPI串行輸出數(shù)據(jù)信號
//用戶寫SD卡接口
input wr_start_en , //開始寫SD卡數(shù)據(jù)信號
input [31:0] wr_sec_addr , //寫數(shù)據(jù)扇區(qū)地址
input [15:0] wr_data , //寫數(shù)據(jù)
output wr_busy , //寫數(shù)據(jù)忙信號
output wr_req , //寫數(shù)據(jù)請求信號
//用戶讀SD卡接口
input rd_start_en , //開始讀SD卡數(shù)據(jù)信號
input [31:0] rd_sec_addr , //讀數(shù)據(jù)扇區(qū)地址
output rd_busy , //讀數(shù)據(jù)忙信號
output rd_val_en , //讀數(shù)據(jù)有效信號
output [15:0] rd_val_data , //讀數(shù)據(jù)
output sd_init_done //SD卡初始化完成信號
);
//wire define
wire init_sd_clk ; //初始化SD卡時的低速時鐘
wire init_sd_cs ; //初始化模塊SD片選信號
wire init_sd_mosi ; //初始化模塊SD數(shù)據(jù)輸出信號
wire wr_sd_cs ; //寫數(shù)據(jù)模塊SD片選信號
wire wr_sd_mosi ; //寫數(shù)據(jù)模塊SD數(shù)據(jù)輸出信號
wire rd_sd_cs ; //讀數(shù)據(jù)模塊SD片選信號
wire rd_sd_mosi ; //讀數(shù)據(jù)模塊SD數(shù)據(jù)輸出信號
//*****************************************************
//** main code
//*****************************************************
//SD卡的SPI_CLK
assign sd_clk = (sd_init_done==1'b0) ? init_sd_clk : clk_ref_180deg;
//SD卡接口信號選擇
always @(*) begin
//SD卡初始化完成之前,端口信號和初始化模塊信號相連
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卡寫數(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)寫操作
.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初始化完成信號)連接至SD NAND測試數(shù)據(jù)產(chǎn)生模塊,只有在SD NAND初始化完成之后(sd_init_done為高電平),才能對SD NAND進(jìn)行讀寫測試。SD NAND控制器模塊將SD NAND的初始化以及讀寫操作封裝成方便用戶調(diào)用的接口,SD NAND測試數(shù)據(jù)產(chǎn)生模塊只需對SD NAND控制器模塊的用戶接口進(jìn)行操作即可完成對SD NAND的讀寫操作。
6.2、仿真結(jié)果
一般的測試中,我們都需要先進(jìn)行仿真來觀察時序等測試行為。此次實驗由于找不到好的SD NAND的Verilog模型,所以仿真測試略。
6.3、實驗結(jié)果
上文已經(jīng)說了常用的相機(jī)中的TF卡與工業(yè)級的SD NAND(貼片式T卡)的區(qū)別,所以本次實驗我選用的是深圳雷龍公司的一款SD NAND產(chǎn)品----CSNP32GCR01-AOW。
這是一家專業(yè)做存儲產(chǎn)品的公司,NAND Flash是其主要產(chǎn)品。 該公司專注NAND Flash設(shè)計研發(fā)13年,在這一塊可以說是相當(dāng)專業(yè)。如果你對NAND Flash仍有疑惑的問題,或者你想在你的設(shè)計中使用NAND Flash產(chǎn)品,都可以直接聯(lián)系:深圳市雷龍發(fā)展有限公司
實驗結(jié)果其實沒什么好看的,LED燈常量表明說明從SD NAND讀出的512個字節(jié)(256個16位數(shù)據(jù)) 與寫入的數(shù)據(jù)相同,SD NAND讀寫測試程序下載驗證成功。
PS:有個小細(xì)節(jié)可以說下,雷龍公司的SD NAND開發(fā)板還是蠻用心的,封裝都是標(biāo)準(zhǔn)的Micro SD的封裝,只要你的FPGA開發(fā)板上有SD卡座,就可以直接插上使用了,即插即用十分方便,有心了。

【本文轉(zhuǎn)載自CSDN,作者:孤獨(dú)的單刀】
親愛的卡友們,歡迎光臨雷龍官網(wǎng),如果看完文章之后還是有疑惑或不懂的地方,請聯(lián)系我們,自己去理解或猜答案是件很累的事,請把最麻煩的事情交給我們來處理,術(shù)業(yè)有專攻,聞道有先后,深圳市雷龍發(fā)展專注存儲行業(yè)13年,專業(yè)提供小容量存儲解決方案。
-
FPGA
+關(guān)注
關(guān)注
1645文章
22040瀏覽量
618186 -
NAND
+關(guān)注
關(guān)注
16文章
1722瀏覽量
138113 -
FlaSh
+關(guān)注
關(guān)注
10文章
1678瀏覽量
151752 -
SD卡
+關(guān)注
關(guān)注
2文章
578瀏覽量
65654
發(fā)布評論請先 登錄
Nand flash 和SD卡(SD NAND)存儲扇區(qū)分配表異同
CS創(chuàng)世SD NAND【貼片式sd卡】的測試使用說明

評論