stm32----iic

1、基本概念
主机 初始化发送,产生时钟信号和终止发送的器件
从机 被主机寻址的器件
发送器 发送数据到总线的器件
接收器 从总线接收数据的器件
多主机 同时有多于一个主机尝试控制总线 但不破坏报文
仲裁 是一个在有多个主机同时尝试控制总线,但只允许其中一个控制总线并使报文不被破坏的过程
同步 两个或多个器件同步时钟信号的过程

2、硬件结构
每一个I2C总线器件内部的SDA、SCL引脚电路结构都是一样的,引脚的输出驱动与输入缓冲连在一起。其中输出为漏极开路的场效应管、输入缓冲为一只高输入阻抗的同相器。这种电路具有两个特点:
stm32----iic_第1张图片(1)由于 SDA、SCL 为漏极开路结构,借助于外部的上拉电阻实现了信号的“线与”逻辑;
(2)引脚在输出信号的同时还将引脚上的电平进行检测,检测是否与刚才输出一致。为 “时钟同步”和“总线仲裁”提供硬件基础。

3、时钟同步
如果从机希望主机降低传送速度可以通过将SCL主动拉低延长其低电平时间的方法来通知主机,当主机在准备下一次传送发现SCL的电平被拉低时就进行等待,直至从机完成操作并释放SCL线的控制控制权。这样以来,主机实际上受到从机的时钟同步控制。可见SCL线上的低电平是由时钟低电平最长的器件决定;高电平的时间由高电平时间最短的器件决定。这就是时钟同步,它解决了I2C总线的速度同步问题。

4、主机发送数据流程
(1)主机在检测到总线为“空闲状态”(即 SDA、SCL 线均为高电平)时,发送一个启动信号“S”,开始一次通信的开始
(2)主机接着发送一个命令字节。该字节由 7 位的外围器件地址和 1 位读写控制位 R/W组成(此时 R/W=0)
(3)相对应的从机收到命令字节后向主机回馈应答信号 ACK(ACK=0)
(4)主机收到从机的应答信号后开始发送第一个字节的数据
(5)从机收到数据后返回一个应答信号 ACK
(6)主机收到应答信号后再发送下一个数据字节
(7)当主机发送最后一个数据字节并收到从机的 ACK 后,通过向从机发送一个停止信号P结束本次通信并释放总线。从机收到P信号后也退出与主机之间的通信
stm32----iic_第2张图片注意:①主机通过发送地址码与对应的从机建立了通信关系,而挂接在总线上的其它从机虽然同时也收到了地址码,但因为与其自身的地址不相符合,因此提前退出与主机的通信;②主机的一次发送通信,其发送的数据数量不受限制。主机是通过 P 信号通知发送的结束,从机收到 P 信号后退出本次通信;③主机的每一次发送后都是通过从机的 ACK 信号了解从机的接收状况,如果应答错误则重发。

5、主机接收数据流程
(1)主机发送启动信号后,接着发送命令字节(其中 R/W=1)
(2)对应的从机收到地址字节后,返回一个应答信号并向主机发送数据
(3)主机收到数据后向从机反馈一个应答信号
(4)从机收到应答信号后再向主机发送下一个数据
(5)当主机完成接收数据后,向从机发送一个“非应答信号(ACK=1)”,从机收到ASK=1 的非应答信号后便停止发送
(6)主机发送非应答信号后,再发送一个停止信号,释放总线结束通信
stm32----iic_第3张图片注意:主机所接收数据的数量是由主机自身决定,当发送“非应答信号/A”时从机便结束传送并释放总线(非应答信号的两个作用:前一个数据接收成功,停止从机的再次发送)。

一、I2C的用处
I2C 通讯协议(Inter-Integrated Circuit)是由Phiilps公司开发的,
由于它引脚少,硬件实现简单,可扩展性强,不需要USART、 CAN等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。

二、总体流程
I2C数据传输基本过程:
1、主机首先发送开始信号
2、主机紧接着发送从机地址信息(一个字节),该字节信息中的最低位为读写控制码:1为读、0为写。高7位为从机设备的器件地址
3、从机然后发出确认信号
4、主机开始发送信号数据,每当发完一个字节数据后,从机设备给主机发送确认信号
5、主机最后发送停止信号

三、I2C的读写流程:
I2C写操作寄存器的流程是:
1、主机发送START开始信号
2、主机发送从机设备地址信息(I2C addr(7bit)和w操作0(1bit)),等待ACK确认信号
3、从机发送ACK确认信号
4、主机发送寄存器地址信息(reg addr(8bit)),等待ACK确认信号
5、从机发送ACK确认信号
6、主机发送数据(8bit),即也是要写入寄存器中的数据,等待ACK确认信号
7、 从机发送ACK确认信息
8、其中第4步到第7步可以重复多次,即顺序操作写多个寄存器
9、主机发起STOP停止信号

I2C读操作寄存器的流程是:
1、主机发送START开始信号
2、主机发送从机设备地址信息(I2C addr(7bit)和w操作0(1bit)),等待ACK确认信号
3、从机发送ACK确认信号
4、主机发送寄存器地址信息(reg addr(8bit)),等待ACK确认信号
5、从机发送ACK确认信号
6、从机发送数据(8bit),即寄存器里的值
7、主机发送ACK确认信号
8、第4步到第7步可以重复多次,即顺序读多个寄存器

四、编程要点:
①、配置通信使用的目标引脚为开漏模式;
②、使能IIC外设的时钟;
③、配置I2C外设的模式、地址、速率等参数,并使能I2C外设;
④、编写I2C按字节收发的函数;
⑤、编写读写EEPROM存储内容的函数;
⑥、编写测试程序,对读写数据进行校验。

1、初始化IIC相关的GPIO
2、配置IIC外设的工作模式
3、编写IIC写入EEPROM的Byte write函数
4、编写IIC读取EEPROM的RANDOM Read函数
5、使用read函数及write函数进行读写校验
6、编写page write 及seq read函数并校验

五、任务
本实验以EEPROM的读写实验为例,以I2C外设采用主模式,分别用作主发送器和主接收器,通过查询事件的方式来确保正常通信。

六、具体函数
I2C初始化结构体详解
typedef struct
{
uint32_t I2C_ClockSpeed; /设置SCL时钟频率,此值要低于400000/

uint16_t I2C_Mode; /*指定工作模式,可选I2C模式及SMBUS模式 */

uint16_t I2C_DutyCycle; /指定时钟占空比,可选low/high = 2:1及16:9模式/

uint16_t I2C_OwnAddress1; /*指定自身的I2C设备地址 */

uint16_t I2C_Ack; /*使能或关闭响应(一般都要使能) */

uint16_t I2C_AcknowledgedAddress; /指定地址的长度,可为7位及10位/
}I2C_InitTypeDef;

** IIC EEPROM 配置,工作参数配置**
void I2C_EE_Config(void);
向EEPROM写入一个字节
void EEPROM_Byte_Write(uint8_t addr,uint8_t data);
向EEPROM写入多个字节(页写入),每次写入不能超过8个字节
void EEPROM_Page_Write(uint8_t addr,uint8_t *data,uint8_t numByteToWrite);
从EEPROM读取数据
void EEPROM_Read(uint8_t addr,uint8_t *data,uint8_t numByteToRead);
等待EEPROM内部时序完成
void EEPROM_WaitForWriteEnd(void);

你可能感兴趣的:(STM32常用通信协议)