目录
1:IIC简介
IIC:(Inter_integrated circuit),两线式串行总线,它是由数据线SDA和时钟SCL构成的串行总线,可发送和接受数据,在CPU与被控IC之间,IC与IC之间进行双向传送,高速IIC总线一般可达400kbps.
一般在51中,没有硬件的IIC,只能用软件加引脚去模拟IIC的通信时序,STM32则一般都有硬件IIC
IIC是半双工 通信方式
2:IIC协议
- 空闲状态
- 开始信号
- 停止信号
- 应答信号
- 数据的有效性
- 数据传输
- 通信过程简述
空闲状态
IIC总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截至状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高
开始信号
当SCL为高期间,SDA由高到低的跳变,启动信号是一种电平跳变时序信号,而不是一个电平信号。
停止信号
当SCL为高期间,SDA由低到高的跳变,停止信号也是一种电平跳变时序信号,而不是一个电平信号
应答信号ACK
发送器每发送一个字节,就在第九个时钟脉冲期间释放数据线,由接收器反馈一个应答信号,应答信号为低电平时,规定为有效应答位ACK,表示接收器已经成功地接受了该字节,应答信号为高电平时,规定为非应答位NACK,一般表示接收器接受该字节没有成功。
对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平
数据有效性
IIC总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化
数据在SCL的上升沿到来之前就需准备好,并在下降沿到来之前必须稳定
数据的传输
在IIC总线上传送的每一个数据都用一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在SDA上逐位地串行传送每一个数据。数据位地传输是边沿触发
通信过程简介
数据传输遵循下面格式,在起始条件(S)后,发送了一个从机地址,这个地址共有7位,(也有10位的),紧接着的第8位是数据方向位(R/W)——'0'表示发送(写),‘1’表示请求数据(读)。数据传输一般由主机产生的停止位(P)终止。但是,如果主机仍希望在总线上通讯,它可以产生重复起始条件和寻址另一个从机,而不是首先产生一个停止条件。
3:STM32_IIC
eg:STM32F407ZGT6
有3个硬件IIC,在每个IIC的可选配置选项中有
有这样三个玩意,I2C不用说,就是前面介绍的,SMBus 简单说下
SMBus:System Management Bus(系统管理总线),它是以IIC的工作原理为基础,细的不说,直接来康康有什么异同
SMBus与IIC相似之处
- 双线制总线协议(1个时钟总线,一个数据总线)+可选SMBus报警线
- 主从通信,主器件提供时钟
- 多主器件功能
- SMbus数据格式与IIC 7位地址格式相似
SMBus与IIC之间的差异
SMBus可针对系统和电源管理相关的任务提供控制总线,系统可使用SMBus 与设备进行消息传递,而无需切换各个控制线。
4:STM32_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;
- 设置通信的频率,最高到400KHZ,操作的是CCR寄存器
- 设置模式,可以是I2C_Mode_I2C、I2C_Mode_SMBusDevice、I2C_Mode_SMBusHost,操作CRx寄存器
- 设置IIC快速模式的占空比,可以是I2C_DutyCycle_16_9、I2C_DutyCycle_2,操作的是CCR寄存器
- 设置从设备地址,操作OARx寄存器
- 设置是否启动应答,操作CRx寄存器
- 设置7位或10位的地址,操作OARx寄存器