IIC通信协议可分为物理层和协议层
物理层特点:
1.他是一个支持设备的总线,“总线”指多个设备共用的信号线,在一个IIC通讯总线中,可连接多个IIC通讯设备,支持多个通讯主机及多个通讯从机。
2.一个IIC总线只使用两条总线线路,一条双向串行数据线(SDA),一条串行时钟线(SCL),数据线即用来表示数据,时钟线用于数据收发同步。
3.每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。
4.总线通过上拉电阻连接电源,当IIC设备空闲时,会输出高阻态,当所有设备都空闲,都输出高阻态时,会由上拉电阻将总线拉成高电平。
5.当多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。
6.具有三种传输模式,标准模式传输速率为100kbit每秒,快速模式为400kbit每秒,高速模式下可达3.4Mbit每秒。但目前大多数IIC设备上不支持高速模式。
7.连接到相同总线的IIC数量受到总线的最大电容400pF限制。
下面是电路原理图
下面是AT24C02&MCP4017的电路原理图
基于IIC总线的EEPROM——AT24C02芯片概述
256字节(256*8位)
E1,E2,E3为器件地址选择
WC#为数据写保护引脚(为高电平时进入写保护状态,只能读)
芯片地址为1010,IIC协议规定设备地址为7位或者10位(常用的是7位),紧跟设备地址的一位为数据方向位,用来表示数据传输方向,数据方向位为1时,表示主机由从机中读数据,为0时,表示主机向从机中写数据
0Xa1(1010 0001)读
0Xa0(1010 0000)写
DCP概述: MCP4017可编程调节电阻
带有读写命令的IIC协议
127个电阻,128级
转化为电阻阻值:R = 787.4 * read_resistor 欧
电压:3.3*(R/(R+10)) (假设外接的电压为3.3)
下面是电路原理图
下面是MCP4017的内部原理图,例:N=127时,应向电阻写入0X7F,此时电路电流如图所示
IIC初始化配置
注:配置IIC相关引脚为输出引脚(本开发板是GPIO模拟IIC通讯);这次我们连接LCD一起实现本次内容
实现目标:使用LCD显示开发板上电次数,每次上电,数据+1
GPIO端口初始化如下:将PB6和PB7引脚设为输出端口,初始化为High
配置时钟
将相关驱动文件放入src和inc里
再使用keil添加相关文件
然后开始编写代码
在main.c文件中引用相关的文件,否则不能使用IIC和LCD
我这里LCD的相关文件名不一致,所以我需要将lcd_hal.c文件中引用的文件名改为lcd_hal.h和fonts_hal.h
首先进行LED的初始化
我们可以将LED的关闭代码写在GPIO.c里,然后在gpio.h文件中声明
接下来让LCD显示,先定义两个变量
LCD显示代码
接下来进行使用IIC总线和EEPROM的使用
我们先了解一下IIC读写流程
IIC写流程:1.启动总线 2.寻找从机(写指令)3.等待回应 4.选择地址 5.等待回应 6.写数据 7.等待回应 8.结束总线
IIC读流程:1.启动总线 2.寻找从机(写指令) 3.等待回应 4.选择地址 5.等待回应 6.结束总线 7.启动总线 8.寻找从机(读指令) 9.等待回应 10.读数据 11.结束总线
读写操作的代码可以写在iic_hal.c文件里,然后在iic_hal.h文件中声明
然后在main.c文件中使用读写函数
注意:在我们操作的地址中可能已经有了其他数据,或者初始数值为0XFFF,所以我们可以先将将要操作的地址数据清0
功能实现
MCP4017功能实现
代码
在IIC_hal.c文件中写入MCP读写函数
然后在IIC_hal.h文件中声明
在main.c文件中调用函数写入00,根据上面MCP4017概述中的电路图可知,现在无电阻
相当于PB14引脚直接与GND相连,此时用电压表一端连接PB14引脚,一端接GND可查看电压
功能实现