搜索
bottom↓
回复: 5

51操作AT24C256,使用页写页读出现操作错误,请大家帮忙【恢复】

[复制链接]

出0入84汤圆

发表于 2008-12-24 14:21:15 | 显示全部楼层 |阅读模式
先将故障现象说清楚:

51单片机使用P1.2,P1.3操作AT24C256

硬件连接没问题,软件是汇编编写的,每次操作64个字节,AT24C256型号是ATMLU828(2EB),括号内是第二行

写的时侯昨晚是连续写两页,没有问题,用编程器读出是对的,读出两页的时侯,第一页是对的,第二页错,今天再调试时更离谱

写也是写第一页的对,第二页不对.程序如下:

;TEST111:

  ;MOV   R0,#80H

 ; MOV   C512AD0,#00H

 ; MOV                C512AD1,#00H

         ;MOV                IICRCO,#64

         ;LCALL        I2C_READ                                        ; 调用形式





;变量定义

IICRCO                DATA        56H        ;IIC总线发送和接收数据字节时所用的位计数器

C512AD0                DATA        58H        ;24C512读写地址0

C512AD1                DATA        59H        ;24C512读写地址1

C512DATA        DATA        5AH        ;24C512读写数据









;/*------------------------------------------------------

;;读一个字节        Address地址        Data读出的数据

;;------------------------------------------------------*/



I2C_READ:

        CLR                EEWP

I2C_READ_A:

        LCALL        I2C_START

        MOV        A,#10100000B

        LCALL        I2C_SEND8BIT

        LCALL        I2C_GETACK

        JC        I2C_READEND        ;=1,表示无确认,再次发送



        MOV                A,C512AD0                        ;放入高地址

        LCALL         I2C_SEND8BIT

        LCALL                I2C_GETACK

        JC                I2C_READEND

        MOV                A,C512AD1

        LCALL                I2C_SEND8BIT

        LCALL                I2C_GETACK

        JC                        I2C_READEND



        LCALL        I2C_START

        MOV        A,#10100001B

        LCALL        I2C_SEND8BIT

        LCALL        I2C_GETACK

        JC        I2C_READEND        ;=1,表示无确认,再次发送



I2C_READ_LOOP:

        LCALL        I2C_RECEIVE8BIT

        MOV                @R0,A                        ;I2CData,A

        MOV                C512DATA,A

        INC                R0

        CLR         C

        LCALL        I2C_PUTACK

        DJNZ        IICRCO,I2C_READ_LOOP

        SETB                C

        LCALL        I2C_PUTACK

        LCALL        I2C_STOP

        CLR                C

        SETB        EEWP

        RET

I2C_READEND:

        LCALL        I2C_STOP

        SETB        C

        SETB        EEWP

        RET



NOP_1US:

        NOP

        NOP

        NOP

        RET



;;发送开始信号

I2C_START:

        SETB        SCL

        SETB        SDA

        NOP

        NOP

  NOP

  NOP

  NOP

        CLR        SDA

        NOP

        NOP

  NOP

  NOP

  NOP

        CLR        SCL

RET

;;发送结束信号

I2C_STOP:

  CLR        SDA

        NOP

        NOP

  NOP

  NOP

  NOP

  NOP

  SETB        SCL

        NOP

        NOP

  NOP

  NOP

  NOP

  NOP

        SETB        SDA

        RET

;;发送接收确认信号

I2C_PUTACK:

        MOV                SDA,C

        NOP

        NOP

        NOP

        SETB        SCL

        NOP

        NOP

        NOP

        NOP

        CLR        SCL

        RET

I2C_GETACK:

        SETB        SDA

        MOV                R7,#50H

        CLR                C

        SETB        SCL

I2C_GETACK_1:

        JNB                SDA,I2C_GETACK_2

        DJNZ        R7,I2C_GETACK_1

        SETB        C

I2C_GETACK_2:

        CLR                SCL

        RET

;送八位数据

I2C_SEND8BIT:

        MOV        B,#08H

        CLR                SCL

I2C_SEND8BIT_A:

        RLC                A

        MOV                SDA,C

        NOP

        NOP

        NOP

  NOP

        SETB        SCL

        NOP

        NOP

        NOP

        NOP

        NOP

        NOP

  NOP

  NOP

  NOP

        CLR                SCL

        DJNZ        B,I2C_SEND8BIT_A

RET





;接收八位数据

I2C_RECEIVE8BIT:

        MOV        B,#08H

        CLR        A

        SETB        SDA

I2C_RECEIVE8IT_A:

        SETB        SCL

        NOP

        NOP

        NOP

        NOP

  NOP

        MOV        C,SDA

        RLC        A

  NOP

  NOP

  NOP

  NOP

  NOP

  NOP

  NOP

  NOP

        CLR        SCL

        NOP

        NOP

        NOP

  NOP

  NOP

  NOP

  NOP

  NOP

        DJNZ        B,I2C_RECEIVE8IT_A



        RET

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入84汤圆

 楼主| 发表于 2008-12-24 14:31:49 | 显示全部楼层
自己顶一下,项目需要必须要写成汇编的,还必须是页写,每次写128个字节,省时间

出0入0汤圆

发表于 2010-3-11 20:01:08 | 显示全部楼层
c语言的有吗?

出0入84汤圆

 楼主| 发表于 2010-3-12 09:44:19 | 显示全部楼层
两年前的老帖子都给翻出来了,问题老早解决了,一次写入是64个字节,最后解决方法是复位IIC总线,大家可以查下资料,好像是CLK连续输入32个脉冲就可以复位总线,程序就不贴了

出0入0汤圆

发表于 2012-5-26 19:13:41 | 显示全部楼层
楼主贴的都是什么啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 00:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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