I2C(Inter IC BUS)
一主多从:全程只有一个主机,多个从机,从机不可以主动申请控制I2C总线,必须主机来发送控制权。
多主多从:本质上也是一主多从,当从机想要申请控制权和现有主机产生冲突时,由通信协议仲裁,胜利的一方获得主机权,失败的一方则成为从机。但是也要注意时钟线的同步。
SCL时钟线:主机有绝对控制权,任何时刻从机只有被动读取,不允许控制SCL
SDA数据线:从机不允许主动申请控制,只有主机发送读取从机的命令后或者从机应答时才能短暂获得控制权。
禁止所有设备输出强上拉的高电平,采用外置弱上拉电阻加开漏输出结构。
有线与的特征:被一个或多个设备拉低总线电平后,总线保持低电平。
空闲状态:SCL和SDA都处于高电平状态。
起始条件触发后,从机都会处于复位状态,等待主机的召唤。
起始和终止条件都是主机产生的,从机不允许产生。
发送数据时:USART串口是低位现行 I2C是高位先行。
主机接收字节之后,如果不发送应答,从机会释放SDA线。
主机发送字节之后,会释放SDA给从机控制,并在下一个SCL高电平期间检测是否有应答。
每个I2C设备出厂时,厂商都会为其分配一个七位地址(主要前4位是固定的,后面几位根据芯片女型号是可变的)。一般不同芯片型号,地址不一样,但是如果再一条总线用到相同的设备,可以改变七位当中的后几位用来区分(具体由对应芯片手册里面可以找到)。
当前地址指针:从机中,所有寄存器被分配到了一个先行区域中,有一个单独的指针变量,默认上电时指向0地址,每写入一个字节或读出一个字节后,这个指针会自增一次移动到下一个位置。
指定地址读是复合格式,前面两个字节是指定地址写,然后立即发送当前地址读字节,就成为指定地址读的时序了。
在读字节当中,如果主机想要停止接收,在接收最后一个字节后选择非应答,从机会释放总线,SDA控制权交回主机。简单来说就是主机给应答,从机会继续发,主机非应答,从机就不再发了。
从机对SDA的控制权,开始于从机地址最后一位给1在,终止与主机给非应答位1。