什么是IIC?
IIC(即I2C)是一种二线式串行总线,
SDA总线为双向数据传输线
SCL总线为时钟控制线,用于同步时钟信号,以完成数据收发同步。
微控制器(MCU)与被控制端(外设)、外设与外设之间可以通过IIC总线进行半双工通信
IIC的特点
1、支持多设备连接的总线,一条IIC总线中可以有多个主机和从机。
2、每一个连接到IIC总线上的设备都有唯一地址(7位/10位),主机可以利用这个地址对从机进行访问。
3、总线通过上拉电阻接到电源。当IIC设备空闲时会呈高阻态,当所有IIC设备都空闲时,即都输出高阻态,由上拉电阻把总线拉高成高电平。
IIC通信协议
1、主机发送 S(开始信号),接着发送1字节的数据,高7位为地址码,最低位时方向位,方向位表明主机与从机间数据的传输方向。
2、系统中所有从机将自己的地址与主机发送到总线上的地址进行比较,如果从机地址与总线上的地址相同,则进行响应。
3、根据方向位确定是主机向从机发送数据还是从从机接收数据
4、当数据传输完成后发送 P(停止信号),释放IIC总线
S(开始信号):当SCL为高电平时,SDA下降沿为开始信号
P(停止信号):当SCL为高电平时,SDA上升沿为停止信号
数据有效性
进行数据传输时,SCL高电平时,SDA表示的数据有效。
也就意味着,SCL信号线控制着数据同步,当SCL低电平时,SDA进行电平转换。SCL的电平切换频率决定着IIC传输数据的速率。
响应
IIC的数据和地址都有响应,从机接收到数据后。
响应包括应答(ACK)和非应答(NACK)两种信号。
接收端希望继续接受数据时发送应答(ACK),反之希望结束数据传输时,发送非应答(NACK)
STM32的IIC模块架构
IIC共有四种模式:从发送器、从接收器、主发送器、主接收器
默认情况下以从模式工作,在产生开始信号后,接口自动进入主模式
typedef struct
{
uint32_t I2C_ClockSpeed; /*!< Specifies the clock frequency.
This parameter must be set to a value lower than 400kHz */
uint16_t I2C_Mode; /*!< Specifies the I2C mode.
This parameter can be a value of @ref I2C_mode */
uint16_t I2C_DutyCycle; /*!< Specifies the I2C fast mode duty cycle.
This parameter can be a value of @ref I2C_duty_cycle_in_fast_mode */
uint16_t I2C_OwnAddress1; /*!< Specifies the first device own address.
This parameter can be a 7-bit or 10-bit address. */
uint16_t I2C_Ack; /*!< Enables or disables the acknowledgement.
This parameter can be a value of @ref I2C_acknowledgement */
uint16_t I2C_AcknowledgedAddress; /*!< Specifies if 7-bit or 10-bit address is acknowledged.
This parameter can be a value of @ref I2C_acknowledged_address */
}I2C_InitTypeDef;
I2C_ClockSpeed:设置控制始终频率,必须小于400000(IIC最大传输速率为400k)
I2C_Mode:设置IIC接口模式,可设置为主/从。
I2C_DutyCycle:设置SCL信号占空比,为2或16/9
I2C_OwnAddress1:设置STM32的IIC接口的设备地址。
I2C_Ack:应答使能,配置端口使用或禁止应答。
I2C_AcknowledgedAddress:寻址模式7位或者10位