I2C总线读字节问题求解

图片说明

请问第78行SCL为什么拉低,第80行为什么要拉高,以及第90行能否去掉

你说的这几个问题,,,都是基于几个硬件时序,就是说,SDA数据要考scl的边沿采集进去,要确保时序可靠。。。。delay()就是起到这个作用的。

当然不能,这个得根据你IIC的数据手册来对照编写协议;而且你的Delay()延时也要准,不同MCU设置或晶振都会影响;
图片说明

图片说明

仔细对着IIC时序图写,注意是用沿的方式采集和发送数据(时钟上升沿/下降沿,对数据进行处理)。发数据时,数据口先为输出,发送完8个边沿后改为输入,等待接收方给应答信号(低表示接收到了);接数据时,数据口先为输入,接受完了8个边沿信号后改为输出并发送应答信号(发送低电平)。我就是在网上找了一些搞混了,一气之下直接对着时序写,写完就成了。最后可以的话用示波器测电平信号,对照IIC时序比较。

78行和80行:只有在SCL为低电平期间,才允许SDA上的电平改变状态。这里是I2C的Master,所以把SCL初始化成0,SDA其实是可以为0也可为1(考虑到上一个命令的END为1,这里初始化成1)。
90行:是为了做成占空比大致为1:2,SCL==的时间久,Slave有足够的反应时间。

不能 总线时钟的时序要求是硬性要求 具体的你可以查看手册

http://www.cnblogs.com/strongerHuang/p/5749422.html推荐你看下这个文章,应该能很好理解模拟IIC