1. IIC
1.1. I²C基础简介
IIC(Inter-Integrated Circuit)是一个多主从的串行总线,又叫I2C,是由飞利浦公司发明的通讯总线,属于半双工同步传输类型总线。IIC总线是非常常见的数据总线,仅仅使用两条线就能完成多机通讯,一条SCL时钟线,另外一条双向数据线SDA。不同的器件,都是并联接在这两条线上,I2C总线上的每个设备都自己一个唯一的地址,来确保不同设备之间访问的准确性。
SDA(Serial data)是数据线,D代表Data也就是数据,Send Data 也就是用来传输数据的
SCL(Serial clock line)是时钟线,C代表Clock 也就是时钟 也就是控制数据发送的时序的

1.2. 硬件电路
- 所有的IIC设备的SCL连在一起,SDA连在一起
- 设备的SCL和SDA均要配置成开漏模式
- SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右


1.3. 为什么I²C需要使用上拉电阻?
答:总线空闲的时候,SDA和SCL都是高电平。当其中一个设备拉低总线,整条线就全是低电平,器件与器件之间变为"与"关系。
为了避免总线信号收到从设备的干扰,各设备连接到总线的输出端时必须是漏极开路(OD)输出,即高阻态,无法主动输出高电平,需要外部上拉电阻才可以获得高电平。
1.4. I²C特点
通常我们为了方便把IIC设备分为主设备和从设备,基本上谁控制时钟线(控制SCL的电平高低变换)谁就是主设备。
● IIC主设备功能:主要产生时钟,产生起始信号和停止信号
● IIC从设备功能:可编程的IIC地址检测,停止位检测
● IIC的一个优点是它支持多主控(multimastering),其中任何一个能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。
● 支持不同速率的通讯速度,标准速度(最高速度100kHZ), 快速(最高400kHZ),比uart高,比spi低
● SCL和SDA都需要接上拉电阻 (大小由速度和容性负载决定一般在3.3K-10K之间) 保证数据的稳定性,减少干扰。
● IIC是半双工,而不是全双工 ,同一时间只可以单向通信,IIC协议首先是发送从机硬件地址,然后发送命令,再发送数据/寄存器编号或者读取数据。IIC协议可以多字节连续读写数据。
● 各设备连接到总线的输出端时必须是漏极开路(OD)输出或集电极开路(OC)输出。
1.5. 时序图分析
1.5.1. 起始信号与终止信号

1. SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;
2. SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号;
3. 起始和终止信号都是由主机发出,起始信号产生后,总线就处于占用的态;
4. 终止信号产生后,总线就处于空闲态。
1.5.2. 数据传输时序

1. I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定; 只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
2. 在时钟为低电平期间,发送器向数据线上写入数据,因此数据线上的数据运行变化; 在时钟为高电平期间,接收器从数据线上读取数据,因此必须保持数据线上的数据稳定。
3. 最终完成一个时钟周期内,发送器发生一个bit位数据,接收器接收一个bit位数据。
1.5.3. 字节传输和应答信号

1. 每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。
2. 在第9个时钟周期的低电平期间,接收器向数据线上写入数据。
3. 在第9个时钟周期的高电平期间,发送器从数据线上读取数据。
4. 如果读到的是低电平信号,表示应答信号。
5. 如果读到的是高电平信号,表示非应答信号。
1.6. IIC时序基本单元
- 起始条件:SCL高电平期间,SDA从高电平切换到低电平
- 终止条件:SCL高电平期间,SDA从低电平切换到高电平

- 发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节

- 接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)

- 发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
- 接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)

1.7. I²C寻址

1. I2C总线上传送的数据信号是广义的,既包括地址信号,又包括真正的数据信号。
2. 主机在起始信号后必须传送一个从机的地址(7位),第8位是数据的传送方向位(R/W),用“0”表示主机发送数据(W),“1”表示主机接收数据(R)。
3. 总线上的每个从机都将这7位地址码与自己的地址进行比较,如果相同,则认为自己被主机寻址,根据R/W位将自己定为发送器或接收器。
1.7.1. 主机给从机发送一个字节

1.7.2. 主机给从机发送多个字节

1.7.3. 主机从从机接收一个字节

1.7.4. 主机从从机接收多个字节

1.8. I²C寄存器

1.8.1. I2C_RXDR(I2C 接收数据寄存器)

● 位 31:8 保留,必须保持复位值。
● 位 7:0 RXDATA[7:0]:8 位接收数据 (8-bit receive data) 从 I2C 总线接收的数据字节
1.8.2. I2C_TXDR(I2C 发送数据寄存器)

● 位 31:8 保留,必须保持复位值。
● 位 7:0 TXDATA[7:0]:8 位发送数据 (8-bit transmit data) 待发送到 I2C 总线的数据字节
2. AT24C02

- AT24C02是一种可以实现掉电不丢失的存储器,可用于保护单片机运行时想要永久保存的数据信息。
- 存储介质:EEPROM
- 通讯接口:IIC总线
- 容量:256字节





|
引脚 |
说明 |
|
A0/1/2 |
设备地址决定引脚 |
|
WP |
写保护引脚(高电平有效) |
|
SCL |
时钟线 |
|
SDA |
数据线 |
2.1. AT24C02通讯地址
通讯地址包括
- 不可编程部分:1010
- 可编程部分:由硬件管脚A0/1/2决定
- 数据传输方向:读数据'1' 写数据'0'
写地址操作:0xA0
读地址操作:0xA1


2.2. AT24C02读写时序
AT24C02支持的读写操作
写操作:
- AT24C02支持字节写模式和页写模式
- 字节写模式就是一个地址一个数据进行写入
- 页写模式就是连续写入数据,只需要写一个地址,连续写入数据时数据会自增,但存在页的限制,超出一页时,超出数据覆盖原先写入的数据,但读会自动翻页
读操作:
- AT24C02支持当前地址读模式,随机地址读模式和顺序读模式。
- 当前读模式是基于上一次读/写操作的最后位置继续读出数据。
- 随机地址读模式是指定地址读出数据。
- 顺序读模式是连续读出数据。
2.2.1. AT24C02写时序


注意:EEPROM比较慢,必须等到10ms后再写下一个字节
2.2.2. AT24C02读时序


2.3. AT24C02驱动
硬件和软件IIC对比
|
IIC |
用法 |
速度 |
稳定性 |
管脚 |
|
硬件IIC |
比较复杂 |
快 |
较稳定 |
需使用特定管脚 |
|
软件IIC |
操作过程比较清晰 |
较慢 |
稳定 |
任意管脚,比较灵活 |
2.3.1. IIC配置步骤
- 使能SCL和SDA对应时钟
__HAL_RCC_GPIOB_CLK_ENABLE()
- 设置GPIO工作模式
SDA开漏、SCL推挽输出模式,使用HAL_GPIO_Init初始化
- 编写基本信号
起始信号、停止信号、应答信号(主机:send ack、seng nack;从机:wait ack)
- 编写读和写函数
iic_read_byte
iic_send_byte
为什么IIC总线SDA建议使用开漏模式?
IIC的SDA脚即要作为输出,又要作为输入,用开漏输出模式,很好实现输出输入共用,避免IO模式频繁切换带来的麻烦。
输出时:主机(MCU)输出0,可以拉低信号,来实现低电平发送,主机输出1(实际不起作用),由外部上拉电阻上拉,实现高电平发送。
输入时:主机(MCU)设置输出1状态,此时因为MCU无法输出1,相当于释放了SDA脚,此时外部器件可以主动拉低SDA脚/释放SDA脚(同样由上拉电阻提供“输出1的功能”),实现SDA脚的高低电平变化。
由于开漏输出模式下,MCU还是可以读取IDR状态寄存器,来获取引脚高低电平,因此MCU读取IDR,即可获得SDA脚的高低电平状态,从而实现输入检测。
2.3.2. AT24C02配置步骤
- 初始化IIC接口
- 编写写入、读取一个字节数据函数:遵循时序流程编写
- 编写连续读和连续写函数。


995

被折叠的 条评论
为什么被折叠?



