或者,如果主器件无法支持 SMBus 块写入块读取过程调用,则可以通过两个事务(一个块写入,后跟一个块读取)来对其进行仿真。这只应在单主器件系统中完成,因为在双主器件系统中可能会发生冲突,从而破坏数据和事务。以下是这些事务的事件序列:
- 主器件发出一个启动条件以启动该事务。
- 主器件发送 7 位从器件地址,后跟写入位(低电平)。
- 从器件将 ACK 置为有效。
- 主器件发送块读取命令代码 (F1h),从器件将 ACK 置为有效。
- 主器件为该事务发送字节计数 (2h),从器件将 ACK 置为有效。
- 主器件发送起始寄存器地址,从器件将 ACK 置为有效。
- 主器件发送块读取过程调用的字节计数 (1-20h),从器件将 ACK 置为有效。
- 主器件发送一个停止条件以结束该事务。
- 主器件发送一个启动条件以启动该事务。
- 主器件发送 7 位从器件地址,后跟写入位(低电平),从器件将 ACK 置为有效。
- 主器件发送块读取命令代码 (F1h),从器件将 ACK 置为有效。
- 主器件发送一个重复的启动条件。
- 主器件发送 7 位从器件地址,后跟读取位(高电平),从器件将 ACK 置为有效。
- 主器件接收字节计数(这与在步骤 7 中主器件发送的大小相匹配)并将 ACK 置为有效。
- 主器件接收数据字节 1 并将 ACK 置为有效。
- 主器件接收数据字节 2 并将 ACK 置为有效。
- 主器件接收 N-3 个数据字节,并针对每个字节将 ACK 置为有效。
- 主器件接收最后一个数据字节并将 NACK 置为有效。
- 主器件发出一个停止条件以结束该事务。
| 1 | 2 | | 3 | 4 | | 5 | | 6 | | 7 | | 8 | 9 | 10 | | | ∼ |
| S | 从器件 地址 | W | A | 块 读取 命令 代码 (F1h) | A | 字节 计数 (2h) | A | 起始 寄存器 地址 | A | 字节 计数 (1-20h) (N) | A | P | S | 从器件 地址 | W | A |
| ∼ | 11 | | 12 | 13 | | | | 14 | | 15 | | 16 | | | 17 | | 16 |
块 读取 命令 代码 (F1h) | A | S | 从器件 地址 | R | A | | 字节 计数 (1-20h) (N) | A | 数据 字节 1 | A | 数据 字节 2 | A | ∼ | 数据 字节 N | /A | P |
特别说明:
- 可以重复步骤 9 至 19 以读取另一个数据块。地址会自动递增,以便下一个块从最后一个块停止的位置开始。LM94 每次返回的大小都是相同的。
- 当读取正常地址空间之外的地址位置时,LM94 返回 00h。
- 块读取不会从地址 FFh 绕回到 00h
- 如果主器件确认的字节数超过其请求的字节数,则 LM94 将继续提供数据,直到主器件不再确认字节。
- 如果主器件没有确认字节以提前中止块读取,则 LM94 脱离总线以允许主器件发出停止信号。
- 块读取完成后,LM94 的基地址会更新为指向刚刚超出读取的最后一个字节的字节。