=============================
2022-8-31
=============================
一.温故知新
串口之I²C
1.I²C总线中包含两条线(SDA数据线 和 SCL时钟线)
2.I²C总线上可以连接很多的I²C接口的设备,设备与设备之间都串联起来的
3.I²C总线规定了,凡是连接到I²C总线上的设备都需要有一个设备地址
一般来说设备地址是7bit
4.I²C总线上的设备需要区分主设备和从设备
5.如果I²C总线上的两个设备都想要和另外的一个设备通信,会触发抢主机制
抢主机制 : 谁先产生开始信号,谁就优先通信
6.I²C总线规定了,在空闲状态下SDA和SCL要保持高电平的状态
所以I²C总线需要外接上拉电阻
7.开始信号和结束信号
开始信号 : 在SCL为高电平时,SDA由高电平拉到低电平
结束信号 : 在SCL为高电平时,SDA由低电平拉到高电平
8.传输数据
1)在SCL为低电平的时候,把数据放到SDA数据线上
2)拉高SCL,延时一段时间,(当SCL为高电平时,SDA保持不变)
3)拉低SCL,切换下一位数据放到SDA数据线上
9.传输一个字节数据需要9个周期 = 8个数据周期 + 1个ACK周期
A.I²C总线属于停等式的流控,传输完一个字节数据需要有应答
B.产生ACK和读取ACK
1)产生ACK : 在第9个周期,拉低SCL,把SDA也拉低,拉高SCL
2)读取ACK : 在第9个周期,当SCL为高电平时,读取SDA的电平
C.I²C总线是高位先出
D.主设备给从设备发送数据
1)主设备产生开始信号
2)主设备发送从设备的设备地址 + 写的标志(0)
3)主设备等待ACK
4)主设备发送一个字节数据
5)主设备等待ACK
...
n)主设备发送最后一个字节数据
n+1)主设备可以等待或者不等待ACK
n+2)主设备产生结束信号
E.主设备读取从设备的数据
1)主设备产生开始信号
2)主设备发送从设备的设备地址 + 读的标志(1)
3)主设备等待ACK
4)主设备等待读取一个字节数据
5)主设备产生ACK
...
n)主设备读取最后一个字节数据
n+1)主设备不产生ACK
n+2)主设备产生结束信号
二.I²C接口设备之E²PROM
1.简单了解E²PROM
E²PROM : 也叫做EEPROM,电可擦除可编程的只读存储器
作用 : 是一种存储类的设备
特点 : 存储到E²PROM中的数据,设备掉电之后,数据不会丢失
注意 : E²PROM并不是硬盘
应用 : 使用E²PROM存储特殊的数据
(门禁打卡设备、测量设备、仪器仪表、用来存储BIOS或者BootLoader)
2.ROM的发展历史
ROM 只读存储器 特点是内部存储的数据只能读取,不能写入或者修改
PROM 可编程的只读存储器 特点是内部存储的数据可以通过编程方法修改一次
EPROM 可擦除可编程的只读存储器 特点是内部存储的数据可以修改多次
修改方法有限制
需要通过紫外线照射存储介质
EEPROM 电可擦除可编程的只读存储器 特点是内部存储的数据可以修改多次
通过电信号即可清除数据
3.通过手册了解E²PROM
打开<STM32RBT6\DataSheet\其他>目录下
<AT24C02_ATMEL Corporation.pdf>
1)我们的开发板上使用的E²PROM是阿特梅尔公司的模块
2)使用的是8管脚的封装形式
(A0 A1 A2<设备地址> GND<接地> SDA<数据线> SCL<时钟线>)
(WP(写保护) VCC<接电源>)
3)使用的是I²C接口的E²PROM
4)规格
型号 规格 存储大小 Page
AT24C01 1K 128byte 16个Page
AT24C02 2K 256byte 32个Page
AT24C04 4K 512byte 32个Page
AT24C08 8K 1024byte 64个Page
AT24C16 16K 2048byte 128个Page
eeprom
5)任何规格的E²PROM的设备地址的高四位都是固定的了1010
1K/2K规格可以通过A2 A1 A0管脚选择设备地址
4K规格可以通过A2 A1管脚选择设备地址
8K规格可以通过A2管脚选择设备地址
16K规格没有管脚可以选择设备地址
6)通过开发板原理图的解析可以了解
我们开发板上的E²PROM的设备地址是
10100000(写操作的设备地址)0xA0
10100001(读操作的设备地址)0xA1
7)写操作
1>按字节来写
a>产生开始信号
b>发送设备地址 + 写的标志(10100000<0xA0>)
c>等待ACK
d>发送内部存储空间的地址(0x00 - 0xFF)
e>等待ACK
f>发送一个字节数据
g>等待ACK
h>产生结束信号
2>按页来写(注意:有页内回滚)
a>产生开始信号
b>发送设备地址 + 写的标志(10100000<0xA0>)
c>等待ACK
d>发送内部存储空间的地址(0x00 - 0xFF)
e>等待ACK
f>发送一个字节数据
g>等待ACK
...
n>发送最后一个字节数据
n+1>等待ACK
n+2>产生结束信号
页内回滚
8)读操作
1>当前地址读
a>产生开始信号
b>发送设备地址 + 读的标志(10100001<0xA1>)
c>等待ACK
d>读取一个字节数据
e>不产生ACK
f>产生结束信号
2>随机地址读
a>产生开始信号
b>发送设备地址 + 写的标志(10100000<0xA0>)
c>等待ACK
d>发送内部存储空间的地址
e>等待ACK
f>产生开始信号
g>发送设备地址 + 读的标志(10100001<0xA1>)
h>等待ACK
i>读取一个字节数据
j>不产生ACK
k>产生结束信号
3>顺序读(整个存储空间的回滚)
可以直接拼接到当前地址读或者随机地址读的后面