芯片工作原理與硬件連接
AT45DB041中的數據按頁存放,主存***2048頁,每頁 264字節,所以總容量為528K字節(約4M比特)。存放在主存中的數據掉電不丟失。除了主存以外,AT45DB041還有兩個容量為264字節的數據緩存。緩存可以用作主存與外部進行數據交換時的緩沖區域,也可以暫存壹些臨時數據。緩存讀寫方便迅速,但掉電數據會丟失。AT45DB041數據讀寫采用串行方式,讀寫速度快,從頁到緩存的傳輸時間為80 s左右,並且兼容CMOS和TTL輸入和輸出。
AT45DB041通過片選管腳/CS使能,通過串行輸出(SO)和串行輸入(SI)進行數據讀和寫。由串行時鐘(SCK)對讀寫進行控制。
設備運行受微處理器的指令控制。壹條有效的指令起始於/CS管腳的下降沿,並跟隨相應的8位操作碼和指定的緩存或主存地址碼。當/CS管腳為低時,輪換時鐘管腳(SCK)控制操作碼和指定的緩存或主存地址碼通過SI口的載入。所有的指令、地址和數據都從高字節開始傳送。
數據讀取
讀緩存:通過不同的操作碼可選擇讀取兩個緩存中的其中壹個(操作碼54H用作讀緩存1,而操作碼56H用作讀緩存2)。為了實現讀緩存的操作,在8位操作碼後必須跟有15位任意碼,9位地址碼和8位任意碼。其中9位地址碼(BFA8-BFA0)被用作指定要讀取的首字節。在輪換時鐘SCK的控制下,從SI載入操作碼、地址碼、任意碼。當載入結束後,在SCK輪換時鐘的控制下,緩存中的數據就可以從SO讀出。當讀到緩存的末尾時,設備將繼續從緩存的開端重讀。在這整個過程中/CS必須保持低電平。讀緩存結束後,/CS上壹個從低到高的電平跳變將終止讀操作。
主存頁到緩存的傳送:壹頁數據可以從主存傳至緩存1或2。8位操作碼(53H用於緩存1,55H用於緩存2)後跟有4位保留位,11位用於指定目的頁的地址位(PA10-PA0),和9位任意碼,在輪換時鐘SCK的控制下從SI載入。在這壹過程中/CS管腳必須保持低電位。當載入結束後,在/CS上檢測到壹個由低到高的電平跳變後,主存頁中的數據開始傳送至緩存。在數據傳送的過程中,狀態寄存器將指示狀態忙。
數據寫入
寫緩存:在SCK的控制下,8位的操作碼(84H用於緩存1,87H用於緩存2)後面跟著15位任意碼和9位地址碼(BFA8-BFA0)由SI載入,其中9位地址碼指定了緩存中被寫的首字節,數據緊隨著地址碼輸入。/CS上壹個由低到高的跳變,將結束寫緩存操作。
帶有內置擦除的緩存至主存頁的傳送:8位的操作碼(83H用於緩存 1,86H用於緩存2)後跟有4位保留位,11位指定要寫入的主存頁的地址碼(PA10-PA0),和9位任意碼,在輪換時鐘SCK的控制下從SI載入。當/CS上檢測到壹個由低到高的跳變時,器件將首先擦除被選中的主存頁,然後將儲存在緩存中的數據寫入該頁。擦除和寫入的過程都是自動進行的,這壹進程不超過20ms。在這個時間裏,狀態寄存器將指示狀態忙。狀態寄存器值讀取:讀狀態寄存器的值可以用來確定設備的忙閑狀態。忙閑狀態通過寄存器的第7位指示。如果第7位為1,則設備位於空閑狀態並可接收下壹條指令。如果為0,則設備忙。在載入8位操作碼57H後,從SO上可以讀出1字節的狀態寄存器的值。
寫保護(/WP) B041具有的寫保護功能僅對主存的前256頁有效。當/WP管腳為低電平時,FLASH禁止對主存的前256頁進行寫操作(只讀),但主存的其它頁並不受影響,仍然可以進行讀寫。AT45DB041的選擇性寫保護功能為用戶的使用提供了很大的便利,用戶可以將非常重要的數據,如系統參數、密碼和身份信息等存入主存的前256頁,並將/WP置低,使這些數據處於寫保護狀態,以保證這些數據不會被誤擦除。而與此同時,用戶仍能對其它地址進行讀寫。如果用戶將 /WP管腳懸空或接地,FLASH將不具備寫保護功能,所有的主存頁都可進行讀寫。
復位(/RESET) B041采用低電平復位,即當/RESET管腳出現低電平(<0.6V)時,芯片停止工作,待/RESET管腳的電平被拉高(>2.0V) 後,恢復正常工作。為了避免接通電源時,由於電壓不穩可能會對芯片正常工作造成影響,所以在使用時,最好在系統開機後延時10ms,再對FLASH進行操作。
與微處理器的接口
B041外圍電路非常簡單,可以很方便地與微控制器連接。SO、SI、SCK、/CS,/WP分別與微處理器的通用I/O相連即可。
軟件設計
下面主要對AT45DB041的數據讀寫作簡要介紹。
AT45DB041進行數據讀寫主要包括操作碼、保留位、地址碼、任意碼、用戶數據的載入和用戶數據和狀態字的讀出兩部分。
數據載入子程序
要載入的數據(操作碼、保留位、地址碼、任意碼和用戶數據)寄存從R0開始的地址單元裏
;數據個數放在R6中 DADAIN:PUSH ACC
CLR CS ;使能R0
TRSMIT:MOV A,@R0
MOV R7,#08H 1字節=8比特
LOOPT: RLC A ;將要發送的數據由高位到低位依次移出
CLR SCK
MOV SI, 將1比特的數據送入SI
NOP
SETB SCK ;在SCK的上升沿AT45DBO41從SI上取數
DJNZ R7,LOOPT ;壹字節的數據發送完畢
INC R0
DJNZ R6,TRSMIT
SETB CS ;所有數據發送完畢
POP ACC
RET
數據讀取子程序:
;將取出的數據(用戶數據和狀態字)寄存從R1開始的地址單元裏
;數據個數放在R6中
DATAOUT:PUSH ACC
CLR, A
CLR C
CLR CS ;使能
RECEIVE:CLR SCK
MOV R7,#08H
LOOPR: SETB SCK 在SCK的上升沿AT45DB041將數據放在S0上
MOV C,SO ;將1比特的數據取出
NOP
SETB SCK
RLC A
DJNZ R7,LOOPR ;壹字節的數據接收完畢
MOV @R1,A
INC R1
DJNZ R6,RECEIVE
SETB CSp ;所有數據接收完畢
POP ACC
RET