I2C读写问题
硬件用AT24C08+AT89s52,p0.6(scl)p0.7(sda),写入数据时出错,如:
要写#C3H,而实际写入的却是#87H
写#3CH, ------------------ #79H
写#18H,------------------- #31H
写#81H,------------------- #03H等等....
请各位帮忙找下原因所在,不胜感激!
程序如下:
;主程序,向AT24C08内部的61H单元写一个字节#18H
rwtes: mov r4,#61h
rts: nop
mov 3fh,r4
lcall fenli
mov i2c_data,#18h
mov iic_addr,r4 ;子地址
lcall writei2c ;写数据
lcall del_5ms
lcall fenli0
ret
;写一个字节;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
writei2c:lcall iic_sta ;启动总线
mov iic_wdata,slaw ;寻址字节(写)
lcall wr_vdat
cpl ledr
wrc: lcall cack ;检查应答? dot1=1没有应答 dot1=0应答
jb dot1,wrc ;没有应答重新发送
mov iic_wdata,iic_addr ;存储单元寻址
lcall wr_vdat
mov iic_wdata,i2c_data
lcall wr_vdat
wt: lcall cack
jb dot1,wt
lcall iic_sto ;释放总线
setb ledr
cpl ledg
ret
;写数据子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
wr_vdat:
mov r7,#8
mov a,IIC_WDATA
wrlp: rlc a
jc wr1
clr vdat
nop
setb vscl
nop
nop
nop
nop
clr vscl
djnz r7,wrlp
rrt: ret
wr1: setb vdat
nop
setb vscl
nop
nop
nop
nop
clr vscl
;clr vdat
djnz r7,wrlp
ajmp rrt
;读取一个字节;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
readi2c: lcall iic_sta ;启动
mov iic_wdata,slaw
lcall wr_vdat ;发寻址字节(写)
;clr ledr
lcall cack ;检查应答
cr: jb dot1,readi2c ;dot1=1没有应答,重新读
mov iic_wdata,iic_addr;发送子地址
lcall wr_vdat
lcall cack ;检查应答
jb dot1,cr
lcall iic_sta ;重启总线
cr1: mov iic_wdata,slar
lcall wr_vdat ;发寻址字节(读)
lcall cack ;检查应答
jb dot1,cr1
lcall read_data ;读取数据到IIC_RDATA
MOV 3eH,IIC_RDATA
lcall fack ;发送应答位
lcall read_data ;再读一次数据在iic_rdata
clr ledb
lcall fnack ;发送非应答
lcall iic_sto ;结束数据传送
ret
;读取数据子程序
read_data:
mov iic_rdata,#00 ;清空
mov r7,#8
lop1: setb vdat
setb vscl
mov c,vdat
mov a,iic_rdata
Rlc a ;
mov iic_rdata,a ;
nop ;
clr vscl ;
djnz r7,lop1
ret
请各位帮忙找下原因所在,不胜感激!
发表时间:2007年2月5日18:59:13