1:I2C总线电路结构
数据线:传送数据
时钟线:传送时钟
2:逻辑线与
3:主机向从机发送时钟,数据的逻辑
时钟:从机的SCL全部写入1,当主机的SCL写入0时,由于是开漏输出,相当于接地,所以输出输出低电平。当主机的SCL写入1时,总的SCL线悬空,由于上拉电阻的存在,呈现高电平
数据:与时钟同理
4:从机向主机发送数据的逻辑
主机的SDA线写入1,除了要发送数据的从机外,其他从机的SDA线全部写1,要发送的数据的从机的SDA线来分别写1或0
写1输出高电压,1输出低电压
5:I2C通信基本流程
主机首先发送起始位,然后写入要与之通信的从机的七位地址,还要加上0或1,0代表向从机写数据,1代表读从机发送的数据,最后再加上停止位
6:I2C数据帧格式
起始位:SCL高电压,SDA出现从高电平到低电平的下降沿
停止位:SCL高电压,SDA出现从低电平到高电平的上升沿
发送流程:首先,从机的SDA和SCL均写入1,主机的SCL和SDA首先发送起始位,然后进入寻址阶段,在SDA发送从机的地址和读写位,再由从机的SDA发送低电压,表示应答成功。然后进入传输数据阶段,主机通过SDA传送完数据后,从机SDA发送低电压,表示收到数据,然后主机再发送数据,以此类推,最后主机发送停止位。
主机读从机发来的数据与上面类似,只不过是从机发送数据,主机应答
7:I2C引脚初始化
代码如下
//对IO引脚重映射,对I2C1进行重映射
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启AFIO时钟
GPIO_PinRemapConfig(GPIO_Remap_I2C1,ENABLE);//开启重映射
//对PB8和PB9进行初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct={0};
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_OD;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
8:I2C设置
代码如下