这两天在模拟iic从机,接收数据总是出错,看了看时序,也像也没啥问题。程序如下:<br /> while(1)<br /> {<br /> // Prints("OK1
");<br /> temp=0;<br /> while(SCL);<br /> while(!SCL); //等待总线复位<br /> while(1)<br /> { <br /> NN=10;<br /> Pre=SDA;<br /> while(SCL && NN--) <br /> {<br /> Cur=SDA; <br /> if(Pre && !Cur) Start_Flag=TRUE; <br /> if(Start_Flag)<br /> {<br /> Start_Flag=FALSE; //090729<br /> while(SCL); //090729<br /><br /> for(i=0;i<8;i++) //接收一个字节<br /> {<br /> while(!SCL);<br /> sla<<=1;<br /> sla=sla|SDA;<br /> // temp=temp|(c<<(7-i)); //msb first 时间太长?<br /> while(SCL); //等待高结束<br /> }<br /> ACK(); //应答 <br /><br /> for(i=0;i<8;i++) //接收一个字节<br /> {<br /> while(!SCL);<br /> //c=SDA;<br /> suba<<=1;<br /> suba=suba|SDA;<br /> // temp=temp|(c<<(7-i)); //msb first 时间太长?<br /> while(SCL); //等待高结束<br /> }<br /> ACK(); //应答<br /><br /> for(j=0;j<4;j++)<br /> { <br /> for(i=0;i<8;i++) //接收一个字节<br /> {<br /> while(!SCL);<br /> temp<<=1;<br /> temp=temp|SDA;<br /> // temp=temp|(c<<(7-i)); //msb first 时间太长?<br /> while(SCL); //等待高结束<br /> }<br /> ACK(); //应答<br /> dat[j]=temp;<br /> temp=0;<br /> }<br /> while(!SCL); //等待stop信号<br /> // Pre=SDA;<br /> PrintHex(sla);<br /> PrintHex(suba);<br /><br /> while(1);<br /> <br /> // Pre=SDA;<br /> }<br /> Pre=Cur;<br /> }<br /> }<br /> <br />能接收对sla,但是suba就是接收不对。<br />硬件:主机用的pic16f676,从机用的stc89c52rc,分别从两块单片机上引出两个脚用作sda,scl,直接相连。主机晶振4M,指令周期1us,从机晶振22.1184。看了下主机发送的波形,似乎没什么问题。<br />还望大家能帮忙看看。 |
|