STMCU小助手
发布时间:2022-12-5 22:00
|
前言% }4 e6 N9 W/ ^2 Z 本应用笔记说明了 STM32 微控制器自举程序中使用的 I2C 协议。它详细说明了每个支持的指令。 若需器件自举程序 I2C 硬件资源和要求的更多信息,请参考应用笔记 AN2606 “STM32 微控制器系统存储器自举模式 ”。: D) [4 D5 F, b- u
1 I2C 自举程序代码序列. Q- ?2 [: ~! {. q
2 自举程序指令集 从 V1.1 协议版本开始支持 "No Stretch" 指令,当自举程序完成操作之前主机必须长时间等待时,它可以支持更好的进行指令管理。 只要可能,强烈建议使用 "No Stretch" 指令而不使用相应的普通指令。 支持的指令列于表 2 中。
; D7 c# b8 @4 G- a0 c 1. 若收到了拒绝指令,或指令执行期间发生了错误,则自举程序会发送 NACK 字节,然后返回到检查指令状态。 2. 读保护 - 当 RDP (读保护)选项激活时,仅能使用此有限子集的指令。所有其它指令都会被 NACK,对器件没有作用。取消 RDP 之后,其它指令变为激活。 3. 若需了解哪些存储器空间可执行这些指令,请参考 STM32 产品数据手册和 AN2606:STM32 微控制器系统存储器自举模式。( {7 y D6 ?1 v) f 4. 仅 V1.1 的 I2C 协议才支持 No-Stretch 指令。6 @. V/ E+ D8 ? No-Stretch 指令( C. K) u( f9 A9 `$ e2 J 当自举程序执行操作时, No-Stretch 指令可执行 Write、 Erase、 Write Protect、 Write Unprotect、 Read Protect、 Read Unprotect 操作而不延长 I2C 线。当自举程序执行的操作需要等待时间时,这些指令允许与总线上的其它器件通信。' O" ?; ^$ A4 b ^0 \ 这些指令与标准指令的不同之处在于指令结束:当主机在指令结束要求 ACK/NACK 时,自举程序不会延长 I2C 线,而是使用第三种状态 ——Busy (0x76)来响应。当主机收到Busy 状态时,它会再对状态轮询,读取一个字节,直到收到 ACK 或 NACK 响应。; G0 c. U# }5 o5 v5 ^. a# H/ r1 j7 ? 通信安全 从编程主机到器件的所有通信都经过校验和验证。接收的数据字节块都经过异或计算。所有字节异或计算后算出一个字节,加到每次通信的末尾 (校验和字节)。对所有收到的字节 —— 数据 + 校验和 —— 做异或计算,最后结果必须为 0x00。/ G; B* t* |9 U5 f+ c/ k' Q* z 对每个指令,主机会发送一个字节及其补码 (异或 = 0x00)。* {0 a4 C: z {, `! p! x 每个包或接受 (ACK 应答)或丢弃 (NACK 应答):( D, p7 q3 u) D' @4 Y' l6 U5 u • ACK = 0x79 • NACK = 0x1F( H! S! u* Z1 Y 对于 No-Stretch 指令,当操作正在进行时,会发送 Busy 状态而不是 ACK 或 NACK: • BUSY= 0x76 p) G, C" O" ]+ y* L* T 注: 主机的帧可为下列之一:. [6 K& b0 v/ M8 O1 T • 发送指令帧:主机作为主发送端发起通信,向器件发送两字节:命令代码 + XOR。9 ]5 M0 @# z/ U+ x2 N$ u" K • 等待 ACK/NACK 帧:主机作为主接收端发起 I2C 通信,从器件接收一个字节:ACK 或NACK 或 BUSY。, j5 a# ?& y# Z4 `/ b • 接收数据帧:主机作为主接收端发起 I2C 通信,从器件收到响应。收到的字节数取决于指令。) q) t7 ~; o9 V& D5 ~4 Q/ I • 发送数据帧:主机作为主发送端发起 I2C 通信,向器件发送需要的字节。发送的字节数取决于指令。 小心: I2C 通信实现了超时机制,这是自举程序指令正确执行所必需要考虑的。此超时在同一指令的两个 I2C 帧间实现。例如,对于 Write memory 指令,在指令发送帧和地址存储器发送帧之间有超时机制。 此外也将在同一 I2C 帧中的两个连续数据接收或发送实例之间插入同一超时周期。如果超时周期已过,则生成系统复位以避免自举程序崩溃。有关每种 STM32 产品的 I2C超时值,请参考 AN2606, “I2C 自举程序时序特性 ” 一节。 " E+ J8 @6 l! b$ ?6 p% e 2.1 Get 指令( b! y" _ I. \& r/ m) G$ B Get 指令可帮您得到自举程序版本及所支持的指令。当自举程序收到 Get 指令时,它将自举程序版本和所支持的指令代码发送给主机,如图 2 中所示。0 z" o! |. ~: b0 p9 l l* L, H ?8 `8 x 6 a9 J6 _ I3 v
STM32 发送的字节如下:- ~1 |" z3 j* t • 对于 I2C 协议 V1.0:( \+ A6 Z' W# g7 i – 字节 1:ACK – 字节 2:N = 11 = 后续字节数 - 1,不包括当前字节和 ACK。 – 字节 3:自举程序版本 0x10 = 1.0 版本 – 字节 4:0x00 - Get 指令* c) Y, ~4 |9 c7 N, i' J – 字节 5:0x01 - Get Version – 字节 6:0x02 - Get ID8 P- z/ A5 a' f/ e7 Y – 字节 7:0x11 - Read Memory 指令 – 字节 8:0x21 - Go 指令 – 字节 9:0x31 - Write Memory 指令 – 字节 10:0x44 - Erase 指令, e7 W) ]) ]) k' k | – 字节 11:0x63 - Write Protect 指令8 `# R& O( G% ]# |) b – 字节 12:0x73 - Write Unprotect 指令 – 字节 13:0x82 - Readout Protect 指令 – 字节 14:0x92 - Readout Unprotect 指令2 V) E5 h, h5 w- G2 E – 字节 15:ACK • For I2C protocol V1.1: – 字节 1:ACK – 字节 2:N = 17 = 后续字节数 - 1,不包括当前字节和 ACK。 – 字节 3:自举程序版本 0x11 = 1.1 版本 – 字节 4:0x00 - Get 指令! y D! t c3 a: n9 \, g1 X$ e – 字节 5:0x01 - Get Version – 字节 6:0x02 - Get ID; B5 z- x' y# {- J – 字节 7:0x11 - Read Memory 指令3 E) c. H2 I b – 字节 8:0x21 - Go 指令2 l) z/ P- A1 r% k0 ]: m) Z' Q – 字节 9:0x31 - Write Memory 指令 – 字节 10:0x44 - Erase 指令 – 字节 11:0x63 - Write Protect 指令 – 字节 12:0x73 - Write Unprotect 指令& m$ X* U4 Q4 }9 ^ – 字节 13:0x82 - Readout Protect 指令) q/ y6 a. p$ C/ J – 字节 14:0x92 - Readout Unprotect 指令1 X5 O! F, @! f Y& M – 字节 15:0x32 - No-Stretch Write Memory 指令 – 字节 16:0x45 - No-Stretch Erase 指令: s& A: H8 Q- h5 k – 字节 17:0x64 - No-Stretch Write Protect 指令. p0 E3 n0 z9 ?* q, w8 e1 T – 字节 18:0x74 - No-Stretch Write Unprotect 指令 – 字节 19:0x83 - No-Stretch Readout Protect 指令 – 字节 20:0x93 - No-Stretch Readout Unprotect 指令 – 字节 21:ACK ) ]4 u3 _; }5 Z* S7 D2 a 完整版请查看:附件 |
STM32 自举程序中使用的 I2C 协议.pdf
下载727.07 KB, 下载次数: 0
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
Keil-MDK 在线调试设置断点的高级用法
请教下STM32N6570 怎么把分辨率改成320x240并可以全屏显示
【福利三:逢7发帖赢大礼】想要充分利用STM32H743VI片内的RAM空间(但并不顺利)
基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理
使用STM32 MCU和MPU连接PDM数字麦克风
分享STM32资料-采用 STM32U031R8 MCU 的 STM32 Nucleo-64 开发板,官方资料,数据手册等资料
HRTIM 指南
使用 STM32 的 DWT 单元监控内存
DAC,COMP,HRTIM Fault 功能的使用
微信公众号
手机版