目录
一。硬件介绍
1.1电路介绍
所有I2C设备的SCL连在一起,SDA连在一起
设备的SCL和SDA均要配置成开漏输出模式
SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右
1.2硬件电路图
1.3 I2C时序
起始条件:SCL高电平期间,SDA从高电平切换到低电平
终止条件:SCL高电平期间,SDA从低电平切换到高电平
发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节
接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)
发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)
1.4 I2C总时序图
注:时间可以设置慢一点。
1.5 STM32 I2C硬件介绍
•STM32内部集成了硬件I2C收发电路,可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能,减轻CPU的负担
•支持多主机模型
•支持7位/10位地址模式
•支持不同的通讯速度,标准速度(高达100 kHz),快速(高达400 kHz)
•支持DMA
•兼容SMBus协议
1.6 STM32 I2C硬件框图
1.7 STM32 I2C 基本结构
1.8 STM32 I2C 主机发送
1.9 STM32 I2C 主机接收
二。代码实现(硬件方法)
void I2C_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;//I2C使用到的引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
I2C_InitTypeDef I2C_InitStructure;
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;//选择IIC模式
I2C_InitStructure.I2C_ClockSpeed = 50000;//通信速率
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;//占空比,在快速模式下有用
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;//7位地址
I2C_InitStructure.I2C_OwnAddress1 = 0x00;//I2C主机地址
I2C_Init(I2C2, &I2C_InitStructure);
I2C_Cmd(I2C2, ENABLE);
}
//使用库函数接收发送数据
void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState);//开始信号
void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState);//结束信号
void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState);//应答配置
void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, uint8_t Address);//地址配置
void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data);//发送数据
void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction);//发送地址
uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx);//读数据
uint16_t I2C_ReadRegister(I2C_TypeDef* I2Cx, uint8_t I2C_Register);//读寄存器数据
ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT);//确定时间发生
总结:
stm32-I2C通信有软硬件方法,这是硬件方法实现的。
本文只用于学习和记录。