系列文章: 《I2C总线(1)–数据传输格式与7位地址读写》; 《I2C总线(3)–时钟同步和仲裁》; 《I2C总线(4)–高速模式》; 《I2C总线(5)–线与和上拉电阻》; 《I2C总线(6)–START BYTE》
10 bit地址
I2C总线中使用10位地址扩展了7位地址位数,但是10位地址和7位地址的设备可以连接到相同的I2C总线中,并且7位和10位地址均可以在所有总线速度模式中使用。
- 在产生开始条件或重复开始后,紧跟其后产生10位地址。
- 10位地址要占据两个字节。
- 第一个字节中,前7位是组合1111 0XX,其中后两位XX是10位地址的两个最高有效位(MSB)。
- 第一个字节中,第8位是R/W位,决定传输方向。
- 第二个字节(XXXX XXXX)用于多个从设备应答的情况,可进一步比较地址。
写操作
采用10bit地址读写和7bit地址读写是相同的,下面重点是阐述出不同之处。
- 在启动条件满足后,会发送从地址的第一个字节(之前说过,10bit地址要发送两个字节)。
- 每个从设备将从地址第一个字节的前七位(1111 0XX)与自己的地址进行比较,并检测第8位是否为0。
- 与从地址第一个字节相匹配的从设备会返回一个ACK(记为A1),
- 但是,有个能会有多个从设备匹配并生成应答信号(A1)。
- 紧接发送10bit从地址的第二个字节,所有应答A1的从设备的地址与第二个字节(XXXX XXXX)进行比较,最终只有一个从设备地址匹配,并生成应答信号ACK(记为A2)。
- 主设备生成停止条件,或者生成重复开始条件。
组合操作
单纯的读操作与7bit无太大差异,这里不再赘述。下面介绍先写后读的操作,有些地方需要注意。
- 下图传输方向在第2个RW位改变,所以在应答信号A2之前为读操作。
- 重复开始信号启动后,匹配的从设备会记住它之前被寻址过。
- 然后这个从设备会检查Sr条件后的前7位,是否与之前读操作时从地址第一个字节相同,并检测第8位是否为1。
- 如果匹配,则从设备认为它已经作为一个发送器被寻址,并生成确认信号ACK(A3),不会再比较10位从地址的第二个字节
10位地址中的保留地址
有两组地址(0000 XXX 和 1111 XXX)是保留的,用以实现其他的功能。如下:
下面分别介绍几个特殊功能。
1.广播寻址
广播寻址(0000 0000)用于同时寻址连接到I2C总线的每个设备。
- 如果设备不需要广播提供的任何数据,它可以回复NACK来忽略广播地址;
- 如果设备需要来自广播的数据,会对广播地址进行ACK,并作为一个从接收设备;
- 如果多个设备响应广播地址ACK,主设备并不知道有多少个设备回应。每个能够处理此数据的从接收设备第二个和后面的字节ACK。
一般广播地址的含义总是在地址的第二个字节中指定,如下图:
对于LSB(最低有效位)要分为两种情况考虑:
- LSB为 0 时;
广播地址(第二字节) | 描述 |
---|---|
0000 0110 (10‘h06) | 1.从设备回应广播地址复位,并接受地址可编程部分;2.必须采取防御措施 ,以确保设备在施加电压后不会拉低SDA或SCL,因为这些低电平会阻塞总线 |
0000 0100 (10‘h04) | 1.设备不复位;2.通过硬件编写从地址的可编程部分;3.也有要防御措施 |
0000 0000 (10‘h00) | 这个代码不允许出现在第二个字节 |
- LSB为 1 时。
当LSB=1时,2个字节的地址序列是一个硬件通用调用。这意味着地址序列是由硬件主设备传输的,例如键盘扫描器。第二个字节剩下的7位包含硬件主设备地址,这个地址会被一个连接到总线的智能设备(例如微控制器)识别,然后总线接受来自硬件设备的信息。
由于硬件主设备实现不知道消息必须要传输到 哪个设备,因此它只能生成这个硬件通用调用和他自己的地址,然后标识给系统。
2.Start Byte
微控制器连接I2C总线上,如果微控制器上有片上硬件I2C接口,那么这个控制器可以被编程为“只能被总线的请求中断”。而当微控制器没有这样的接口时,它必须不断地通过软件监控总线。显然,微控制器监控或轮询总线的次数越多,它执行预期功能所需要的时间越短。然后,这种情况下,由于微控制器对总线的监控和轮询,数据传输之前就要使用一个比正常情况要长得多start启动。
启动过程:启动条件(S)+ 启动字节(0000 0001,Start Byte的地址)+ 确认时钟脉冲(ACK)+ 重复开始条件(Sr)
3.Bus clear
在概率极低地情况中,时钟SCL会一直卡在低电平,那么就要对总线进行复位。
- 如果I2C设备有硬件复位输入,优先考虑使用这个;
- 如果没有,则激活强制的内部通电复位(POR)电路;此时主设备应该发送9个时钟脉冲,控制总线拉低的设备要在这个9个时钟内释放总线。