📄 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 + -