SPI接口的FLASH ROM AT45DB161D的驅(qū)動(dòng)方法 (1)芯片介紹 AT45DB161D是串行接口的閃存芯片,可工作在2.5V~2.7V,可廣泛應(yīng)用于數(shù)據(jù)語(yǔ)音、圖像、程序代碼數(shù)據(jù)存儲(chǔ)中。AT45DB161D支持RapidS串行接口,適用于高速場(chǎng)合。RapidS串行接口是與SPI相兼容的,速度可達(dá)到66MHz。它包含有17,301,504個(gè)位,被組織為4096個(gè)頁(yè),每個(gè)頁(yè)512或528個(gè)字節(jié)。除了主存儲(chǔ)器,AT45DB161D還包括兩個(gè)SRAM數(shù)據(jù)緩沖區(qū),每個(gè)緩沖區(qū)512/528個(gè)字節(jié)。在主存儲(chǔ)器正在編程時(shí),緩沖區(qū)是允許接收數(shù)據(jù)的,并且支持?jǐn)?shù)據(jù)流式寫(xiě)入。與并行FLASH儲(chǔ)存器不同,它采用RapidS串行接口,從而大大減少了可用引腳數(shù)量,同時(shí)也提高了系統(tǒng)可靠性,降低了開(kāi)關(guān)噪聲,縮小了封裝體積?梢詰(yīng)用于商業(yè)、工業(yè)等需要高密度、低引腳數(shù)、低電壓與低功耗的應(yīng)用場(chǎng)合。 AT45DB161D允許簡(jiǎn)單的在系統(tǒng)重新編程,而無(wú)需輸入高編程電壓。芯片可以采用2.5V~3.6V或2.7V~3.6V單電源供電,進(jìn)行編程與讀取操作。它可以通過(guò)#CS來(lái)進(jìn)行使能,并通過(guò)三線(xiàn)接口(SI、SO、SCK)進(jìn)行數(shù)據(jù)通信。 (2)引腳配置與封裝 1.芯片封裝圖
2.引腳功能詳述 符號(hào) | | | | | 片選:#CS用以選中芯片。當(dāng)#CS被設(shè)置為無(wú)效狀態(tài)時(shí),芯片則不被選中,并且處于閑置狀態(tài)(不是深度睡眠狀態(tài)),輸出引腳SO處于高阻態(tài)。當(dāng)芯片未被選中時(shí),從輸入引腳SI輸入的數(shù)據(jù)將不被接受。 #CS引腳上的下降沿將會(huì)啟動(dòng)一個(gè)操作,而上跳沿則會(huì)結(jié)束一個(gè)操作。在一個(gè)內(nèi)部操作如芯片內(nèi)部的編程或擦除周期內(nèi),芯片不會(huì)進(jìn)入閑置狀態(tài),直到操作完畢。 | | | | 串行時(shí)鐘:此引腳用來(lái)向芯片提供時(shí)鐘信號(hào),有來(lái)控制數(shù)據(jù)流的出入。SI引腳上的命令、地址與輸入數(shù)據(jù)在時(shí)鐘SCK的上升沿被寫(xiě)入,而SO引腳上的輸出數(shù)據(jù)則在時(shí)鐘的下降沿變化。 | | | | 串行輸入:SI引腳用來(lái)向芯片以移位方式寫(xiě)入數(shù)據(jù)。SI引腳上的所有數(shù)據(jù)輸入包括命令與地址。SI上的數(shù)據(jù)在時(shí)鐘的上升沿寫(xiě)入芯片。 | | | | 串行輸出:SO引腳用來(lái)從芯片以移位方式輸出數(shù)據(jù)。SI上的數(shù)據(jù)在時(shí)鐘的下降沿變化。 | | | | 寫(xiě)保護(hù):當(dāng)#WP被設(shè)置為有效時(shí)芯片的扇區(qū)將被保護(hù)起來(lái),以防止編程與擦除對(duì)數(shù)據(jù)的破壞。但是扇區(qū)保護(hù)使能與扇區(qū)死鎖命令仍然可以被芯片識(shí)別。#WP引腳在內(nèi)部被拉高,可以懸空。但是仍然建議在外部接到VCC。 | | | | 復(fù)位:#RESET引腳上的低電平會(huì)終止正在處理的操作并復(fù)位內(nèi)部狀態(tài)機(jī)到閑置狀態(tài)。#RESET引腳上的低電平會(huì)使芯片一直處于復(fù)位狀態(tài)。當(dāng)#RESET上轉(zhuǎn)為高電平后,才能進(jìn)行正常的操作。 芯片內(nèi)部設(shè)置上電復(fù)位電路。當(dāng)此引腳不用時(shí),外部接到高電平。 | | | | 就緒/忙碌狀態(tài)指示:此引腳是漏極開(kāi)路的輸出引腳。當(dāng)芯片處于忙狀態(tài)時(shí)(內(nèi)部操作過(guò)程中)此引腳為低電平,此引腳在正常狀態(tài)下為高電平(外部接上拉電阻)。當(dāng)正在進(jìn)行編程/擦除操作,比較操作與頁(yè)-緩沖區(qū)傳送時(shí),被拉低。 忙狀態(tài)指示FLASH儲(chǔ)存陣列與某一個(gè)緩沖區(qū)不能被操作,而對(duì)另一個(gè)緩沖區(qū)的讀與寫(xiě)操作仍然可以進(jìn)行。 | | | | | | | | 地:此引腳應(yīng)與系統(tǒng)地接在一起。 | | |
(3)AT45DB161D的功能框圖: (4)存儲(chǔ)器陣列: AT45DB161D的儲(chǔ)存器陣列被分為3個(gè)級(jí)別的粒度,分別為扇區(qū)、塊與頁(yè)。下面的“存儲(chǔ)器結(jié)構(gòu)圖”對(duì)各個(gè)級(jí)別進(jìn)行了分析,詳細(xì)說(shuō)明了每個(gè)扇區(qū)與塊的頁(yè)數(shù)。所有的編程操作都是針對(duì)于頁(yè)的。擦除操作可以作用于芯片、扇區(qū)、塊或頁(yè)。 扇區(qū)結(jié)構(gòu): (扇區(qū) 0A)=8頁(yè) 4096 /4224 字節(jié) | (扇區(qū) 0B)=248頁(yè) 126,976/130,944字節(jié) | (扇區(qū) 1 )=256頁(yè) 131,072/135,168字節(jié) | (扇區(qū) 2 )=256頁(yè) 131,072/135,168字節(jié) | | (扇區(qū) 14)=256頁(yè) 131,072/135,168字節(jié) | (扇區(qū) 15)=256頁(yè) 131,072/135,168字節(jié) |
塊結(jié)構(gòu): 頁(yè)結(jié)構(gòu): (5)芯片操作: 芯片的操作是通過(guò)單片機(jī)的指令來(lái)完成的。指令列表與指令操作碼在后面的“指令表”中有詳細(xì)的說(shuō)明。一個(gè)有效的指令由#CS的下降沿來(lái)指示它的開(kāi)始,隨后是一個(gè)有意義的8位操作碼與緩存區(qū)或主存儲(chǔ)器的地址。當(dāng)#CS為低時(shí),由時(shí)鐘SCK引腳來(lái)控制由SI引腳寫(xiě)入的操作碼與緩存區(qū)或主存儲(chǔ)器的地址。所有的指令、地址與數(shù)據(jù)在傳輸時(shí)都是高位在前的。 528字節(jié)模式下,緩沖區(qū)中數(shù)據(jù)的地址由BFA9~BFA0來(lái)表示。主存儲(chǔ)器中數(shù)據(jù)的地址由PA11~PA0與BA9~BA0來(lái)表示,PA11~PA0用來(lái)表示12位頁(yè)地址,BA9~BA0表示10位的頁(yè)內(nèi)字節(jié)地址。在512字節(jié)模式下,緩沖區(qū)中數(shù)據(jù)地址由BFA8~BFA0來(lái)表示。主存儲(chǔ)器中數(shù)據(jù)的地址由A20~A0來(lái)表示,其中A20~A9是12位的頁(yè)地址,A8~A0為9位的頁(yè)內(nèi)字節(jié)地址。
(6)讀命令 使用相應(yīng)的操作碼,數(shù)據(jù)可以從主存儲(chǔ)器或某一個(gè)SRAM緩沖區(qū)中讀出。 1. 連續(xù)讀(命令碼:E8H):可以達(dá)到66MHz 在提供了主存儲(chǔ)器陣列的開(kāi)始地址后,在時(shí)鐘信號(hào)的作用下連續(xù)讀命令可以從芯片中以數(shù)據(jù)流方式進(jìn)行數(shù)據(jù)讀取,而無(wú)需額外的地址信息或控制信號(hào)。芯片內(nèi)部的地址計(jì)數(shù)器會(huì)在每一個(gè)時(shí)鐘周期后自動(dòng)自增,因而可以在不用寫(xiě)入新的地址的情況下繼續(xù)讀取下一個(gè)字節(jié)。要進(jìn)行一次對(duì)頁(yè)(528字節(jié))的連續(xù)讀操作,操作碼E8H必須要寫(xiě)入芯片中,隨后是3個(gè)字節(jié)的地址(22位的頁(yè)與字節(jié)地址序列)與4個(gè)無(wú)關(guān)字節(jié)。開(kāi)始的12位(PA11~PA0)來(lái)用表示將要讀取的數(shù)據(jù)在主存儲(chǔ)器中的頁(yè)地址。后10位(BA9~BA0)用來(lái)表示字節(jié)在頁(yè)中的地址。而要進(jìn)行一次對(duì)頁(yè)(512字節(jié))的連續(xù)讀時(shí),操作碼E8H同樣也要先寫(xiě)入到芯片中,隨后是三個(gè)字節(jié)的地址與4個(gè)無(wú)關(guān)字節(jié)。21位序列中前12位(A20~A9)表示要讀的數(shù)據(jù)在主存儲(chǔ)器的頁(yè)地址,后9位(A8~A0)是頁(yè)內(nèi)的字節(jié)地址。那些無(wú)關(guān)字節(jié)在讀操作初始化時(shí)是必需的。在無(wú)關(guān)字節(jié)后,SCK引腳上的時(shí)鐘信號(hào)使數(shù)據(jù)從SO引腳輸出。 在操作寫(xiě)入地址字節(jié)、無(wú)關(guān)字節(jié)與數(shù)據(jù)讀取的過(guò)程中,#CS引腳上要保持低電平。連續(xù)讀到達(dá)一個(gè)頁(yè)的結(jié)尾時(shí),芯片會(huì)從下個(gè)頁(yè)的開(kāi)頭繼續(xù)讀取,頁(yè)間的跨越是沒(méi)有延時(shí)的。當(dāng)主存儲(chǔ)器的最后一個(gè)位被讀出后,芯片會(huì)自動(dòng)返回到第一頁(yè)的開(kāi)頭繼續(xù)讀取。與頁(yè)間跨越相同的,從存儲(chǔ)器陣列結(jié)尾轉(zhuǎn)到開(kāi)頭也是無(wú)延時(shí)的。 2. 連續(xù)讀(命令碼:0BH 高速模式):可以達(dá)到66MHz 此命令可以在最高頻率以下的任意時(shí)鐘頻率下通過(guò)串行接口對(duì)主存儲(chǔ)器進(jìn)行高速讀取。要進(jìn)行一次連續(xù)讀(頁(yè)容量為528字節(jié)),#CS必須處于有效狀態(tài),然后操作碼0BH必須寫(xiě)入到芯片中,隨后是3字節(jié)地址與一個(gè)字節(jié)。22位地址序列中的前12位(PA11~PA0)表示將要讀取的數(shù)據(jù)在主存儲(chǔ)器中的頁(yè)地址,后10位(BA9~BA0)表示頁(yè)內(nèi)的字節(jié)地址。要進(jìn)行一次連續(xù)讀(頁(yè)容量為512字節(jié)),同樣地,操作碼OBH也要先寫(xiě)入芯片中,隨后是3字節(jié)地址(A20~A0)與一個(gè)字節(jié)。在此字節(jié)后數(shù)據(jù)將在SCK引腳上的時(shí)鐘信號(hào)作用下從SO引腳輸出。 同1中的內(nèi)容。 3. 連續(xù)讀(命令碼:03H 低速模式):可以達(dá)到33MHz 大部分與高速模式下的連續(xù)讀是相同的。不同的在于3字節(jié)地址寫(xiě)入后無(wú)需再寫(xiě)入一個(gè)字節(jié)。 4. 主存儲(chǔ)器頁(yè)讀(操作碼:D2H) 主存儲(chǔ)器頁(yè)讀允許直接從4096個(gè)頁(yè)中某一個(gè)頁(yè)中讀取數(shù)據(jù),而不影響緩沖區(qū)中的數(shù)據(jù)。其它的內(nèi)容與1相同。 5. 緩存區(qū)讀(操作碼:緩沖區(qū)1D4H或D1H 緩沖區(qū)2 D6H或D3H) 主存儲(chǔ)陣列中的數(shù)據(jù)可以放在SRAM數(shù)據(jù)緩存區(qū)內(nèi),使用緩存區(qū)讀命令允許直接從緩沖區(qū)中讀取數(shù)據(jù)。操作碼的選用要根據(jù)時(shí)鐘頻率而定。D4H、D6H與D1H、D3H可以分別使用在頻率低于66MHz與33MHz的情況下。要進(jìn)行一次緩沖區(qū)讀(528字節(jié)),操作碼必須先寫(xiě)入芯片,隨后是3字節(jié)地址(14個(gè)無(wú)關(guān)位與10位緩沖區(qū)地址)。要進(jìn)行一次緩沖區(qū)讀(512字節(jié)),操作同樣也要先寫(xiě)入芯片,隨后是3字節(jié)地址(15個(gè)無(wú)關(guān)位與9位緩沖區(qū)地址)。在地址字節(jié)后,一個(gè)無(wú)關(guān)字節(jié)必須要寫(xiě)入芯片以初始化讀操作。在操作碼、地址字節(jié)、無(wú)關(guān)字節(jié)寫(xiě)入的過(guò)程中,#CS引腳必須保持低電平。當(dāng)?shù)竭_(dá)緩沖區(qū)的結(jié)尾時(shí),芯片會(huì)自動(dòng)返回到緩沖區(qū)的開(kāi)始。#CS的上跳沿將終止讀操作。 (7)編程與擦除命令 1. 緩沖區(qū)寫(xiě)(操作碼:緩沖區(qū)1 84H 緩沖區(qū)2 87H) 數(shù)據(jù)可以通過(guò)SI引腳寫(xiě)入緩沖區(qū)1或2中。要將數(shù)據(jù)寫(xiě)入緩沖區(qū)(528字節(jié)),操作碼必須先寫(xiě)入芯片,隨后是3字節(jié)地址(14位無(wú)關(guān)位與10位緩沖區(qū)地址 BFA9~BFA0)。這10位地址表示要寫(xiě)入的數(shù)據(jù)的第一個(gè)字節(jié)的緩沖區(qū)地址。李將數(shù)據(jù)寫(xiě)入緩沖區(qū)(512字節(jié)),操作碼同樣也要先寫(xiě)入芯片,隨后是3字節(jié)地址(15個(gè)無(wú)關(guān)位與9位緩沖區(qū)地址 BFA8~BFA0)。這9位緩沖區(qū)地址表示要寫(xiě)入的每個(gè)字節(jié)的地址。在最后一個(gè)地址位寫(xiě)入后,就可以開(kāi)始向其寫(xiě)入數(shù)據(jù)了。如果到達(dá)了緩沖區(qū)的結(jié)尾,則芯片會(huì)自動(dòng)返回到緩沖區(qū)的開(kāi)頭。數(shù)據(jù)會(huì)繼續(xù)寫(xiě)入到緩沖區(qū)中,直到#CS引腳上產(chǎn)生上跳沿為止。 2. 緩沖向主存儲(chǔ)器頁(yè)編程(帶預(yù)擦除操作碼:緩沖區(qū)1 83H 緩沖區(qū)2 86H) 被寫(xiě)入到緩沖中的數(shù)據(jù)可以被編程到主存儲(chǔ)器中。先寫(xiě)入操作碼,對(duì)于頁(yè)容量為528字節(jié)的情況,隨后是3字節(jié)地址(2個(gè)無(wú)關(guān)位,12位頁(yè)地址 PA11~PA0 與10個(gè)無(wú)關(guān)位)。而對(duì)于容量為512字節(jié)的情況,操作碼寫(xiě)入后,隨后是3字節(jié)地址(3個(gè)無(wú)關(guān)位,12位的地址位 A20~A9 與9個(gè)無(wú)關(guān)位)。當(dāng)#CS引腳的上跳沿時(shí),芯片會(huì)先擦除主存儲(chǔ)器中所選中的頁(yè)(擦除后都為邏輯1),然后將緩沖區(qū)中的數(shù)據(jù)編程到頁(yè)中。擦除與編程操作都是內(nèi)部進(jìn)行的,并會(huì)在一定時(shí)間內(nèi)完成。在這期間,狀態(tài)寄存器與RDY/#BUSY都會(huì)指示芯片處于忙狀態(tài)。 3. 緩沖區(qū)向主存儲(chǔ)器頁(yè)編程(無(wú)預(yù)擦除操作碼:緩沖區(qū)1 88H 緩沖區(qū)2 89H) 主存儲(chǔ)器中已經(jīng)被擦除的頁(yè)可以通過(guò)此操作由緩沖區(qū)向其編程。與有預(yù)擦除的操作不同就在于它是無(wú)預(yù)擦除的。 4. 頁(yè)擦除(操作碼:81H) 頁(yè)擦除操作可以獨(dú)立對(duì)主存儲(chǔ)陣列中某一個(gè)頁(yè)進(jìn)行擦除,隨后可以對(duì)該頁(yè)進(jìn)行緩沖區(qū)向主存儲(chǔ)器頁(yè)編程(無(wú)預(yù)擦除)操作。對(duì)于頁(yè)容量為528字節(jié)的情況,先要寫(xiě)入操作碼,隨后是3字節(jié)地址(2個(gè)無(wú)關(guān)位,12位頁(yè)地址 PA11~P10 與10個(gè)無(wú)關(guān)位)。對(duì)于頁(yè)容量512字節(jié)的情況,也要先寫(xiě)入操作碼,隨后是3字節(jié)地址(3個(gè)無(wú)關(guān)位,12位頁(yè)地址 A20~A9 與9個(gè)無(wú)關(guān)位)。當(dāng)#CS引腳上產(chǎn)生上跳沿時(shí),芯片會(huì)擦除所選中的頁(yè)(擦除后都為邏輯1)。擦除操作是內(nèi)部進(jìn)行的,并會(huì)在一定時(shí)間內(nèi)完成。在這期間,狀態(tài)寄存器與RDY/#BUSY都會(huì)指示芯片處于忙狀態(tài)。 5. 塊擦除(操作碼:50H) 塊擦除操作可以使塊內(nèi)的8個(gè)頁(yè)一次全部擦除。這個(gè)命令可以用在有大量數(shù)據(jù)需要寫(xiě)入的時(shí)候,可以避免多次調(diào)用寫(xiě)擦除命令。在頁(yè)容量為528字節(jié)時(shí),操作碼先要寫(xiě)入芯片,隨后是3字節(jié)地址(2個(gè)無(wú)關(guān)位,9位頁(yè)地址 PA11~PA3 ,13個(gè)無(wú)關(guān)位)。要進(jìn)行一次塊擦除操作(頁(yè)容量512字節(jié)),也要先寫(xiě)入操作碼,隨后是3字節(jié)地址(3個(gè)無(wú)關(guān)位,9位頁(yè)地址 A20~A12與12個(gè)無(wú)關(guān)位)。當(dāng)#CS上產(chǎn)生上跳沿時(shí),芯片將擦除選中的塊。擦除操作是內(nèi)部進(jìn)行的,并會(huì)在一定時(shí)間內(nèi)完成。在這期間,狀態(tài)寄存器與RDY/#BUSY都會(huì)指示芯片處于忙狀態(tài)。 塊擦除地址如下表所示:
6. 扇區(qū)擦除(操作碼:7CH) 扇區(qū)擦除命令可以獨(dú)立對(duì)主存儲(chǔ)器中的某一個(gè)扇區(qū)進(jìn)行擦除。一共有16個(gè)扇區(qū),每次扇區(qū)擦除操作只能對(duì)一個(gè)扇區(qū)進(jìn)行擦除。頁(yè)容量為528字節(jié)時(shí),要對(duì)扇區(qū)0A或扇區(qū)0B進(jìn)行擦除,需要先寫(xiě)入操作碼,隨后是3字節(jié)地址(2個(gè)無(wú)關(guān)位,9位頁(yè)地址 PA11~PA3 與13個(gè)無(wú)關(guān)位)。要擦除扇區(qū)1~15,也要先寫(xiě)入操作碼,隨后是3字節(jié)地址(2個(gè)無(wú)關(guān)位,4位頁(yè)地址PA11~PA8 與18個(gè)無(wú)關(guān)位)。頁(yè)容量為512字節(jié)時(shí),要對(duì)扇區(qū)0A或扇區(qū)0B進(jìn)行擦除,先寫(xiě)入操作碼,隨后是3字節(jié)地址(3個(gè)無(wú)關(guān)位,9位頁(yè)地址 A20~A12 與12個(gè)無(wú)關(guān)位)。要擦除扇區(qū)1~15,也要先寫(xiě)入操作碼,隨后是4字節(jié)地址(3個(gè)無(wú)關(guān)位,4位頁(yè)地址 A20~A17 與17個(gè)無(wú)關(guān)位)。擦除操作是內(nèi)部進(jìn)行的,并會(huì)在一定時(shí)間內(nèi)完成。在這期間,狀態(tài)寄存器與RDY/#BUSY都會(huì)指示芯片處于忙狀態(tài)。 7. 片擦除(操作碼:C7H、94H、80H與9AH) 主存儲(chǔ)器可以使用片擦除命令一次全部擦除。要進(jìn)行一次片擦除操作,先要寫(xiě)入操作碼,無(wú)須寫(xiě)入地址,交且操作過(guò)程中任何寫(xiě)入的數(shù)據(jù)都是無(wú)效的。操作碼寫(xiě)入后,#CS引腳上的上跳沿可以開(kāi)始擦除過(guò)程。在操作過(guò)程中,狀態(tài)寄存器指示芯片處于忙狀態(tài)。那些被保護(hù)或死鎖的扇區(qū)不受此命令的影響,其數(shù)據(jù)不會(huì)發(fā)生改變。只有那些沒(méi)有保護(hù)或死鎖的扇區(qū)會(huì)被擦除。芯片在進(jìn)行擦除操作的過(guò)程中#WP引腳可以設(shè)為有效,但是在內(nèi)部擦除周期完成前保護(hù)不會(huì)生效。 8. 通過(guò)緩沖區(qū)對(duì)主存儲(chǔ)器頁(yè)編程(操作碼:緩沖區(qū)1 82H 緩沖區(qū)2 85H) 這個(gè)命令是緩沖區(qū)寫(xiě)與緩沖區(qū)向主存儲(chǔ)器頁(yè)編程(帶預(yù)擦除)兩條命令的綜合。數(shù)據(jù)先從輸入引腳SI寫(xiě)入緩沖區(qū)1或2,再?gòu)木彌_區(qū)向指定的頁(yè)編程。在頁(yè)容量為528字節(jié)時(shí),要進(jìn)行一次此操作,先要寫(xiě)入操作碼,再將數(shù)據(jù)寫(xiě)入到緩沖區(qū)中,然后向芯片寫(xiě)入3字節(jié)地址(2個(gè)無(wú)關(guān)位,12位頁(yè)地址 PA11~PA0 與10位緩沖區(qū)地址 BFA9~BFA0)。在頁(yè)容量為512字節(jié)時(shí),要進(jìn)行此操作,也要先將操作碼寫(xiě)入,再將數(shù)據(jù)寫(xiě)入到緩沖區(qū)中,隨后是3字節(jié)地址(3個(gè)無(wú)關(guān)位,12位頁(yè)地址 A20~A9 與9位緩沖區(qū)地址 BFA8~BFA0)。所有的地址字節(jié)都被寫(xiě)入后,就可以通過(guò)輸入引腳向芯片寫(xiě)入數(shù)據(jù)了。當(dāng)#CS引腳上出現(xiàn)上跳沿時(shí),芯片先會(huì)擦除主存儲(chǔ)器所選中的頁(yè),然后將存在緩沖區(qū)中的數(shù)據(jù)編程到頁(yè)中去。編程操作是在芯片內(nèi)部進(jìn)行的,并會(huì)在一定時(shí)間內(nèi)完成。在這期間,狀態(tài)寄存器與RDY/#BUSY都會(huì)指示芯片處于忙狀態(tài)。 (8)扇區(qū)保護(hù) AT45DB161D提供硬件與軟件兩種方法對(duì)扇區(qū)進(jìn)行保護(hù),以使其避免數(shù)據(jù)的破壞。軟件的方法是通過(guò)軟件命令來(lái)實(shí)現(xiàn)扇區(qū)保護(hù)的使能與禁止的。而硬件的方法則是通過(guò)使用#WP引腳來(lái)實(shí)現(xiàn)的。通過(guò)“扇區(qū)保護(hù)寄存器”對(duì)哪一個(gè)扇區(qū)保護(hù)或不保護(hù)進(jìn)行選擇。要知道某一個(gè)扇區(qū)是否有保護(hù),可以查詢(xún)狀態(tài)寄存器。 1. 扇區(qū)保護(hù)的軟件方法 1)扇區(qū)保護(hù)使能命令(操作碼:3DH-2AH-7FH-A9H) 指定的扇區(qū)通過(guò)使扇區(qū)保護(hù)使能命令可使其在編程與擦除操作中得以保護(hù)。要采用方法使能扇區(qū)保護(hù),#CS引腳必須處于有效狀態(tài),從輸入引腳SI寫(xiě)入4字節(jié)命令序列。寫(xiě)入后,#CS引腳轉(zhuǎn)為無(wú)效狀態(tài),此時(shí)扇區(qū)保護(hù)就被使能了。 扇區(qū)保護(hù)使能命令的時(shí)序圖: 2)扇區(qū)保護(hù)禁止命令(操作碼:3DH-2AH-7FH-9AH) 用軟件方法來(lái)禁止扇區(qū)保護(hù)時(shí),除了寫(xiě)入的操作碼序列不事,其它與扇區(qū)保護(hù)使能命令是相同的。 扇區(qū)保護(hù)禁止命令的時(shí)序圖:
3)軟件控制保護(hù)的各個(gè)方面 軟件控制保護(hù)在#WP沒(méi)有或不能被單片機(jī)控制的情況下是很有用的。在這種情況下,#WP可以懸空(#WP引腳在內(nèi)部拉高),扇區(qū)保護(hù)可以由以上兩種命令來(lái)控制。 (9)保護(hù)的硬件控制 #WP引腳設(shè)為有效狀態(tài)后,在扇區(qū)保護(hù)寄存器中設(shè)置為保護(hù)的扇區(qū)及扇區(qū)保護(hù)寄存器自身在編程與擦除操作中可以得到保護(hù)。扇區(qū)保護(hù)寄存器與設(shè)置為保護(hù)的任何一個(gè)扇區(qū),都不能被編程或擦除。要改變扇區(qū)保護(hù)寄存器的值只能將#WP設(shè)為無(wú)效。如果#WP被接到地,扇區(qū)保護(hù)寄存器的內(nèi)容不能被改變。如果#WP被設(shè)為無(wú)效或接到VCC,則其內(nèi)容可以被改變。 #WP會(huì)使保護(hù)的軟件控制方法無(wú)效。例如:如果扇區(qū)原先并沒(méi)有被扇區(qū)保護(hù)使能命令保護(hù),那么簡(jiǎn)單的把#WP設(shè)為有效狀態(tài)就可以使能扇區(qū)保護(hù)。當(dāng)#WP引腳設(shè)為有效狀態(tài)而扇區(qū)保護(hù)使能命令沒(méi)有執(zhí)行,扇區(qū)保護(hù)不會(huì)被使能。如果在#WP引腳設(shè)為有效狀態(tài)前扇區(qū)保護(hù)使能命令被執(zhí)行了,那么只簡(jiǎn)單地將#WP設(shè)為無(wú)效并不能禁止扇區(qū)保護(hù)。在這種情況下,扇區(qū)保護(hù)禁止命令需要在#WP引腳無(wú)效時(shí)執(zhí)行來(lái)使扇區(qū)保護(hù)禁止。在#WP引腳為有效時(shí),扇區(qū)保護(hù)禁止命令會(huì)被忽略。 1. 扇區(qū)保護(hù)寄存器 非易揮發(fā)的(掉電不丟失)扇區(qū)保護(hù)寄存器指示哪些扇區(qū)被保護(hù)或未被保護(hù)。扇區(qū)保護(hù)寄存器包括16個(gè)字節(jié),從第0到第15字節(jié)的不同值確定了扇區(qū)0到15是否被保護(hù)。扇區(qū)保護(hù)寄存器是可以由用戶(hù)修改的,但在生新程序前必須先擦除。 扇區(qū)保護(hù)寄存器: 扇區(qū)0(0A,0B)
| | | | | | | | | | | | | | | | | | | | | | | | | | | | 扇區(qū)0A(第0~7頁(yè)),0B(第8~255頁(yè)) | | | | | |
注:從ATMEL出廠(chǎng)后0~15字節(jié)默認(rèn)值為00H。 1)擦除扇區(qū)保護(hù)寄存器命令(操作碼:3DH-2AH-7FH-CFH) 為了修改扇區(qū)保護(hù)寄存器的值,必須先使用擦除扇區(qū)保護(hù)寄存器命令將其擦除。 要擦除扇區(qū)保護(hù)寄存器,#CS必須設(shè)置為有效,然后將4字節(jié)的操作碼序列寫(xiě)入芯片。在操作碼寫(xiě)入后,需要將#CS設(shè)置為無(wú)效,以初始化一個(gè)擦除操作。扇區(qū)保護(hù)寄存器的擦除需要一定的時(shí)間,此期間狀態(tài)寄存器會(huì)指示芯片處于忙狀態(tài)。如果在進(jìn)行擦除的過(guò)程中掉電,則扇區(qū)保護(hù)寄存器的擦除得不到保證。 擦除扇區(qū)保護(hù)寄存器命令的時(shí)序圖: 2)扇區(qū)保護(hù)寄存器編程命令(操作碼:3DH-2AH-7FH-FCH) 在扇區(qū)保護(hù)寄存器被擦除后,就可以使用扇區(qū)保護(hù)寄存器編程命令對(duì)其進(jìn)行重新編程。 要對(duì)扇區(qū)保護(hù)寄存器進(jìn)行編程,必須先將#CS設(shè)為有效,從SI引腳寫(xiě)入4字節(jié)操作碼序列。寫(xiě)入后,再將要寫(xiě)入扇區(qū)保護(hù)寄存器的內(nèi)容寫(xiě)入。扇區(qū)保護(hù)寄存器中包括有16個(gè)字節(jié),所以要寫(xiě)入16個(gè)字節(jié)。每個(gè)字節(jié)對(duì)應(yīng)對(duì)寄存器中的每個(gè)單元。 16個(gè)字節(jié)被寫(xiě)入后,#CS引腳需要設(shè)為無(wú)效以初始化一個(gè)編程周期。編程過(guò)程需要一定的時(shí)間,在此期間狀態(tài)寄存器指示芯片處于忙狀態(tài)。如果在進(jìn)行編程的過(guò)程中掉電,則扇區(qū)保護(hù)寄存器中的內(nèi)容的修改得不到保證。 如果在#CS引腳無(wú)效以前沒(méi)有寫(xiě)入適當(dāng)數(shù)量的字節(jié),則沒(méi)有字節(jié)與其相對(duì)應(yīng)的寄存器單元所對(duì)應(yīng)扇區(qū)保護(hù)狀態(tài)的改變不能保證。 如果扇區(qū)保護(hù)寄存器中的字節(jié)不是00H或FFH,則相應(yīng)單元所對(duì)應(yīng)的扇區(qū)保護(hù)狀態(tài)的改變不能保證。 扇區(qū)保護(hù)寄存器編程命令利用內(nèi)部SRAM數(shù)據(jù)緩沖區(qū)1來(lái)實(shí)現(xiàn)編程操作。緩沖區(qū)1的數(shù)據(jù)在命令執(zhí)行完畢后會(huì)恢復(fù)回到原來(lái)的數(shù)據(jù)。 扇區(qū)保護(hù)寄存器編程命令的時(shí)序圖: 3)扇區(qū)保護(hù)寄存器讀取命令(操作碼:32H) 要讀取扇區(qū)保護(hù)寄存器,首先要將#CS引腳設(shè)為有效,從SI引腳寫(xiě)入操作碼與三個(gè)字節(jié)。寫(xiě)入后,芯片便可以從SO引腳輸出數(shù)據(jù)。第一個(gè)字節(jié)是扇區(qū)0的內(nèi)容,第二個(gè)字節(jié)是扇區(qū)1的內(nèi)容,最后一個(gè)字節(jié)是扇區(qū)15的內(nèi)容。在最后一個(gè)字節(jié)輸出后,再輸出的數(shù)據(jù)就為未定義數(shù)據(jù)。最后必須要將#CS設(shè)為無(wú)效狀態(tài)以終止扇區(qū)保護(hù)寄存器讀取操作,并使輸出轉(zhuǎn)為高阻態(tài)。 扇區(qū)保護(hù)寄存器的時(shí)序圖: 4)扇區(qū)保護(hù)寄存器的各個(gè)方面 扇區(qū)保護(hù)寄存器約可以擦/寫(xiě)10000次。使用者會(huì)很關(guān)心芯片在其應(yīng)用系統(tǒng)中的使用壽命。如果應(yīng)用系統(tǒng)中需要多于10000次對(duì)扇區(qū)保護(hù)寄存器的修改,因?yàn)樗枰R時(shí)性地對(duì)某一個(gè)扇區(qū)不加以保護(hù),那么應(yīng)用系統(tǒng)就要限制自身的使用。要合理地設(shè)計(jì)應(yīng)用系統(tǒng),以使其對(duì)扇區(qū)保護(hù)寄存器的個(gè)性不超過(guò)10000次。 (10)安全措施 1)扇區(qū)死鎖命令(3DH-2AH-7FH-30H) 這一命令應(yīng)用于商業(yè)上。芯片可以通過(guò)扇區(qū)死鎖命令對(duì)某一個(gè)扇區(qū)進(jìn)行死鎖,從而使扇區(qū)變?yōu)橹蛔x的。這在應(yīng)用中是很有用的,用來(lái)存儲(chǔ)代碼或安全信息。當(dāng)一個(gè)扇區(qū)被死鎖后,它就不能再被擦除或編程,也不能解鎖。 要執(zhí)行扇區(qū)死鎖命令,#CS引腳要設(shè)為有效狀態(tài),寫(xiě)入4字節(jié)操作碼序列,一定按正確的順序?qū)懭搿?xiě)入后,再寫(xiě)入3字節(jié)地址。在地址寫(xiě)入后,再將#CS引腳設(shè)為無(wú)效狀態(tài)以初始化一個(gè)內(nèi)部死鎖操作。 在進(jìn)行死鎖操作的過(guò)程中,狀態(tài)寄存器指示芯片處于忙狀態(tài)。如果操作過(guò)程中掉電,則死鎖操作得不到保證。在這種情況下,使用者應(yīng)讀取扇區(qū)死鎖寄存器以確定相應(yīng)的扇區(qū)是否已經(jīng)死鎖。 扇區(qū)死鎖命令的時(shí)序圖: 1. 扇區(qū)死鎖寄存器 扇區(qū)死鎖寄存器中包含16個(gè)字節(jié),如下表所示: 扇區(qū)0(0A,0B)
| | | | | | | | | | | | | | | | | | | | | | | | | | | | 扇區(qū)0A(第0~7頁(yè)),0B(第8~255頁(yè)) | | | | | |
2. 扇區(qū)死鎖寄存器讀取命令(操作碼:35H) 扇區(qū)死鎖寄存器中的數(shù)據(jù)可以讀取以確定扇區(qū)是否被死鎖。要讀取扇區(qū)死鎖寄存器,#CS引腳必須設(shè)為有效,通過(guò)SI引腳寫(xiě)入操作碼與3個(gè)字節(jié)。寫(xiě)入后,扇區(qū)死鎖寄存器中的數(shù)據(jù)將從SO引腳輸出。每一個(gè)字節(jié)是扇區(qū)0(0A,0B)的內(nèi)容,第二個(gè)字節(jié)是扇區(qū)1的內(nèi)容,最后一個(gè)字節(jié)(第16個(gè)字節(jié))是扇區(qū)15的內(nèi)容。16個(gè)字節(jié)都被讀出后,如果產(chǎn)生時(shí)鐘信號(hào),則會(huì)在SO引腳輸出未定義數(shù)據(jù)。 將#CS設(shè)為無(wú)效以終止扇區(qū)死鎖寄存器讀取操作,并將SO引腳轉(zhuǎn)為高阻態(tài)。 扇區(qū)死鎖寄存器讀取命令的時(shí)序圖: 2)安全寄存器 芯片包含有一個(gè)序列化的安全寄存器,用來(lái)存儲(chǔ)唯一的設(shè)備序列碼或密鑰。安全寄存器包含128個(gè)字節(jié),被分為兩個(gè)部分。前64字節(jié)(0~63)是一次性的用戶(hù)編程空間。一旦這64個(gè)字節(jié)被編程,則以后不能再對(duì)其進(jìn)行重編程。后64個(gè)字節(jié)(64~127)由ATMEL編程,以使其包含唯一的數(shù)值。出廠(chǎng)時(shí)編程的數(shù)據(jù)是固定不變的,不能被更改。 1. 安全寄存器編程命令(操作碼:9BH-00H-00H-00H) 安全寄存器中的用戶(hù)可編程部分在編程前是不需要擦除的。 要對(duì)安全寄存器進(jìn)行編程,先要將#CS引腳設(shè)為有效,寫(xiě)入4字節(jié)的操作碼序列。寫(xiě)入后,就可以向芯片寫(xiě)入64字節(jié)的用戶(hù)可編程部分的數(shù)據(jù)。在數(shù)據(jù)寫(xiě)入后,#CS引腳必須設(shè)為無(wú)效,來(lái)初始化一個(gè)編程周期。安全寄存器的編程需要一定的時(shí)間,在此期間狀態(tài)寄存器將指示芯片處于忙狀態(tài)。如果此過(guò)程中掉電,則64字節(jié)的用戶(hù)可編程部分的數(shù)據(jù)不能得到保證。 如果在#CS設(shè)為無(wú)效以前,沒(méi)有寫(xiě)入64個(gè)字節(jié),則沒(méi)有被寫(xiě)入的寄存器單元的值不能得到保證。例如,如果只有兩個(gè)字節(jié)寫(xiě)入,而不是完整的64個(gè)字節(jié),則用戶(hù)可編程部分的后62個(gè)字節(jié)就得不到保證。而如果寫(xiě)入了多于64個(gè)字節(jié),則數(shù)據(jù)會(huì)自動(dòng)返回到開(kāi)頭的位置。而安全寄存器中的用戶(hù)可編程部分只能被編程一次。因此,不可能先編程前兩個(gè)字節(jié),而隨后再編程后62個(gè)字節(jié)。 安全寄存器編程命令利用SRAM數(shù)據(jù)緩沖區(qū)1來(lái)實(shí)現(xiàn)編程。操作完成后,緩沖區(qū)1會(huì)恢復(fù)到原先的數(shù)據(jù)。 安全寄存器編程命令的時(shí)序圖: 2. 安全寄存器讀取命令(77H) 要對(duì)安全寄存器進(jìn)行讀取時(shí),先將#CS引腳設(shè)為有效,寫(xiě)入操作碼與3個(gè)字節(jié)。寫(xiě)入后,在時(shí)鐘信號(hào)的作用下,數(shù)據(jù)將從SO引腳輸出。所有的數(shù)據(jù)都被輸出后,如果時(shí)鐘信號(hào)仍然存在,則會(huì)從SO引腳輸出未定義數(shù)據(jù)。將#CS引腳設(shè)為無(wú)效就會(huì)終止安全寄存器讀取操作并將SO引腳轉(zhuǎn)為高阻態(tài)。 安全寄存器讀取命令的時(shí)序圖: (11)附加命令 1)主存儲(chǔ)器頁(yè)到緩存區(qū)轉(zhuǎn)移命令(緩沖區(qū)1 53H 緩沖區(qū)2 55H) 2)主存儲(chǔ)器頁(yè)和緩存區(qū)比較命令(緩沖區(qū)1 60H 緩沖區(qū)2 61H) 3)讀取狀態(tài)寄存器命令(操作碼:D7H) 4)節(jié)電模式和退出節(jié)電模式(操作碼:B9H/ABH)
(12)命令表
|