技术积累 — IIC之深入理解

来源:互联网 发布:淘宝卖家那里改包邮 编辑:程序博客网 时间:2024/06/06 05:58

参考文章1:单击查看(http://blog.csdn.net/zbb564833642/article/details/38845207)

参考文章2:单击查看(http://blog.csdn.net/zjzto/article/details/51719042)

一、调试经验总结:

      通过写iic ,得出以后调协议类程序的方法:
1:如果该协议不能够工作 ,首先需要一台示波器,将其两个通道分别挂在时钟线和数据线上。注意:在挂示波器的同时 
也要讲你的从机挂载上,便于从机的应答信号和数据可以在示波器上显示出来 。(如果io口输出不接任何设备,只接了示波器,则从示波器中只能检测到发射数据)
2:先从最简单的函数开始, 就拿模拟iic 来说, 将 I2c_Start() 放入主函数中, 主函数除了喂狗(防止单片机重复复位)
 以外,再加一个 delay延时函数(为了方便示波器观察数据)
3: 将起始信号的时序图找出来(网上iic协议介绍里边都有),对比示波器上的 波形,如果完全吻合,ok,这个函数没有问题,然后依次对比以后的函数。
4: 一般情况下,在测试的过程中,时钟线上不管发射信号还是接收信号还是应答信号都能够在示波器上显示出来(前提是你的硬件接法没有错误)

5: 修正上述测试出现的问题后。 从新运行程序,读取从设备的地址位(一般该位 为一个定值,如mpu6050的默认地址为0x68)。如果能够读出数据,则说明iic已经正常工作了。 

二、基本工作原理:

以启动信号START来掌管总线,以停止信号STOP来释放总线;

每次通讯以START开始,以STOP结束;

启动信号START后紧接着发送一个地址字节,其中7位为被控器件的地址码,

一位为读/写控制位R/W,R/W位为0表示由主控向被控器件写数据,R/W为1表示由主控向被控器件读数据;

当被控器件检测到收到的地址与自己的地址相同时,在第9个时钟期间反馈应答信号;

每个数据字节在传送时都是高位(MSB)在前;


三、IIC波形分析:

      讲的很详细。波形很完整:


1、首先是起始操作(图中红色线条处)
2、接下来是设备地址,共9个时钟,前面7个是地址,然后是读写标志,最后是MPU6050/MPU9150应答标志。我们看到,前面7个数是:1101000,换算成16进制,就是0x68。第8个是0,表明是写传输(前八个数0xd0 ),第9个是0,是由MPU6050/MPU9150芯片驱动的,表明MPU6050/MPU9150芯片应答了这个地址。如果MPU6050/MPU9150芯片没有应答这个0x68地址信号,那么第9个数会显示1。
3、接下来是STM32发送要读的MPU6050/MPU9150芯片寄存器地址,共9个时钟。前面8个依次是:01110101,换算成16进制,就是0x75(该寄存器为 地址识别码who am i ,读出来的数据 为 0x68)。第9个是0,是由MPU6050/MPU9150芯片驱动的,表明MPU6050/MPU9150芯片应答了这个操作。
4、前面STM32发送完MPU6050/MPU9150芯片设备地址0x68,,寄存器地址0x75后,要告诉MPU6050/MPU9150芯片,接下来STM32要读数据了。所以STM32重新发送了一个起始操作,表示在上图中的一个时钟。
5、接下来,STM32重复发送MPU6050/MPU9150芯片地址,在图中,我们看到9个数据位,前面7个依次是1101000,即0x68,第8个数据位变成了1,表明接下来的是读操作。第9个是0,表明MPU6050/MPU9150芯片应答了这个地址。
6、接下来总线上出现了9个时钟,前面8个时钟对应的数据01101000,换算成16进制,就是0x68。这个刚好是MPU6050/MPU9150芯片的ID.即MPU6050/MPU9150芯片的WHOAMI寄存器。第9个时钟对应的数据是1,表明STM32不再需要读数据,即I2C总线中的NACK.(注意,该位一定要加上)
7、由于数据读取结束,STM32发送结束标志。至此,通讯完成

原创粉丝点击