自從有了存儲器93C46,24C01,終于有了比較理想的不擔心失電丟數據的存儲器了!
單片機也有了內部儲存用戶數據區域,通過IAP操作,可實現數據長久保存,不用外掛存儲器啦!
而市場上也有了號稱與單片機系統速度同步的鐵電存儲器!
百花齊放的時代,有了更多選擇!
單片機內部的可改寫儲存區,對一些大量的一次性寫入數據來說,的確很不錯!但是,寫入之前必須擦除,且一次擦除512字節!對一些經常性需要改這改那的場合,就遇上一個小小的不方便,哪怕修改一個數,也得擦除512字節!與鐵電存儲器比較一下,才發現24C之類的覆蓋改寫是多么的寶貴!它不需任何擦除就可任意改寫任一個數據!完全可以按照需要去選擇.
最近做項目時,就遇上了這個問題.儲存區域保存有幾個手機號碼,及一些語句,運行中隨時需要更改某一個號碼,或某一語句,處理起來不方便啦! --- 這時,覆蓋改寫是一大優勢!
其次,存儲器與單片機可以分離,也就方便通過其它工具(例如電腦或者編程器)進行批量操作與數據更新!
于是,也買來些FM24C128A鐵電存儲器,并且進行實際測試.
盡管網上有許多文章以及器件手冊,可以參考學習,但是,沒有實踐的知識就都是人家的!
在測試中,按照最快速度去寫入/讀出,結果,一開始就發現有錯誤出現,(見圖).
過去做一些儀表項目,存儲器都是24C02便足夠,而24C128容量就大了許多,前者僅僅256字節,后者是16000字節!并且,說是很快很快也心存疑惑,到底有多快?
經過多次實驗,我使用的單片機一條指令執行時間為0.25us,首先發現是讀出不用任何延時也沒有什么問題,足夠快!隨后發現是每一次寫完8位數據后,需要有一個延時! 于是.從小到大,逐步增加延時時間,當時間到達近1ms時,就完全正常了!
實驗程序如下:
;==============================
;//FM24C128A讀寫測試程序 bjxs1508 2018-10-10 4:08
;-----------------------------------------------------------
P24DA EQU P12 ;引腳
P24CK EQU P13
P24DAM EQU P12M;工作模式寄存器
P24CKM EQU P13M
FC EQU C ;系統C標志
;--------------------------------
ARDSH DS 1;地址H
ARDSL DS 1;地址L
R DS 1;延時
TEMP DS 1;延時
RE24 DS 1;存放讀出數據
WR24 DS 1;存放待寫數據
;==============================
;******程序開始*******
.CODE
;;;;;; 初始化略;;;;;;;;;
;==============================
B_LOOP:
@RST_WDT
CALL B_WR24C ;寫入256個字節:連續寫入成功!
CALL B_RED24C ;讀取256個字節;連續讀出成功!
JMP B_LOOP
;================================
B_RED24C:
ZMN ARDSH,#3FH ;24C128最后1頁256字節!
ZMN ARDSL,#0 ;低8位地址00開始使用
ZHLN #1,#00H
ZB0 FGIE;開中斷
@@:
CALL B_RED24Z
MOV_ @HL,RE24
ZM0 RE24
INCMS L
INCMS ARDSL
JMP @B
RET
;===============================
B_WR24C:;寫入數據
ZB0 FGIE;禁止中斷
ZMN ARDSH,#3FH;24C128最后1頁256字節!
ZMN ARDSL,#0
@@:
MOV_ WR24,#3EH ;256字節連續寫入3EH
CALL B_WRE24C
CALL B_Delms ;960us延時僅此處調用!
INCMS ARDSL
JMP @B
RET
;============================
;FM24C128A讀寫子程序
;============================
B_WRE24C:
MOV_ R,#08H;防止出錯,重復次數
B_WR24START:
CALL B_START
BS0 FC
JMP B_RETESWR;如果總線無效跳轉
MOV A,#0A0H ;0A0H 指定寫操作
CALL B_Send ;發送器件地址
BS0 FC
JMP B_WRTOP ;沒有應答跳轉
MOV A,ARDSH ;發送地址高字節
CALL B_Send
BS0 FC
JMP B_WRTOP ;沒有應答跳轉
MOV A,ARDSL ;發送低字節地址
CALL B_Send
BS0 FC
JMP B_WRTOP ;沒有應答跳轉
MOV A,WR24 ;得到數據
CALL B_Send ;發送數據
BS0 FC
JMP B_WRTOP ;沒有應答跳出
ZB0 FC ;清除錯誤標志
B_WRTOP:
CALL B_STOP
BS1 FC
JMP B_EXIT24B
B_RETESWR:
DECMS R
JMP B_WR24START
B_EXIT24B:
RET
;===============================
B_RED24Z:
MOV_ R,#08H ;重復次數
B_Reta:
CALL B_START
BS0 FC
JMP B_RET255
MOV A,#0A0H ;指定寫操作
CALL B_Send
BS0 FC
JMP B_RETOP
MOV A,ARDSH
CALL B_Send
BS0 FC
JMP B_RETOP
MOV A,ARDSL
CALL B_Send
BS0 FC
JMP B_RETOP
JMP B_CRERE
B_RETOP:
CALL B_STOP
BS1 FC
JMP B_EXITB
B_RET255:
DECMS R
JMP B_Reta
B_EXITB:
RET
;==============================
B_CRERE:
MOV_ R,#08H ;防止出錯,重復次數
B_CRE24:
CALL B_START
BS0 FC
JMP B_CRE250
MOV A,#0A1H;指定讀操作
CALL B_Send
BS0 FC
JMP B_CTOP
CALL B_RE8B
CALL B_NAK
ZB0 FC
B_CTOP:
CALL B_STOP
BS1 FC
JMP B_EndRE
B_CRE250:
DECMS R
JMP B_CRE24
B_EndRE:
RET
;===============================
B_Send:
MOV RE24,A
MOV_ SSS,#8
ZB1 P24DAM
B_Sen01:
RLCM RE24
BS0 FC
ZB1 P24DA
BS1 FC
ZB0 P24DA
NOP
ZB1 P24CK
NOP
ZB0 P24CK
DECMS SSS
JMP B_Sen01
ZB0 P24DAM
NOP
ZB1 P24CK
NOP
ZB0 FC
BS0 P24DA
ZB1 FC
ZB0 P24CK
RET
;----------------------------------------------------------------
B_RE8B:
ZB0 P24DAM
MOV_ SSS,#8
B_RE8S:
NOP
ZB1 P24CK
NOP
ZB0 FC
BS0 P24DA
ZB1 FC
RLCM RE24
ZB0 P24CK
DECMS SSS
JMP B_RE8S
RET
;===============================
B_START:
ZB1 P24DAM
ZB1 P24CKM
ZB1 P24DA
ZB1 P24CK
NOP
BS1 P24DA
JMP B_ErrE
ZB0 P24DA
NOP
ZB0 P24CK
NOP
ZB0 FC
RET
B_ErrE:
NOP
ZB1 FC
RET
;----------------------------------------------------------
B_STOP:
ZB1 P24DAM
ZB0 P24DA
NOP
ZB1 P24CK
NOP
ZB1 P24DA
NOP
RET
;=============================
B_NAK:
ZB1 P24DAM
ZB1 P24DA
NOP
ZB1 P24CK
NOP
ZB0 P24CK
RET
;=============================
B_Delms:;時間太短會失敗!---僅僅一處調用!
Z2MN TEMP,R,#15,#0H ;這個才會成功! 2018-10-10 0:42
@@: ;15*256*0.25=960us
DECMS R
JMP @B
DECMS TEMP
JMP @B
RET
;**********************************
ENDP
;********************************** |