ZHCSU48 December 2023 BQ76972
PRODUCTION DATA
SPI 事务的第一个字节包含一个 R/W 位(R = 0,W = 1),后跟一个 7 位地址,MSB 在前。如果控制器(主机)正在写入,则第二个字节是写入的数据。如果控制器正在读取,将忽略 SPI_MOSI 上发送的第二个字节(CRC 计算除外)。
如果启用了 CRC,控制器必须将 8 位 CRC 代码作为第三个字节发送,该代码是通过前两个字节计算得出的。如果 CRC 正确,会将在时钟沿输入的值放入接收缓冲区。如果 CRC 不正确,会将发送缓冲区设置为 0xFFFF,并将发送的 CRC 设置为 0xAA(在下一个事务的时钟沿输出)。
在此事务期间,逻辑在时钟沿输出发送缓冲区的内容。如果自上次事务以来未更新发送缓冲区,逻辑将在时钟沿输出 0xFFFF;如果在时钟沿进行 CRC,CRC 将在时钟沿输出 0x00(如启用)。因此,0xFFFF00 命令向控制器指示出站缓冲区在事务发生之前未被内部逻辑更新。当器件没有足够的时间更新连续事务之间的缓冲区时,就会发生这种情况。
当内部逻辑从接口逻辑中获取写入数据并对其进行处理时,该内部逻辑还会将 R/W 位、地址和数据复制到发送缓冲区中。在下一个事务中,此数据将在时钟沿被发送回控制器。
当控制器开始读取时,内部逻辑将 R/W 位和地址连同请求的数据一起放入输出缓冲区中。如果启用了 CRC,接口会对发送缓冲区中的两个字节计算 CRC,并在时钟沿将结果返回至控制器(与 0xFFFF 相关的异常如上所述)。下面是假设 CPOL = 0 时使用 CRC 和不使用 CRC 的事务序列图。
器件处理命令和子命令所需的时间将根据每个命令的具体情况而有所不同。直接命令通常会在 50μs 内完成,而子命令可能需要更长的时间,完成不同的子命令需要的持续时间不同。例如,当发送特定的子命令时,器件需要大约 200μs 才能将 32 字节的数据加载到内部子命令缓冲区。如果主机在开始读取缓冲区(从地址 0x40 读回地址 0x5F)之前提供足够的时间完成此加载,器件将使用有效数据而不是 0xFFFF00 进行响应。当数据已经加载到子命令缓冲区时,可以在 SPI 事务之间以大约 50μs 的间隔读回该数据。有关特定命令和子命令所需近似持续时间的更多详细信息,请参阅 BQ76972 技术参考手册。
主机软件应包含重试可能不成功的事务的方案。例如,如果器件在 SPI_MISO 上返回 0xFFFFFF,说明内部时钟未通电,需要重试事务。类似地,如果器件在一个事务上返回 0xFFFFAA,这表明以前的事务遇到 CRC 错误,因此必须重试前一个事务。如上所述,如果器件返回 0xFFFF00,说明当前事务发送时之前的事务尚未完成,这可能意味着应该重试之前的事务,或者至少需要更多的时间才能完成。