/*通过写iic ,得出以后调协议类 程序的方法。
1: 如果该协议不能够工作 ,首先需要一台示波器,将其两个通道分别挂在 时钟线和数据线上。注意:在挂示波器的同时
也要讲你的从机挂载上,便于从机的应答信号和数据可以在示波器上显示出来 。(如果io口输出不接任何设备,只接了示波器,则从示波器中只能检测到发射数据)
2: 先从最简单的函数开始, 就拿模拟iic 来说, 将 I2c_Start() 放入主函数中, 主函数 除了 喂狗(防止单片机重复复位)
以外,再加一个 delay延时函数(为了方便示波器观察数据)
3: 将起始信号的时序图找出来(网上iic协议介绍里边都有),对比示波器上的 波形,如果完全吻合,ok,这个函数没有问题,然后依次对比以后的函数。
4: 一般情况下,在测试的过程中,时钟线上 不管发射信号还是接收信号还是应答信号 都能够在示波器上显示出来(前提是你的硬件接法没有错误)
5: 修正上述测试出现的问题后。 从新运行程序,读取 从设备的 地址位(一般该位 为一个定值,如mpu6050的默认地址为0x68)。如果能够读出数据,则说明iic
已经正常工作了。
6:另外: 由于本人之前的粗心,将读字节 函数中检测的io口误写成了 别的管脚,导致示波器看抓取的波形是正常的,但单片机io口捕获不到数据,后来经过推理找到了
问题的源头, 以后写程序一定要小心。。
以上是我在半年前写mpu6050驱动时用iic 的调试感悟 。 但是 在半年后的今天, 在另一块单片机上又要用到iic 需要自己写(用另一种语言)的时候又出现问题 通信不成功的现象 ,我 用示波器看了下波形,波形是正常的,但是SDA 的 高电平脉冲在2V左右 (被6050拉低了)。而且也读取不出来信号 如左图所示。当前示波器一格为2V ,蓝色的线为 SDA ,黄色的线为SCL,从上图看出,按照时序检查跳变沿,发现 时钟数据 都是正确的,但就是读不出数据 (如上图所示,如果画圈部分的电平拉高到正常就读取正常了)。(用的是mpu6050模块 ,iic的上拉电阻为4.7K。 把sda线跟6050断开 ,电平又能回到3.3V) 。刚开始一直以为是因为软件的原因 。 然后就一直再看协议,在改时序 。。到最后还是不能通信 。最后 感觉真没办法了,就又弄了一个mpu6050换上试了下,正常工作了。。 从而得出结论:SDA线被拉低到2V,明显是 硬件原因 。 说明之前的mpu6050 已坏。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
iic协议知识讲解
注意 :iic 协议的 时序即器件地址+应答信号 +。。。。。+停止码 , 这是iic的物理协议,即 只要用iic 都要遵循 该时序要求。
1:iic的开始和结束信号