曾经困扰了我2周
不过当时我用的是ARM芯片,IIC也是硬件弄好了的,自己只需要写寄存器就能实现时序
就是因为那一小段拉高,有的芯片可以容错
有的芯片不能容错就无应答
我当时用的AT24C1024B就可以,用ad公司的一款视频芯片就不皮握行
后来不用他的硬渗滑件接口,用自己单片机实现的IIC时燃喊庆序就可以完成通信了。
对于疑问1:for循环已经把数据从主器件发送到从器件,没错,后面加那几句是为了释放数据总线,这是芯片协议已经规定了的,为什么是scl=0而sda=1呢,应该总线SCL与SDA都是线与关系,任意一个器件输出低电平,都使该总线的信号变低,你可能会这么想:为什么不是scl=1delay()sda=1delay()呢?那是因为当scl=1sda=1这是终止信号腔扰。对吧,这样写的话IIC将会停止工作。对于疑问2:加这几句也一样,是芯片现已规定:无论是写数据还是读数据,写完读完之后需释放总线,for循环语句的意思是:
for(i=0i<8i++)
{
scl=1 //拉高时钟总线,开始读数据
delay()
k=(k<<1)|sda// 将读取到的sda数据存放到k中,这里你可能有点无法理解,我举个例子:刚开始k=0x00(系统默认凯顷),当读取到的sda数据为1时,k=0x01;对吧,反之当读取到的sda数据为0时,k=0x00;
scl=0// 读取完一个数据,拉低时钟总线
delay()
}
就这样循环8次,这样一个字节的数据就从主器件读到伍孙旦了从器件了。对吧。
如果那个释放总线你理解不了,你就记住,这是芯片协议规定,读完或写完都必须释放总线。iic协议都是如此。
希望能帮助到你。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)