接口/总线/驱动
I2C总线是由荷兰皇家飞利浦Philips公司(现恩智浦NXP半导体)开发的一种简单的双向两线制总线协议标准。
1953年,荷兰皇家飞利浦公司半导体事业部成立;
2006年,该业务部门从飞利浦拆分成立NXP Semiconductors-恩智浦半导体。NXP这个名字来自 “新的体验”Next Experience;
2010年,恩智浦在美国纳斯达克上市;
2015年,恩智浦收购了由摩托罗拉创立的飞思卡尔半导体,成为全球前十大非存储类半导体公司,及全球最大的汽车半导体供应商(Strategy Analytics);
2019年,恩智浦以17.6亿美金收购Marvell公司的WiFi和蓝牙连接业务资产;
回到主题,详解I2C接口协议:
START and STOP
START and STOP conditions由主机产生,具体参加下图:
START:SCL为高期间,SDA由高->低; STOP :SCL为高期间,SDA由低->高;
Data validity
SCL为高期间,SDA必须保持稳定;SDA仅在SCL为低期间发生变化;
Byte传输、ACK应答
信号传输以Byte为单位,每个字节后都由1bit的应答信号。
MSB先发,LSB最后(I2C/SPI都是MSB先发,而UART是LSB先发)。
当Slave正处理其内部中断而无法接收I2C Master数据时,Slave可拉低SCL以使得Master进入等待状态。
写操作时,应答信号由从机产生; 读操作时,应答信号由主机产生; 有时候,读写并不能收到应答信号:有以下五种情况
I2C总线上没有主机所指定地址的从机设备;
从机正执行一些real-time function,还没准备好与主机通讯;
主机发送的一些控制命令,从机不支持;
从机缓存满,不能再接收新的数据;
主机接收从机数据时,主机产生非应答信号,通知从机数据传输结束,不要再发数据了;
Slave Address、R/W bit
Start信号之后,Master发送7bit的Slave地址,紧接着是1bit的读写控制信号,“0”写,“1”读。也有10bit Slave地址的Device,下文讲解。
通常以主机发送Stop信号结束传输,若Master想继续传输,可以不用产生Stop,直接再次产生Start信号然后发送另一个Slave Device地址并进行通信。
I2C写时序
向指定寄存器地址写入指定数据操作时序:
I2C读时序
从指定寄存器地址读取数据操作时序:注意,读数据时有两次起始信号。
10bit Slave Address
上文描述的Slave Address都是7bit的,为什么要用10bit地址,当然是为了拓展支持可能的设备数,目前10bit地址设备尚未广泛使用。
那Slave Address是10bit的话又如何通信?
如下图,将10bit地址分拆成2bit、8bit进行两次传输即可。注意11110xx是Reserve address,后面2bit的xx是10bit地址的最高2bit。
10位地址写时序:
10位地址读时序:
I2C保留字节
I2C Start起始位之后的第一个字节,除了厂商指定的设备地址外,还有一些保留字节,主要有两组0000 xxx和1111 xxx:上述的10位地址模式,就是使用到了最后一种保留字节。
审核编辑:黄飞
全部0条评论
快来发表一下你的评论吧 !