模拟IIC程序出现奇怪的问题,大家都来看看

模拟IIC程序出现奇怪的问题,大家都来看看,第1张

我跟你有过同样的问题

曾经困扰了我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协议都是如此。

希望能帮助到你。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12248152.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-22
下一篇 2023-05-22

发表评论

登录后才能评论

评论列表(0条)

保存