⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 emc-epprom.txt

📁 义隆单片机读写24C** ** 24CXX 接口I2C总线读/写的程序 ** (所有时序均基于4MHZ晶体震荡器频率)
💻 TXT
📖 第 1 页 / 共 2 页
字号:

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