打印

关于读写AT24C01遇到的问题

[复制链接]
2215|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zl040901|  楼主 | 2008-7-19 14:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   
下面程序我先向AT24C01写入4,再读出,可却读出的是P3全为0,不之是什么原因,希望各位大侠能帮帮忙,还有这里面的读写首地址00H要不要发给AT24C01呢




      ORG    0000H
         SDA   BIT   P1.0
         SCL   BIT   P1.1   
         MAIN: MOV SP,#60H
               MOV DPTR,#SEG
               MOV R0, #00H
               MOV R1,#02H
        
           MOV 00H,#4
         LP0:  LCALL  STA
               MOV A,#0A0H
               LCALL  WRITE  写以个字节
               LCALL  CACK  判断是不是应答信号
               JC LP0
          LP1:MOV   A,@R0  送AT24C01中要写的地址00H,并写入数据4
              LCALL  WRITE
              LCALL  CACK
              JC     LP0
              INC   R0
              DJNZ  R1,LP1
              LCALL ST0
              LCALL DELAY10MS
          LP2:LCALL STA     开始读数据准备,采用立即读方法
              MOV A,#0A0H
              LCALL WRITE
              LCALL CACK
              JC    LP2
          LP3:MOV A,#00H       送AT24C01中要读出的数据的地址
               LCALL WRITE
              LCALL CACK
              JC    LP3
          LP4:MOV A,#0A1H
              LCALL WRITE
              LCALL CACK
              JC    LP4
              LCALL READ
              MOV R3,A
              LCALL MNCK    主机不产生应答信号
              LCALL ST0    结束
              LCALL DELAY10MS
     DISPLAY: MOV  A,R3       显示出读出的数
              MOVC A,@A+DPTR
              MOV  P3,A
              LCALL DELAY10MS
              LJMP DISPLAY
         STA: SETB   SDA    // 开始
              SETB   SCL
               NOP
               NOP
               NOP
               NOP
               CLR    SDA
               NOP
               NOP
               NOP
               NOP 
               CLR    SCL
               RET
 
        ST0:   CLR   SDA    // 结束
               SETB  SCL
               NOP 
               NOP 
               NOP
               NOP
               SETB  SDA
               NOP
               NOP
               NOP
               CLR   SCL
               RET
     
       READ:MOV R5,#8      //读一个字节
       RLP: SETB SDA
            SETB SCL
            MOV C,SDA
            MOV A,R6
            RLC A
            MOV R6,A
            CLR SCL
            DJNZ R7,RLP
            RET
 WRITE: MOV R7,#8       //写一个字节
       WLP:    CLR   C
               RLC   A
               JC    WR1
               CLR   SDA
               SETB  SCL
               NOP
               NOP
               NOP
               NOP
               CLR   SCL
               DJNZ  R7,WLP
               RET
       WR1:    SETB  SDA
               SETB  SCL 
               NOP
               NOP
               NOP
               CLR   SCL
               DJNZ  R7,WLP     
               RET
        CACK:  SETB  SDA
               SETB  SCL
               NOP
               NOP
               MOV   C,SDA
               NOP
               CLR   SCL
               NOP 
               RET 
        MNCK:  SETB  SDA
               SETB  SCL
               NOP
               NOP
               NOP
               NOP
               CLR   SCL
               CLR SDA
               NOP 
               RET
     DELAY10MS:MOV R7,#20
        DEL:   MOV R6,#0F8H
               DJNZ R6,$
               DJNZ R7,DEL
               RET
    
         SEG: DB  3FH,06H,5BH,4FH,66H
              DB  6DH,7DH,07H,7FH,6FH
              END

        

相关帖子

沙发
dai_weis| | 2008-7-19 20:59 | 只看该作者

写入需要时间,手册中有关于写需要的最小时间

你应该等到写完成后,再执行读取操作

使用特权

评论回复
板凳
zl040901|  楼主 | 2008-7-19 22:59 | 只看该作者

00

我已经延时了10ms,应该可以读出啊

使用特权

评论回复
地板
lyjian| | 2008-7-19 23:34 | 只看该作者

能不能告诉我,你用的是哪一组寄存器?

如果是0组寄存器的话,00H和R0本来就是同一个地址。
所以R0的内容是4不是0。
所以,你要写的地址是04H的内容,你要写的数据是05H的内容,你的04H和05H的内容是什么?
还有,你的读时序也是错的。

使用特权

评论回复
5
zl040901|  楼主 | 2008-7-20 10:20 | 只看该作者

帮帮忙

请问一下我的读时序错哪了

使用特权

评论回复
6
lyjian| | 2008-7-20 11:25 | 只看该作者

应该说是:读操作是错的

          LP2:LCALL STA     开始读数据准备,采用立即读方法
              MOV A,#0A0H
              LCALL WRITE
              LCALL CACK
              JC    LP2
          LP3:MOV A,#00H       送AT24C01中要读出的数据的地址
              LCALL WRITE
              LCALL CACK
              JC    LP3

--〉这里应该发个重起动指令才能发下面的控制字。如果没有重起动指令,下面的0A1H会被当成是写入的数据。

          LP4:MOV A,#0A1H
              LCALL WRITE
              LCALL CACK
              JC    LP4
              LCALL READ
              MOV R3,A
              LCALL MNCK    主机不产生应答信号
              LCALL ST0    结束
              LCALL DELAY10MS

这段程序是错的,你应该在写完地址后发个重新启动指令,要不然后面你所发的数据都会当成是要写入的数据写到EEPROM里面。
另外,你不应该在每个字节的读写操作中使用判断ack不成功就光重新执行一遍读写这个字节这种操作,这样很容易出问题的。

使用特权

评论回复
7
zl040901|  楼主 | 2008-7-20 13:11 | 只看该作者
我加一句LCALL STO好像还不行;
寄存器组我用默认的第一组;
判断ack不成功我是不是最好从新发过起始启动指令,即重新来过呢

使用特权

评论回复
8
lyjian| | 2008-7-20 15:58 | 只看该作者

你要加的应该是START而不是STOP

寄存器用默认的第一组,那你的地址就有重复。
看4楼。

使用特权

评论回复
9
zl040901|  楼主 | 2008-7-20 19:09 | 只看该作者

再帮我看一下

        
我按修改之后,还是不行,LYjian ,再帮我看一下,谢谢啊



        ORG    0000H
         SDA   BIT   P1.0
         SCL   BIT   P1.1   
         MAIN: MOV SP,#60H
               MOV DPTR,#SEG
               MOV R0, #00H
               MOV R1,#02H
               
               MOV 00H,#0
               MOV 01H,#4
         LP0:  LCALL  STA
               MOV A,#0A0H
               LCALL  WRITE  写以个字节
               LCALL  CACK  判断是不是应答信号
               JC LP0
          LP1:MOV   A,@R0  送AT24C01中要写的地址00H,并写入数据4
              LCALL  WRITE
              LCALL  CACK
              JC     LP0
              INC   R0
              DJNZ  R1,LP1
              LCALL ST0
              LCALL DELAY10MS
          LP2:LCALL STA     开始读数据准备,采用立即读方法
              MOV A,#0A0H
              LCALL WRITE
              LCALL CACK
              JC    LP2
          LP3:MOV A,#00H       送AT24C01中要读出的数据的地址
               LCALL WRITE
              LCALL CACK
              JC    LP2
          LP4:LCALL STA
              MOV A,#0A1H
              LCALL WRITE
              LCALL CACK
              JC    LP2
              LCALL READ
              MOV R3,A
              LCALL MNCK    主机不产生应答信号
              LCALL ST0    结束
 

使用特权

评论回复
10
lyjian| | 2008-7-20 19:37 | 只看该作者

晕死了

都和你说了,你的地址有冲突
00H和01H就是R0和R1
尽量使用30H以上的地址作RAM使用,不要使用00H~1F之间的地址,因为这是寄存器占用的空间,除非你不用其他组寄存器。

使用特权

评论回复
11
lyjian| | 2008-7-20 20:07 | 只看该作者

楼主应该多看看51基础的书

         ORG    0000H
         SDA   BIT   P1.0
         SCL   BIT   P1.1   
         MAIN: MOV SP,#60H
               MOV DPTR,#SEG
               MOV R0, #00H
               MOV R1,#02H
               
               MOV 00H,#0
               (相当R0=0)
               MOV 01H,#4
               (相当R1=4)
         LP0:  LCALL  STA
               MOV A,#0A0H
               LCALL  WRITE  写以个字节
               LCALL  CACK  判断是不是应答信号
               JC LP0
          LP1:MOV   A,@R0  送AT24C01中要写的地址00H,并写入数据4
              LCALL  WRITE
              LCALL  CACK
              JC     LP0
              INC   R0
              DJNZ  R1,LP1 
              LCALL ST0
              LCALL DELAY10MS
(上面这段写程序会被执行4次,24C01地址00~02分别写入03H,0XXH,0XXH)
          LP2:LCALL STA     开始读数据准备,采用立即读方法
              MOV A,#0A0H
              LCALL WRITE
              LCALL CACK
              JC    LP2
          LP3:MOV A,#00H       送AT24C01中要读出的数据的地址
              LCALL WRITE
              LCALL CACK
              JC    LP2
          LP4:LCALL STA
              MOV A,#0A1H
              LCALL WRITE
              LCALL CACK
              JC    LP2
              LCALL READ
              MOV R3,A
              LCALL MNCK    主机不产生应答信号
              LCALL ST0    结束

使用特权

评论回复
12
zl040901|  楼主 | 2008-7-20 22:41 | 只看该作者

谢谢

大侠说的对,我是应该多看看书
00~02分别写入03H,0XXH,0XXH)
00H是写入了4吧

使用特权

评论回复
13
zl040901|  楼主 | 2008-7-20 22:54 | 只看该作者

再帮我看看


下面是我修改过的,不知道可不可以了
我仿真还不行

               ORG    0000H
         SDA   BIT   P1.0
         SCL   BIT   P1.1   
         MAIN: MOV SP,#60H
               MOV DPTR,#SEG
               MOV R0, #30H
               MOV R1,#02H
           
           
           MOV 30H,#0
           MOV 31H,#2
         LP0:  LCALL  STA
               MOV A,#0A0H
               LCALL  WRITE
               LCALL  CACK
               JC LP0
          LP1:MOV   A,@R0 
              LCALL  WRITE
              LCALL  CACK
              JC     LP0
              INC   R0
              DJNZ  R1,LP1
              LCALL ST0
              LCALL DELAY10MS
          LP2:LCALL STA     
              MOV A,#0A0H
              LCALL WRITE
              LCALL CACK
              JC    LP2
          LP3:MOV A,#00H     
               LCALL WRITE
              LCALL CACK
              JC    LP2
          LP4:LCALL STA  
              MOV A,#0A1H
              LCALL WRITE
              LCALL CACK
              JC    LP2
              LCALL READ
              MOV R3,A
             LCALL MNCK
              LCALL ST0   
              LCALL DELAY10MS

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

61

帖子

0

粉丝