IIC通信主机通常配置为开漏输出(),与USART不同,高位先发,因为通信设备通带自带一个弱上拉电阻,主机电平置高代表浮空状态,上拉电阻会置高电平,
SCL时钟线:完全由主机控制,从机不能进行操控
SDA数据线:主机拉高就能进入浮空状态,释放SDA交出SDA控制权
起始条件:SCL时钟线高电平期间,SDA数据线由高电平变低电平
终止条件:SCL时钟线高电平期间,SDA数据线由低电平变高电平
接收应答:主机发送完一个字节的数据,从机获得SDA控制权, 代表应答,SDA置1代表非应答(没应答的话可以直接产生终止条件,printf打印一些信息)
发送应答:主机在接收完一个字节的之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
第一次发送,数据帧位8位,7位从机地址数据,1位读写操作数据,主机发送7位数据进行寻址(少许为10位,不常用),剩下一位0代表发送数据(此时SDA控制权还在主机上,主机继续SDA操作,继续发送数据,从机读取),1代表读取数据(此时SDA控制权要交给从机,由从机控制SDA发送数据主机进行读取)
指定地址写:主机发送一个7+1位地址寻址,主机在发送8位地址找到写那块地址,后面就是发送写指令,往找到的地址写入指令,需要两个8位数据准备,第一个8位是寻设备地址,第二个8为是寻该设备地址的那块地址进行写入
当前地址读:主机发送7+1位找到设备,可以直接读取上一次写操作留下的地址,如果没有上次的写指令则从0x00开始读取,每调用一次读操作地址位都+1(少用,因为不能指定读取哪一块的数据)
指定地址读:跟指定地址前16位一样,目的为了找到设备以及地址,后面把SDA线控制权交给从机,从机发送数据给主机进行读取。时序是,起始条件、先发7+1位设备寻址,再发8位找到该设备的哪块地址进行读最后一位是0(因为是写),此时重新发一个起始条件,再发一次7+1位读指令,最后一位是1(因为是读),后面就可以指定地址进行读。前十六位发送完写操作在读操作进行起始条件之前可以发送终止条件——一个完整的时序(终止条件不会改变地址的指向),也可以不发终止条件。官网是一整个数据帧,就是中间没有终止,起始,起始,在终止。如果只想读取一次,从机一定要给非应答,在终止条件,从机就会把SDA控制器交给主机,如果给应答后在发终止条件,主机会认为从机还想发送数据,从机仍会拉低SDA,主机就不能进行操作SDA数据线,0是应答,1非应答
除了终止条件SCL以高电平结束,其他的时序SCL都已低电平结束,方便时序的拼接