
STM32 自举程序中使用的 I2C 协议 前言 本应用笔记说明了 STM32 微控制器自举程序中使用的 I2C 协议。它详细说明了每个支持的指令。 若需器件自举程序 I2C 硬件资源和要求的更多信息,请参考应用笔记 AN2606 “STM32 微控制器系统存储器自举模式 ”。 ![]() 1 I2C 自举程序代码序列 ![]() 注: 在 AN2606 中规定了每个产品自举程序的 I2C 从地址。进入系统存储器自举模式后,并且此时 STM32 微控制器已配置好 (若需更详细信息,请参考您的 STM32 系统存储器自举模式应用笔记),自举程序代码开始扫描 I2C_SDA 线引脚,等待检测它自身在总线上的地址。检测到之后, I2C 自举程序固件开始接收主机指令。 2 自举程序指令集 从 V1.1 协议版本开始支持 "No Stretch" 指令,当自举程序完成操作之前主机必须长时间等待时,它可以支持更好的进行指令管理。 只要可能,强烈建议使用 "No Stretch" 指令而不使用相应的普通指令。 支持的指令列于表 2 中。 ![]() No-Stretch 指令 当自举程序执行操作时, No-Stretch 指令可执行 Write、 Erase、 Write Protect、 WriteUnprotect、 Read Protect、 Read Unprotect 操作而不延长 I2C 线。当自举程序执行的操作需要等待时间时,这些指令允许与总线上的其它器件通信。 这些指令与标准指令的不同之处在于指令结束:当主机在指令结束要求 ACK/NACK 时,自举程序不会延长 I2C 线,而是使用第三种状态 ——Busy (0x76)来响应。当主机收到Busy 状态时,它会再对状态轮询,读取一个字节,直到收到 ACK 或 NACK 响应。 通信安全 从编程主机到器件的所有通信都经过校验和验证。接收的数据字节块都经过异或计算。所有字节异或计算后算出一个字节,加到每次通信的末尾 (校验和字节)。对所有收到的字节 —— 数据 + 校验和 —— 做异或计算,最后结果必须为 0x00。 对每个指令,主机会发送一个字节及其补码 (异或 = 0x00)。 每个包或接受 (ACK 应答)或丢弃 (NACK 应答): • ACK = 0x79 • NACK = 0x1F 对于 No-Stretch 指令,当操作正在进行时,会发送 Busy 状态而不是 ACK 或 NACK: • BUSY= 0x76 注: 主机的帧可为下列之一: • 发送指令帧:主机作为主发送端发起通信,向器件发送两字节:命令代码 + XOR。 • 等待 ACK/NACK 帧:主机作为主接收端发起 I2C 通信,从器件接收一个字节:ACK 或NACK 或 BUSY。 • 接收数据帧:主机作为主接收端发起 I2C 通信,从器件收到响应。收到的字节数取决于指令。 • 发送数据帧:主机作为主发送端发起 I2C 通信,向器件发送需要的字节。发送的字节数取决于指令。 小心: I2C 通信实现了超时机制,这是自举程序指令正确执行所必需要考虑的。此超时在同一指令的两个 I2C 帧间实现。例如,对于 Write memory 指令,在指令发送帧和地址存储器发送帧之间有超时机制。 此外也将在同一 I2C 帧中的两个连续数据接收或发送实例之间插入同一超时周期。如果超时周期已过,则生成系统复位以避免自举程序崩溃。有关每种 STM32 产品的 I2C超时值,请参考 AN2606, “I2C 自举程序时序特性 ” 一节。 ........... 想了解更多,请下载原文阅读 |
谢谢图图的分享 |
感谢分享~~~ |
收藏 |