1、引言
IIC通信是总线型通信,理论上一套总线上可以挂载127个从机设备,在IIC设备通信过程中,首要步骤是主机对从机进行设备地址进行确认,如果设备地址正确且IIC从设备工作正常,那么从设备会返回1个ACK确认信号,表示可与主机建立通信。如果主机没有接收到从设备的ACK应答信号,说明双方的IIC通信是不能正常建立起来。因此在进行IIC从设备数据读取时,可以提前读取总线上所有设备的IIC地址,能够获取到正常通信的IIC设备类型。
2、操作思路
IIC协议规定了IIC设备的地址为7位,在一条总线上理论上会有128个设备地址,因此主机只需从设备地址0到设备地址127顺序发起IIC通信信号后等待从设备的IIC应答ACK信号,若存在ACK应答则输出该设备地址。以下使用STM32L4主控作为IIC主设备,向总线上的从设备发起写入指令
示例代码
void IIC_Wait_Ack(uint8_t addr) { IIC_SDA_Mode(GPIO_MODE_INPUT); SCL(L); delay_us(1); SCL(H); delay_us(1); if(HAL_GPIO_ReadPin(I2C_SDA_GPIO_Port,I2C_SDA_Pin)) { IIC_Stop(); } else { printf("IIC_Dev Addr:0x%X\n",addr); SCL(L); } } for(uint8_t i=0;i<128;i++){ IIC_Start(); IIC_Send_Data(i<<1); IIC_Wait_Ack(i);//printf iic dev addr delay_us(20); IIC_Stop(); delay_ms(20); }
3、实验结果
IIC总线挂载有温度传感器、EEPROM各一个,iic地址分别为0x40,0x50
逻辑分析仪波形