最近在调试时钟芯片 PCF8563 与 ATMEGA128的IIC通讯。<br />使用的是模拟IIC.<br />附上 几个程序 并告知我的问题所在,希望有高手可以指点迷津:<br />void Start()<br />{ <br /> SET_SDA;<br /> SET_SCL;<br /> __asm__ volatile("nop");<br /> __asm__ volatile("nop");<br /> CLR_SDA;<br /> __asm__ volatile("nop");<br /> __asm__ volatile("nop");<br /> CLR_SCL;<br /> <br />}<br />void Stop()<br />{<br /> <br /> CLR_SDA;<br /> SET_SCL;<br /> __asm__ volatile("nop");<br /> __asm__ volatile("nop");<br /> SET_SDA;<br /> __asm__ volatile("nop");<br /> __asm__ volatile("nop");<br /> CLR_SCL;<br /> <br />}<br />void WaitACK()<br />{ <br /> UCHAR errtime=20;<br /> UCHAR tp=0;<br /> // SDA_IN;<br /> DDRD=DDRD&0xfd;<br /> <br /> PORTD=PORTD|0x02; ///0:禁止上拉;1:使能上拉<br /> PIND=PIND&0xfd;<br /> SET_SCL;<br /> // __asm__ volatile("nop");<br /> __asm__ volatile("nop");<br /> tp=PIND;<br /> while(tp&0x02)<br /> {<br /> if(errtime)<br /> errtime--;<br /> else <br /> Stop();<br /> __asm__ volatile("nop");<br /> tp=PIND;<br /> }<br /> CLR_SCL;<br /> <br /> }<br /><br />void writebyte(UCHAR wdata)<br />{<br /> UCHAR i;<br /><br /> SDA_OUT;<br /><br /> for(i=0;i<8;i++)<br /> {<br /> if(wdata&0x80)<br /> SET_SDA;<br /> else <br /> CLR_SDA;<br /> <br /> SET_SCL;<br /> __asm__ volatile("nop");<br /> __asm__ volatile("nop");<br /> CLR_SCL;<br /> <br /> // __asm__ volatile("nop");<br /> // __asm__ volatile("nop");<br /> wdata<<=1;<br /> }<br /> WaitACK(); //I2C器件或通讯出错,将会退出I2C通讯<br />}<br /><br />void writeData(UCHAR address,UCHAR mdata)<br />{ <br /> cli();<br /> Start();<br /> writebyte(0xa2); //*写命令<br /> writebyte(address); //*写地址<br /> writebyte(mdata); //*写数据<br /> Stop();<br />}<br /><br />这是几个子函数。时序方面我都对过了,不应该有什么错误。现在的问题 就是<br />WaitACK()函数里面的循环 <br /> while(tp&0x02)<br /> {<br /> if(errtime)<br /> errtime--;<br /> else <br /> Stop();<br /> __asm__ volatile("nop");<br /> tp=PIND;<br /> }始终也跳不出来。<br />我这个函数是在写完一个字节给从机之后,检测从机是否返回一个低电平信号的。按照IIC协议上说,如果返回的是个低电平,则说明写成功;否则,则说明写失败。<br />我现在 无法跳出循环,就说明检测到的这个信号,始终为高电平。这是我一直困惑的。<br />想请同时 熟悉AVR的 朋友给看看,我的寄存器使用是否有错误,但是感觉上好像也应该就是这样的。谢谢大家~~~~~ |
|