?? emc-epprom.txt
字號:
freego 發表于 2002-4-21 12:53 侃單片機 ←返回版面
小弟提問?
1、匠人兄在“TX”中讀得應答位,小弟沒看懂如果讀得值為“1”即沒有應答該如何處理?
2、匠人兄在“WRPAGE”中將寫入次數循環“NUM_24”次不知有否考慮當寫入字節數超越頁界(如每頁16BYTES、32BYTES)時數據地址溢出而覆蓋頁首的問題?
程序匠人 發表于 2002-4-21 15:30 侃單片機 ←返回版面
答復freego
1、匠人兄在“TX”中讀得應答位,小弟沒看懂如果讀得值為“1”即沒有應答該如何處理?
答:這段程序中,沒有對可能的錯誤做處理(因為我的設計中,I2C總線上只掛了一個器件),在“TX”中讀得應答位,只是為了輸出一個CLOCK。
2、匠人兄在“WRPAGE”中將寫入次數循環“NUM_24”次不知有否考慮當寫入字節數超越頁界(如每頁16BYTES、32BYTES)時數據地址溢出而覆蓋頁首的問題?
答:既然是頁寫/頁讀,當然只針對頁內進行操作了。如果要跨頁,我不是還有單字節寫/讀程序嗎?只要再做一段循環程序去調用即可。
歡迎大家把這段程序繼續完善。
簽名:
如果你的‘芯’是一座作坊,
我愿做那不知疲倦的程序匠……
zhhch 發表于 2002-4-21 23:40 侃單片機 ←返回版面
向程序匠人學習,現貼上我寫24xx讀寫程序,以供交流。我有emc_wice專業漢化版(本人漢化),歡迎索取!
該程序系51程序改寫而來,我現在正用著呢!
;=====================寫EEPROM程序 ========================================
;功能:從KEY_BUF取數據,寫入EEPROM中SUB_ADR,連續寫BYTE_CNT個字節
;入口:SUB_ADR 出口:NONE
;影響資源:A,DATA_BUF,P6,STU,BIT_CNT,BYTE_CNT,SUB_ADR
;==========================================================================
WR_UEE: ;將KEY_BUF中客密碼寫EEPROM
MOV SUB_ADR,@U_EE
MOV BYTE_CNT,@0X06 ;設置字節計數器為6
JMP WR_EE
;------------------------------------------------------------------------
WR_SEE: ;將KEY_BUF中主密碼寫EEPROM
MOV SUB_ADR,@S_EE
MOV BYTE_CNT,@0X07 ;設置字節計數器為7
;------------------------------------------------------------------------
WR_EE:
MOV EEP6_BUF,EE ;保護EE口
BS EE,PW ;EEPROM上電
BC EE,WP ;清除EEPROM的寫保護
CALL BSTART ;啟動IIC
MOV A,@WREE ;發送寫器件地址
MOV DATA_BUF,A
CALL SENDBYTE
JBC STU,GP
JMP WR_RET ;無應答返回
MOV A,SUB_ADR ;發送寫單元地址
MOV DATA_BUF,A
CALL SENDBYTE
JBC STU,GP
JMP WR_RET ;無應答返回
MOV A,@KEY_BUF ;設置待寫數據區首址
MOV R4,A
WR_NEXT:
MOV A,R0
MOV DATA_BUF,A ;取待寫數據
CALL SENDBYTE
JBC STU,GP
JMP WR_RET ;無應答返回
INC R4
DJZ BYTE_CNT
JMP WR_NEXT
CALL BSTOP ;停止IIC
CALL DELAY10 ;延時10MS,等待數據寫完
WR_RET:
BC EE,PW ;EEPROM下電
;---------------------------------------------------------
IOR EE ;設置SDA為輸出
AND A,@0B11110111 ;**************************
IOW EE
;---------------------------------------------------------
MOV EE,EEP6_BUF ;恢復EE口現場
RET
;=====================讀EEPROM程序 ========================================
;功能:讀EEPROM,寫入PSW_BUF,連續寫BYTE_CNT個字節
;入口:SUB_ADR 出口:NONE
;影響資源:A,DATA_BUF,P6,STU,BIT_CNT,BYTE_CNT,SUB_ADR
;==========================================================================
RD_UEE: ;讀6位客密碼到PSW_BUF
MOV SUB_ADR,@U_EE
MOV BYTE_CNT,@0X05 ;設置字節計數器為6-1
JMP RD_EE
;------------------------------------------------------------------------
RD_SEE: ;讀7位密碼到PSW_BUF
MOV SUB_ADR,@S_EE
MOV BYTE_CNT,@0X06 ;設置字節計數器為7-1
;------------------------------------------------------------------------
RD_EE:
MOV EEP6_BUF,EE ;保護EE口
BS EE,PW ;EEPROM上電
BS EE,WP ;設置EEPROM的寫保護
CALL BSTART ;啟動IIC
MOV A,@WREE ;發送寫器件地址
MOV DATA_BUF,A
CALL SENDBYTE
JBC STU,GP
JMP RD_RET ;無應答返回
MOV A,SUB_ADR ;發送寫單元地址
MOV DATA_BUF,A
CALL SENDBYTE
JBC STU,GP
JMP RD_RET ;無應答返回
CALL BSTART ;重新啟動IIC
MOV A,@RDEE ;發送讀器件地址
MOV DATA_BUF,A
CALL SENDBYTE
JBC STU,GP
JMP RD_RET ;無應答返回
MOV A,@PSW_BUF ;設置讀出數據存放首址
MOV R4,A
RD_NEXT:
BC STU,GP ;連續接收BYTE_CNT-1字節數據
CALL RCVBYTE ;并發送應答信號
MOV A,DATA_BUF
MOV R0,A
INC R4
DJZ BYTE_CNT
JMP RD_NEXT
BS STU,GP ;接收最后一個字節數據
CALL RCVBYTE ;并發送非應答信號
MOV A,DATA_BUF
MOV R0,A
CALL BSTOP ;停止IIC
RD_RET:
BC EE,PW ;EEPROM下電
;---------------------------------------------------------
IOR EE ;設置SDA為輸出
AND A,@0B11110111 ;**************************
IOW EE
;---------------------------------------------------------
MOV EE,EEP6_BUF ;恢復EE現場
RET
;============================延時子程序====================================
;功能:短延時 入口:NONE 出口:NONE
;影響資源:A,TEMP ,STATUS
;==========================================================================
DELAY:
MOV A,@0X01
MOV TEMP,A
DJZ TEMP
JMP $-1
RET
;============================延時子程序10MS================================
;功能:延時 入口:NONE 出口:NONE
;影響資源:A,TEMP ,STATUS
;==========================================================================
DELAY10:
MOV A,@0X20
MOV TEMP,A
MOV A,@250
MOV TEMP1,A
DJZ TEMP1
JMP $-1
DJZ TEMP
JMP $-5
RET
;===============================啟用IIC總線================================
;功能:開啟IIC總線
;入口:NONE 出口:NONE SCL=0,SDA=0
;影響資源:A,P6,STU
;==========================================================================
BSTART:
BS EE,SDA ;拉高SDA和SCL
BS EE,SCL
CALL DELAY
BC EE,SDA ;拉低SDA,啟動IIC
CALL DELAY
BC EE,SCL ;拉低SCL
RET
;===============================關閉IIC總線================================
;功能:關閉IIC總線
;入口:NONE 出口:NONE ,SCL=1,SDA=1
;影響資源:A,P6,STU
;==========================================================================
BSTOP:
BC EE,SDA ;拉低SDA
BS EE,SCL ;拉高SCL
CALL DELAY
BS EE,SDA ;拉高SDA,停止IIC
CALL DELAY
RET
;======================送出一個字節數據,高位在前===========================
;功能:從MCU發送一個字節給EEPROM,并接收應答信號
;入口:發送位數放在DATA_BUF 出口:GP=0 表應答正確 GP=1 表應答錯誤
;影響資源:A,DATA_BUF,P6,STU,BIT_CNT
;==========================================================================
SENDBYTE:
MOV A,@0X08 ;準備位計數器為8
MOV BIT_CNT,A
SEND_B:
RLC DATA_BUF ;從DATA_BUF取數據送C
JBC STU,C ;C->SDA
BS EE,SDA
JBS STU,C
BC EE,SDA
CALL DELAY
BS EE,SCL ;拉高SCL,通知接受數據
CALL DELAY
BC EE,SCL ;拉低SCL,鉗住總線
DJZ BIT_CNT
JMP SEND_B ;8位未發送完,繼續發送
BS EE,SDA ;拉高SDA
;---------------------------------------------------------
IOR EE ;設置SDA為輸入
OR A,@0B00001000 ;**************************
IOW EE
;---------------------------------------------------------
BS EE,SCL ;拉高SCL,接收應答信號
CALL DELAY
JBC EE,SDA ;SDA->GP:=0,OK,=1,ERR
BS STU,GP
JBS EE,SDA
BC STU,GP
;---------------------------------------------------------
IOR EE ;設置SDA為輸出
AND A,@0B11110111 ;**************************
IOW EE
;---------------------------------------------------------
BC EE,SCL ;拉低SCL
BC EE,SDA ;拉低SDA
RET
;=====================接收一個字節數據,高位在前===========================
;功能:接收一個字節從EEPROM,并發送應答信號
;入口:接收數據放在DATA_BUF 出口:NONE
;影響資源:A,DATA_BUF,P6,STU,BIT_CNT
;==========================================================================
RCVBYTE:
MOV A,@0X08 ;準備位計數器為8
MOV BIT_CNT,A
BS EE,SDA
;---------------------------------------------------------
IOR EE ;設置SDA為輸入
OR A,@0B00001000 ;**************************
IOW EE
;---------------------------------------------------------
RCV_B:
BC EE,SCL ;拉低SCL
CALL DELAY
BS EE,SCL ;拉高SCL
CALL DELAY
JBC EE,SDA ;SDA->C
BS STU,C
JBS EE,SDA
BC STU,C
RLC DATA_BUF ;DATA_BUF<-C
DJZ BIT_CNT
JMP RCV_B ;8位未接收完,繼續接收
BC EE,SCL ;拉低SCL,準備發送應答信號
JBC STU,GP ;GP->SDA,0發應答信號,1發非應答信號
BS EE,SDA
JBS STU,GP
BC EE,SDA
;---------------------------------------------------------
IOR EE ;設置SDA為輸出
AND A,@0B11110111 ;**************************
IOW EE
;---------------------------------------------------------
BS EE,SCL ;拉高SCL,送出應答信號
CALL DELAY
BC EE,SCL ;拉低SCL,鉗住總線,等待后續操作
BC EE,SDA
RET
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -