原创 IIC

2010-2-3 23:34 2309 3 3 分类: MCU/ 嵌入式

while(1)
    {
        temp="0";
        while(SCL);
        while(!SCL);  //等待总线复位
        while(1)
        {   
              NN="10";
              Pre="SDA";
              while(SCL && NN--)           
              {
                   Cur="SDA";
                 if(Pre && !Cur)  Start_Flag=TRUE;   
                 if(Start_Flag)
                   {
                     Start_Flag=FALSE;  //090729
                     while(SCL);        //090729起始信号后等待SCL变低


                    for(i=0;i<8;i++)      //接收一个字节
                    {
                        while(!SCL);    //等待SCL变高
                        sla<<=1;
                        sla="sla|SDA";     //在SCL高期间采样
                        while(SCL);         //等待高结束
                    }
                    ACK();        //应答               


                     for(i=0;i<8;i++)      //接收一个字节
                    {
                        while(!SCL);//等待SCL变高
                        suba<<=1;
                        suba="suba|SDA";     //在SCL高期间采样
                        while(SCL);         //等待高结束
                    }
                    ACK();        //应答                  
                    while(!SCL);     //等待stop信号                       
               
                  }
                Pre="Cur";
            }
        }
   
能接收对sla,但是suba就是接收不对。
硬件:主机用的pic16f676,从机用的stc89c52rc,分别从两块单片机上引出两个脚用作sda,scl,直接相连。主机晶振4M,指令周期1us,从机晶振22.1184。看了下主机发送的波形


,似乎没什么问题。


 


 


 


 


 


 


 


 


 


 


void delay()//5微妙左右延时
{
//;;
uchar i="30";
while (i--);


}



void start()  //开始信号

 sda=1;
 delay();
 scl=1;
 delay();
 sda=0;
 delay();
}


void stop()   //停止信号
{
 sda=0;
 delay();
 scl=1;
 delay();
 sda=1;
 delay();
}


void respons()  //应答
{
 uchar i;
 scl=1;
 delay();
 while((sda==1)&&(i<250))i++;
 scl=0;
 delay();
}


void init()//初始化
{
 sda=1;
 delay();
 scl=1;
 delay();
}


void write_byte(uchar date)//写一字节函数
{
 uchar i,temp;
 temp=date;
 for(i=0;i<8;i++)
 {
  temp=temp<<1;
  scl=0;
     delay();
  sda=CY;
  delay();
  scl=1;
  delay();
  delay(); 
 }
 scl=0;
 delay();
 sda=1;
 delay();
}


uchar read_byte()//读一字节函数
{
 uchar i,k;
 scl=0;
 delay();
 sda=1;
 delay();
 for(i=0;i<8;i++)
 {
  scl=1;
  delay(); 
  k=(k<<1)|sda;
  scl=0;
  delay(); 
 }
 return k;
}


 


void write_add(uchar address,uchar date)//在指定地址写要写的数
{
 start();
 write_byte(0xae);
 respons();
 write_byte(address);
 respons();
 write_byte(date);
 respons();
 stop();
}


uchar read_add(uchar address)//读指定地址的数
{
 uchar date;
 start();
 write_byte(0xae);
 respons();
 write_byte(address);
 respons();
 start();
 write_byte(0xaf);
 respons();
 date=read_byte();
 stop();
 return date;
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
3
关闭 站长推荐上一条 /3 下一条