如题。通过i2c读单个地址时能正确读出,写单个数据也能正确写入(写入再读出)。可是在读数据块时就只能读第一个字节,其后的要不是ff就是00。主机回复ack信号可能出错,搞了一天也没好。
“主控设备接收到数据后,发送ACK应答信号表示继续传送数据”。数据从ad7746出来,读是读默认值。
局部程序如下。请路过的大侠帮忙看看错在哪。谢谢
smbus_dubyte:;读数据 ,这是读单个数据子程序,是单个读时没问题的。
mov r4,#8h
clr a
readrepx:
rl a ;左移1位
clr p0.7 ;scl
nop
nop
setb p0.7 ;scl
nop
nop
jnb p0.6,readrepx_a ;sda
inc a
readrepx_a:
nop
djnz r4,readrepx;
ret
;下面是读数据块程序,回复ack那里有问题,搞不明白、
;按照手册,在scl第9个时钟脉冲为高时单片机把sda拉为底就行嘛,为什么在接收第二个数据时就出错了呢?期待回复
;
;
;
;
mov r0,#40h
mov r2,#00h ;读ad7746的地址
smbus_read_cap_a:
acall smbus_dubyte;读数据 ;数据到a内
clr p0.6 ;sda
clr p0.7 ;scl
nop
nop
nop
setb p0.7 ;scl
nop
nop
nop
clr p0.7 ;scl
setb p0.6 ;为输入时,要拉为高才行
mov @r0,a
inc r0
inc r2
cjne r2,#10h, smbus_read_cap_a ;取10h个数
acall smbus_stop ;发送停止位
ret |