STM32学习,I2C

STM32学习,I2C 1I2C总线电路结构数据线传送数据时钟线传送时钟2逻辑线与3主机向从机发送时钟数据的逻辑时钟从机的SCL全部写入1当主机的SCL写入0时由于是开漏输出相当于接地所以输出输出低电平。当主机的SCL写入1时总的SCL线悬空由于上拉电阻的存在,呈现高电平数据与时钟同理4从机向主机发送数据的逻辑主机的SDA线写入1除了要发送数据的从机外其他从机的SDA线全部写1要发送的数据的从机的SDA线来分别写1或0写1输出高电压1输出低电压5I2C通信基本流程主机首先发送起始位然后写入要与之通信的从机的七位地址还要加上0或10代表向从机写数据1代表读从机发送的数据最后再加上停止位6I2C数据帧格式起始位SCL高电压SDA出现从高电平到低电平的下降沿停止位SCL高电压SDA出现从低电平到高电平的上升沿发送流程首先从机的SDA和SCL均写入1主机的SCL和SDA首先发送起始位然后进入寻址阶段在SDA发送从机的地址和读写位再由从机的SDA发送低电压表示应答成功。然后进入传输数据阶段主机通过SDA传送完数据后从机SDA发送低电压表示收到数据然后主机再发送数据以此类推,最后主机发送停止位。主机读从机发来的数据与上面类似只不过是从机发送数据主机应答7I2C引脚初始化代码如下//对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_PinGPIO_Pin_8|GPIO_Pin_9;GPIO_InitStruct.GPIO_ModeGPIO_Mode_AF_OD;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_2MHz;GPIO_Init(GPIOB,GPIO_InitStruct);8I2C设置代码如下