1.I2C外设简介
(1)STM32内部集成了硬件I2C收发电路,可以由硬件自动执行时钟生成,起始终止条件生成,应答位收发,数据收发等功能,减轻CPU的负担。(由硬件电路自动翻转引脚电平,软件只需写入控制寄存器CR和数据寄存器DR)
(2)支持多主机模式:1.固定多主机:有固定的主机。
2.可多变主机:没有固定的主机,任意从机可跳出来当主机。
(3)支持7位/10位地址模式。
(4)支持不同的通讯速度,标准速度(高达100KHZ),快速(高达400KHZ).
(5)支持DMA(可提高效率)
(6)兼容SMBus协议
(7)STM32F103C8T6硬件I2C资源:I2C1,I2C2
硬件I2C优势:执行效率高,可以节省软件资源;功能比较强大,可以实现完整的多主机通信模式,时序波形规整,通信速率快等。
地址模式:
1.7位地址:I2C起始第一个字节的前7位为地址。
2.10位地址:I2C起始后的第一个字节的第6,7位和第二个字节8位为地址。(注:第一个字节的前五位为11110作为10位地址标志位)
2.I2C外设框图
3.I2C外设基本结构
解释:
(1)因为I2C是高位先行,所以移位寄存器向左移位,在发送的时候,最高位先移出去,然后是次高位......,一个SCL时钟移位一次,移位8次,这样能够把一个字节由高位到低位,依次放到SDA上了。接收的时候:数据通过GPIO口从右边依次移进来,最终移8次,一个字节就接收完成了。
(2)GPIO使用硬件I2C时,要配置成复用开漏输出模式(即GPIO状态交给片上外设来控制的)
(3)时钟控制器通过GPIO去控制时钟线(因为我i一主多从模式,所以只画了输出)
4.主机发送
主机发送流程:起始——从机地址+写——应答——数据应答——数据2——应答......——停止
5.主机接收
主机接收流程:起始——接收地址+写——应答——数据——应答——重新起始——接收地址+读——应答——接收数据——发送应答.........——接收数据——发送非应答——终止
6.关于主机发送和接收的补充
(1)硬件I2C时,发送应答和接收应答不需要操作,因为在发送数据I2C_SendData()和接收数据I2C_ReceiveData()时自动应答了。
(2)硬件I2C时,在起始发送数据,接收数据时会产生时间标志位,需要接收到标志位后再进行后面的操作。
(3)在STM32接收数据时,在最后一个接收数据前要提前将应答控制器ACK置0,终止条件置1。(因为ACK和STOP有滞后性,如果在接收完最后一个数据时发送ACK,STOP,ACK和STOP会在后一个数据生效)
7.I2C外设相关函数
7.1 标配函数
void I2C_DeInit()
void I2C_Init();
void I2C_StructInit();
void I2C_Cmd();
7.2 void I2C_GenerateSTART();
作用:生成起始条件。
7.3 void I2C_GenerateSTOP();
作用:生成终止条件。
7.4 void ACKKnokledgeConfig();
作用:STM32作为主机,收到一个字节后,是给从机应答,还是给非应答。
7.5 void I2C_SendData()\
作用:发送数据(写数据到DR)
7.6 void I2C_ReceiveData()
作用:接收数据(读取DR数据)
7.7 void I2C_Send7bitAddress()
作用:发送7位地址专用函数
7.8 Errorstatus I2C_CheckEvent();
作用:同时判断一个或多个标志位来确定EVN,EVN这个状态是否发生。
7.9 标志位标配函数
FlagStatus I2C_GetFlagStatus();
void I2C_ClearFlag();
ITStatus I2C_GetITStatus();
void I2C_ClearITPendingBit();