关于AT24C02的读写问题

2019-03-24 21:15发布

各位大侠,帮帮忙啊.我编了个AT24C02的读写程序,写已经没问题,每次都应答,但是读开始的伪写程序就是不应答,请那为高手帮看看啊!兄弟在这里谢谢了!
ORG 0000H
SCL BIT P1.6;定义24C02的串行时钟线
SDA BIT P1.7;定义24C02的串行数据线
;R0:芯片读/写命令
;R2:片内字节地址
LJMP STAR
ORG 0100
STAR:
MOV P0,#0FFH
ACALL EEPW
ACALL EEPR
;--------------------------------------------------------
;写子程序
;--------------------------------------------------------
EEPW:
ACALL ESTAR  ;发开始信号
  MOV A,#0A0H;送器件地址 10100000(0A0H)
  ACALL SUBS
  MOV A,#09H  ;送片内地址
  ACALL SUBS
      MOV A,#55H; 送一常数
  ACALL SUBS
  ACALL DELAY ;延时以满足传输速率要求
  ACALL ESTOP ;SDA置0, 准备送停止信号
RET
;----------------------------------------------------------
;读子程序
;----------------------------------------------------------
EEPR:
  ACALL ESTAR
  MOV A,#0A0H;送器件地址 10100000(0A0H)
  ACALL SUBS;调发送单字节子程序
MOV P0,#09H  
  MOV A,#09H;送片内字节地址
  ACALL SUBS    ;就是在这不应答了!
MOV P0,#10H
  ACALL ESTAR;发开始信号
  MOV A,#0A1H
  ACALL SUBS
MOV P0,#20H
  ACALL SUBR;读数据
  ;MOV P0,A
  ACALL ESTOP
  RET
;----------------------------------------------------
;开始信号
;----------------------------------------------------
ESTAR:
SETB SDA  ;发送起始条件的数据信号
SETB SCL  ;起始条件建立时间大于4US,延时
NOP
NOP
NOP
NOP
CLR SDA    ;发送起始信号
NOP        ;起始条件建立时间大于4US   
NOP
NOP
NOP
CLR SCL     ;准备发送或接收数据
RET
;------------------------------------------------------
;停止信号
;------------------------------------------------------
ESTOP:
   CLR SDA    ;发送结束条件的数据信号
NOP
NOP
NOP
NOP
SETB SCL   ;发送结束条件的时钟信号
NOP
NOP
NOP
NOP
SETB SDA    ;发送I2C总线结束信号
NOP
NOP
NOP
NOP
RET
;---------------------------------------------------------
;发送单字节子程序
;---------------------------------------------------------
SUBS:MOV R1,#08H  ;字节传送
LOOP:CLR SCL ;时钟信号保持为低,准备发送
NOP
NOP
RLC A
MOV SDA,C
NOP
NOP
SETB SCL     ;置时钟信号为高,开始发送
NOP
NOP
NOP
NOP
DJNZ R1,LOOP ;循环8次,传送8bit
CLR SCL
NOP
NOP
NOP
NOP
SETB SCL
RACK:
MOV C,SDA
JC RACK ;判应答到否,未到则等待
CLR SCL
RET
;---------------------------------------------------------
;接受单字节子程序
;---------------------------------------------------------
SUBR:
MOV R0,#08H ;接受单字节子程序
ERLOOP:
   SETB SCL
NOP
NOP
   NOP
NOP
MOV C,SDA
RLC A
CLR SCL
NOP
NOP
NOP
NOP
DJNZ R0,ERLOOP
SETB SDA ;若是最后一个字节置A=1
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
NOP
NOP
SETB SDA ;应答毕,SDA置1
RET
;----------------------------------------------------------
;延时子程序
;----------------------------------------------------------
DELAY:
NOP
NOP
RET
END 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
一地烟头
2019-03-25 20:21
你在读/写前都要发送的控制指令A0H后要读一次应答位,需要一个时钟脉冲,才能进入一下个写地址字节。当你写操作时,其实写入的数据可能是错的,即缺少一个时钟,但因你读不出来,所以,也不知道写入的数据是否有错误。可是读操作时,因写入的地址字节是错误的,即缺少一个钟脉冲,因此,也就不能进入读数据的操作了。注意,每个写字节的操作后都要读一次应答位,即使不需要应答位,也要给一个时钟脉冲,才能正常进入下一个字节的操作。

一周热门 更多>