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