STM32 I2C读写EEPROM(AT24C02)理论知识

STM32 I2C读写EEPROM(AT24C02)个人调试Bug经验

本篇文章是本人学习野火STM32读写EEPROM的视频总结而来的笔记,上面的链接有解答关于《火哥视频中EEPROM_WaitForWriteEnd()函数检测EV6事件为什么不能用CheckEvent()函数来检测》问题的解答。

上述问题火哥视频的链接[24-I2C—读写EEPROM(第7节中)—代码详解-读写EEPROM] 进度条58:50自己去看


I2C协议介绍


物理层

请添加图片描述
在这里插入图片描述

1.SCL 串行时钟线

2.SDA 双向串行数据线

3.每个设备有独立的地址

4.每个设备在空闲状态时都会输出高阻态,所有都为空闲状态时,则总线被上拉为高电平

5.SDA 设备用高阻态表示高电平(1),接地表示低电平(0)

6.三种传输模式:标准传输速率为100kbit/s,快速模式为400kbits/s,高速模式为3.4Mbit/s(大多数设备不支持)



协议层

1.I2C基本读写过程

请添加图片描述请添加图片描述

1. 数据和时钟线都为高时总线处于空闲状态

2. 当SCL为高电平时SDA的下降沿为起始条件( S )。

3. 当SCL为高电平时SDA的上升沿为停止条件( P )。

4. 当SCL为高电平时,SDA的数据有效,否则无效


2.地址及数据方向

请添加图片描述

前七位为从机地址,最后一位为读写方向位

从高位开始传输


3.响应

请添加图片描述

当数据端释放SDA控制权后,若接收端控制SDA为低电平时(在第9个时钟),则产生了应答信号(ACK),若为高电平,即无动作,则产生非应答信号(NACK)



STM32的I2C架构


1.通讯引脚

请添加图片描述

I2C1

默认复用
SCL:PB5 SDA:PB6

重定义
SCL:PB8 SDA:PB9

I2C2

默认复用
SCL:PB10 SDA:PB11

2.时钟控制逻辑

请添加图片描述

请添加图片描述请添加图片描述

1.I2C模块的时钟频率必须是10MHz整数倍

2.PE为0时才能配置CCR寄存器

3.标准模式下(100kbit/s) Thigh = Tlow(注:T = Thigh + Tlow,这里的100kHz的周期应当是二者相加)

4.DUTY 位标准模式没关系,是用来设置快速模式的占空比(2:1 16:9)

5.CCR根据自己配置的I2C模式自行计算,

若PCLK = 8MHz (FREQ寄存器控制)

100kbit/s 对应的 CCR = 0x28 = 40

400kbit/s 对应的 CCR = 0x0A = 10


3.数据控制逻辑

请添加图片描述
请添加图片描述


4.整体控制逻辑

请添加图片描述

请添加图片描述
请添加图片描述请添加图片描述

I2C配置由CR1 和 CR2 寄存器配置
工作时的状态由SR1 和 SR2 寄存器显示


STM32 I2C 通讯过程

1.主发送器模式

请添加图片描述

7位主发送模式过程:

1. Start 信号产生。
2. EV5事件产生,SB = 1 ,即开始条件发送完成位置1,读SR1 寄存器,并写入DR寄存器能清除该事件。
3. 把地址写入DR寄存器。
4. 接收到ACK信号。
5. 产生EV6事件,ADDR(地址已被发送位) = 1 ,当收到地址的ACK后该位被置1,读SR1 和 SR2 会清除该位。
6. 产生EV8_1事件, TXE(数据寄存器为空位) = 1 ,移位寄存器和数据寄存器都为空,写入DR寄存器可以清除该标志位。
7. 写入DR寄存器。
8. 产生EV8事件,TXE(数据寄存器为空位) = 1 ,数据寄存器为空,移位寄存器不为空,写入DR寄存器可以清除该位。
9. 接收到ACK应答信号。
10. 写入DR寄存器(第二次发送数据)。
11. 产生EV8事件,TXE(数据寄存器为空位) = 1 ,数据寄存器为空,移位寄存器不为空,写入DR寄存器可以清除该位。
12. 所有数据发送完成后产生EV8_2事件,此时BTF 和 TXE = 1 。
13. 发送停止信号

10位主发送模式过程同理

2.主接收器模式

请添加图片描述

7位主接收模式过程:

1. Start 信号产生。
2. EV5事件产生,SB = 1 ,即开始条件发送完成位置1,读SR1 寄存器,并写入DR寄存器能清除该事件。
3. 把地址写入DR寄存器。
4. 接收到ACK信号。
5. 产生EV6事件,ADDR(地址已被发送位) = 1 ,当收到地址的ACK后该位被置1,读SR1 和 SR2 会清除该位。
6. 产生EV6_1事件,用于接收1个字节,需要清除响应(ACK)和停止条件(STOP)的产生位。
7. 主机产生ACK应答信号。
8. 产生EV7事件,RXNE = 1 ,此时DR寄存器不为空,需要读DR寄存器来清除该事件。
9. 主机产生ACK应答信号。
10. 产生EV7_1事件,RXNE = 1 ,此时DR寄存器不为空,需要读DR寄存器来清除该事件。并且需要设置ACK = 0 ,STOP = 1。
11. 主机产生NACK非应答信号。
12. 主机产生STOP信号。
13. 产生EV7事件。

10位主接收模式过程同理



STM32 IIC 库函数

1.I2C 初始化结构体

请添加图片描述

1.I2C_ClockSpeed

请添加图片描述

注:I2C的标准和快速模式已经在这里配置完成,根据输入的时钟值来确定,小于等于100k为标准,否则为快速


2.I2C_Mode

请添加图片描述

3.I2C_DutyCycle

请添加图片描述

4.I2C_OwnAddress1

请添加图片描述

5.I2C_Ack

请添加图片描述

6.I2C_AcknowledgedAddress

请添加图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Varocol

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值