
特点只用两根线就能让主控和多个外设通信是种同步半双工串行通信协议结构特点电气特点SCL和SDA都是开漏/开集电极结构必配上拉电阻。I2C设备只能主动把线拉低不能主动输出高电平。当没有器件拉低总线时线上的高电平是靠上拉电阻提供的IIC通信过程是怎么进行的一帧典型主机发送起始信号主机发送从机地址主机发送读写方向位从机返回应答主机和从机传输数据每发完1字节对方返回一次应答最后发送停止信号起始信号停止信号应答信号是什么起始信号Start当SCL保持高电平时SDA从高电平跳变到低电平这表示起始信号时钟线高数据线由高变低表示通信开始停止信号Stop当SCL保持高电平SDA从低电平跳变到高电平表示停止信号时钟线高数据线低变高表示通信结束应答信号ACKI2C按字节传输在数据传输阶段每发完8位数据接收方都要在第9个时钟给出应答。拉低SDA表示ACK不拉低SDA表示NACKIIC的读写区分先写地址再重新开始读数据0 写1读主机给器件写数据起始从机地址 写位应答寄存器地址或存储地址应答数据应答停止主机从器件读数据起始从机地址 写位应答先告诉对方读哪个寄存器地址重启始从机地址 读位应答从机发送数据主机应答/非应答停止为什么IIC可以挂多个设备因为IIC是靠地址区分设备的在同一条总线上可以同时挂多个从机主机发送通信时先发送从机地址只有地址匹配的那个设备才会响应其他设备保持安静优势节省引脚布线简单一个主控能挂多个外设限制同一条总线上设备地址不能冲突IIC常见速度模式标准模式100kHz快速模式400KHz快速模式增强1MHz高速模式3.4MHzSTM32使用IIC硬件IICHAL有时用7位地址左移后的格式根据读写函数自动置读写位//写 HAL_I2C_Mem_Write(hi2c1, dev_addr, mem_addr, I2C_MEMADD_SIZE_8BIT, buf, len,1000); //读 HAL_I2C_Mem_Read(hi2c1, dev_addr, mem_addr, I2C_MEMADD_SIZE_8BIT, buf, len, 1000);