我看了很多网上的解释,都是先官方的说明I2C协议,再潦草的给出不完整的程序,导致你们又看不懂I2C原理又调试不出程序,所以我这篇文章先专门针对程序,先使你们的程序调试成功,再利用仿真或其他方式回去理解I2C的原理!我自己就是这么来的,所以把这种方法推荐给你们!
潦草的说明一下先,不懂不要紧!!!
I2C 有四条连接线,SCL、SDA、VCC、GND。
I2C的通信协议:
数据若要传输,传输前必须由SCL、SDA线产生一个特定的电平组合,告诉模块接下来要开始传输数据了,此特定组合称为开始信号;
同理,数据传输结束了,也必须由SCL、SDA线产生一个特定的电平组合,此特定组合称为结束信号;
那我们如何知道数据传输结束了呢?于是24C256接收到八位后就会返回一个特定的电平,此电平称为应答信 号,如果我们是读的话,自己也要产生一个应答信号发送出去,写的应答信号是24C256产生的(注意区别这2个 应答信号)!
下面我们开始程序的设计:
第一步;创建一个c文件和一个h文件,我创建的如下图
第二步:选择单片机的一个I2C接口!我选择了PB6、PB7,对应SCL和SDA!
所以c文件的第一个函数就是初始化这2个接口,程序如下:
为了方便之后的程序的简单,我们在c文件里宏定义如下几个功能的函数:
1、因为SDA端口是数据传输,所以要有输出、输入的配置,我们宏定义如下:
(这里如果不懂可以看我的一篇《寄存器操作端口模式SDA_OUT()/SDA_IN()》)
2、SDA、SCL输出电平的高低控制即PB6、PB7端口的输出电平控制,宏定义如下:
现在我们对于端口的初始化都完成了,接下来就是操作这几个端口了!
第三步:c文件接下来的函数就是产生开始信号和停止信号,程序如下:
第四步:这里有3个函数,一个是接收模块完成数据接收传输之后的响应信号,还有2个就是单片机完成数据读之后是否发出响应信号!程序如下:
先到这里,不明白的可以提出来,其中的延迟函数去掉本人调试过基本没问题,但加上也不会错!!!
当然程序还没完,怕一次写太多!待续。。。