关于单片机模拟I2C的总线通信,读一个字节的问题。。

2025-01-07 06:32:16
推荐回答(2个)
回答(1):

uchar read_byte()
{
uchar i,k;
scl=0; //-IIC规定在SCL底电平的时候,允许SDA发生变化。所以,这里必须自定义为低
delay(); //-单片机端口变化需要一点时间,从机收到变化也需要一点时间,所以必须延时
sda=1; //-这肯定是用51单片机写的程序,因为51单片机在读取IO口时,必须把该口先写为1
delay();
for(i=0;i<8;i++)
{
scl=1; //-把SCL变为高电平时,SDA就不会变化了。数据也就稳定了。
delay();
k=(k<<1)|sda; //-这样写你会理解。K = K<<1; 先把缓冲左移
// K = K | SDA; 再把缓冲的最低位或操作一下,得到数据位
scl=0; //允许IIC发送下一个位
delay(); //-保证IIC能把数据送出
}
return k; 返回读取到的数据。
}

整个核心就在移位、或操作。
先移位后,则缓冲的最低位就为0了。该位与SDA或一下以后,如果数据为1.则缓冲的最低位为1.否则最低位仍然为0.由于FOR循环只有8次。所以,也就读取8次数据就完成了。

回答(2):

不为什么啊 芯片资料上不是画着么,只是按照它画着的顺序写的啊

SCL高 SDA下降沿为起始
SCL高 SDA上升沿为终止

一个字节为8。它是读一个左移一个,移动一次进一个,进到一个字节为止,所以是八次
好像每次要延时大于4.7us,所以加个延时吧。

~~~~~~~