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

逻辑分析仪波形
