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;
}
文章评论(0条评论)
登录后参与讨论