找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2528|回复: 5
打印 上一主题 下一主题
收起左侧

51单片机写I2C总线24C02问题

[复制链接]
跳转到指定楼层
楼主
ID:905876 发表于 2021-5-20 21:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近修改一个程序,原来使用的是SPI总线EEPROM,现在改为I2C总线EEPROM。按照数据手册和网上的文章修改读写程序段。现有问题无法解决。调用写总线的部分程序如下。大侠帮忙修改一下程序。原程序是正常使用的。就是把读写EEPROM的部分修改了。现在是读EEPROM正常,写入部分异常。
我用编程器把正确的信息写入24C02,设备可以正常工作。

调用的DELAY是延时8微秒


WWW:    CLR     TR0                            ;主程序中的一段
        MOV     R6,#0         
        MOV     DPTR,#0F00H
        MOV     R2,#0
WWW1:   MOV     R1,#40H
WWW2:   MOV     A,R2
        MOVC    A,@A+DPTR
        MOV     @R1,A
        INC     R1
        INC     R2
        CJNE    R1,#48H,WWW2
        MOV     ADL,R6                         ;ADL是字地址
        MOV     R1,#40H
        MOV     R5,#8
        LCALL   WREN                           调用写程序
        MOV     A,#8
        ADD     A,R6
        MOV     R6,A
        CJNE    R6,#0B8H,WWW1
        SETB    TR0
        RET

;页写程序

WREN:                         ;连续写
        LCALL I2C_START       ;起始
        MOV A,#0A0H           ;器件地址+写
        LCALL I2C_TXBYTE      ;发送一字节数据
        MOV A,ADL             ;字地址
        LCALL I2C_TXBYTE
WREN1:  MOV   A,@R1           ;开始写数据
        LCALL I2C_TXBYTE
        INC   R1
        DJNZ  R5,WREN1
        LCALL I2C_STOP
        LCALL DELAY
        RET

I2C_START:                  ;
        SETB   SDA
        LCALL  DELAY
        SETB   SCL
        LCALL  DELAY
        CLR    SDA
        LCALL  DELAY
        CLR    SCL
        LCALL  DELAY
        RET


I2C_STOP:                    ;
        CLR    SDA
        LCALL  DELAY
        SETB   SCL
        LCALL  DELAY
        SETB   SDA
        LCALL  DELAY
        RET


I2C_TXBYTE:                 ;主机发送一字节数据
        MOV   R3,#08H
TXNEXT: RLC   A
        MOV   SDA,C
        LCALL DELAY
        SETB  SCL
        LCALL DELAY
        CLR   SCL
        LCALL DELAY
        DJNZ  R3,TXNEXT
        SETB  SDA
        LCALL DELAY
        SETB  SCL
        LCALL DELAY
        MOV   R3,#10H         ;循环一定时间等待应答ACK
REP1:   MOV   C,SDA
        JNC    REP2
        LCALL  DELAY
        DJNZ   R3,REP1
REP2:   CLR   SCL
        LCALL DELAY
        RET

按照这个运行后EEPROM中写入的数据如下图(更改后的I2C总线)




每行只写了前面的8个字符。后面的8个没写丢弃了。


下图是正常写入的状态。(原来SPI总线)


每行16个字符都写入了。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:401564 发表于 2021-5-20 23:58 | 只看该作者
24C02写入的缓冲的速度并不快,
先把延时改成1mS
你把这个MOV   R3,#10H         ;循环一定时间等待应答ACK
改为MOV   R3,#255试一下
如果还不行,就不要了
也可以先把延时改成1秒,然后在写入的时候,每次写入一个位就闪灯一次,看一下卡在哪里,这样就能找到问题点了   

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:905876 发表于 2021-5-21 08:14 | 只看该作者
Y_G_G 发表于 2021-5-20 23:58
24C02写入的缓冲的速度并不快,
先把延时改成1mS
你把这个MOV   R3,#10H         ;循环一定时间等待应答AC ...

延时的时间我调整过。没有改变。测试使用页写8位一个循环,可以正常写入当前的8位数据,但是后面紧跟的8位数据直接丢失了。16位一个循环后面丢16。使用单独一个字节循环后面丢一个字节。怀疑是字地址的问题。但是找不出来问题出在那里。
比如写入0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p等数据。EEPROM写入的信息是
0,1,2,3,4,5,6,7,FF,FF,FF,FF,FF,FF,FF,FF,
G,H,I,J,K,L,M,N,FF,FF,FF,FF,FF,FF,FF,FF

8,9,A,B,C,D,E,F和O后面的数据没有写入。直接丢失了。
回复

使用道具 举报

地板
ID:401564 发表于 2021-5-21 15:30 | 只看该作者
你这8uS的延时肯定是不够的
I2C_TXBYTE       这个子程序中的延时只是写入缓冲的应答
LCALL I2C_STOP      停止信号之后至少是要有5mS的延时,这个是写入EEPROM的时间,一般是5mS为最大值,数据手册上是有这个的
回复

使用道具 举报

5#
ID:905876 发表于 2021-5-24 12:56 | 只看该作者
本帖最后由 635731309 于 2021-5-24 17:01 编辑
Y_G_G 发表于 2021-5-21 15:30
你这8uS的延时肯定是不够的
I2C_TXBYTE       这个子程序中的延时只是写入缓冲的应答
LCALL I2C_STOP     ...

感谢大神!  按照你的意见,在I2C_STOP后面增加一个3ms的延时,程序可以正常运行了。

为了保险,还是按照数据手册上的改为5ms延时了。
再次感谢。

回复

使用道具 举报

6#
ID:401564 发表于 2021-5-24 21:26 | 只看该作者
635731309 发表于 2021-5-24 12:56
感谢大神!  按照你的意见,在I2C_STOP后面增加一个3ms的延时,程序可以正常运行了。

为了保险,还是按 ...

是的是的,一般保险起见,都是按照数据手册的极限值来进行预防的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表