定义一个变量,或者一堆变量,进行存储,每当时钟线变化时把IO电平存到相应变量(byte)的对应位(bit)。
比如时钟线(sck)下降沿为有效数据,并且sck下降沿过后的低电平周期内的数据线依然是当前数据,也就是说本次下降沿之后到下个下降沿时都是本次数据,则可以用如下方法:
if(sck)//检测时钟线为高电平,如果高电平后出现低电平说明下降沿到达
{
recflag =1;//允许检测低电平
}
if((!sck) && recflag)//出现低电平并且之前没处理
{
recflag =0;//已处理
sbuff<<=1; //高位先发送,如先发低位需要反过来
sbuff+=sda;//假设接收到新数据时sbuff已经清零
if((i++)>=7)//接收完8个bit,也就是一个字节
{
i=0;
return sbuff;//接收完成,把数据返回
}
}
变量说明:
recflag 状态标志位,接收当前数据后清零,只有时钟线恢复高电平才允许检测下降沿,不然就只做一次数据接收
sbuff 数据存储,数据存储在这里,每次接收新数据前必须清零
i 接收了多少位,一个字节是八位(八位单片机)
注意事项:
发送方拉低时钟线后才能并且是必须立即把数据线改成当前数据,不然接收方将接受到错误数据
发送方发送一位数据后必须等待一段时间才能发送下个数据,避免接收方来不及反应,丢失数据
以上为手机手打,如有错误欢迎探讨。以上并不是标准iic的接收/发送程序,因为iic协议我很久没看了,忘的差不多了,仅供参考。
|