请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 自举程序中使用的 I2C 协议

[复制链接]
STMCU小助手 发布时间:2022-12-5 22:00
前言
# X1 C0 p: I* G, |本应用笔记说明了 STM32 微控制器自举程序中使用的 I2C 协议。它详细说明了每个支持的指令。
0 c! u- Q" G3 V. p; c若需器件自举程序 I2C 硬件资源和要求的更多信息,请参考应用笔记 AN2606 “STM32 微控制器系统存储器自举模式 ”。
, V1 k! \1 E) J4 M" S; G

+ l& V( q! G* P8 p. ^ }WI}[H~1PJMGS7SO4(KZM.png
" r$ f. c. [! r9 ]' p
9 B" a8 Y0 N) N8 ~1 I2C 自举程序代码序列

( V1 K; [6 G  E) `: @  ^5 Y3 p" t" M
B)ZG{T]`SZ%GH$@(SD_AO96.png - R& K0 ~/ \% k+ ?. i% F

( l: W; N! M. u# M7 l2 自举程序指令集. n* @2 g! O$ q* h. D$ }$ P* ~
从 V1.1 协议版本开始支持 "No Stretch" 指令,当自举程序完成操作之前主机必须长时间等待时,它可以支持更好的进行指令管理。
' x( `3 X0 e; y3 K, B" y5 E" _  s只要可能,强烈建议使用 "No Stretch" 指令而不使用相应的普通指令。
) v0 X5 M1 A! Q* V# d1 j支持的指令列于表 2 中。
5 [" u2 e# t, \) c' r* v0 b, V% Z, l2 v' ?! K+ g2 d% T  O' ]

( N2 d7 l. R: i" u" T# J %`(B(N63YL{SE`077J[2(37.png
* r" K9 y- N) H, \5 ?! X5 E) ~+ \0 w$ Q) J( `4 J
1. 若收到了拒绝指令,或指令执行期间发生了错误,则自举程序会发送 NACK 字节,然后返回到检查指令状态。) N0 [2 I9 n+ ~1 y) [6 Y/ J: |
2. 读保护 - 当 RDP (读保护)选项激活时,仅能使用此有限子集的指令。所有其它指令都会被 NACK,对器件没有作用。取消 RDP 之后,其它指令变为激活。
9 ~2 M) a+ B2 w. B6 Q& V/ w3. 若需了解哪些存储器空间可执行这些指令,请参考 STM32 产品数据手册和 AN2606:STM32 微控制器系统存储器自举模式。
  e% _1 d# T1 f4 d" p: p) M4. 仅 V1.1 的 I2C 协议才支持 No-Stretch 指令。
  S* c+ F9 s7 C, R8 r: ~7 Y$ z  {# t' I* [. Q
No-Stretch 指令

) ~1 N. Z9 d( ~* p& S/ c& u2 g8 O当自举程序执行操作时, No-Stretch 指令可执行 Write、 Erase、 Write Protect、 Write Unprotect、 Read Protect、 Read Unprotect 操作而不延长 I2C 线。当自举程序执行的操作需要等待时间时,这些指令允许与总线上的其它器件通信。. Y2 B# |/ E( Z! f& R& m3 e* b
这些指令与标准指令的不同之处在于指令结束:当主机在指令结束要求 ACK/NACK 时,自举程序不会延长 I2C 线,而是使用第三种状态 ——Busy (0x76)来响应。当主机收到Busy 状态时,它会再对状态轮询,读取一个字节,直到收到 ACK 或 NACK 响应。7 {" W6 }$ S" k/ C
& v1 C& x% @* e' y$ ], }  C
通信安全6 E0 H7 `# w6 U0 g9 Y. O' X
从编程主机到器件的所有通信都经过校验和验证。接收的数据字节块都经过异或计算。所有字节异或计算后算出一个字节,加到每次通信的末尾 (校验和字节)。对所有收到的字节 —— 数据 + 校验和 —— 做异或计算,最后结果必须为 0x00。# f& I2 z# E+ N' c7 j9 }$ e% z
对每个指令,主机会发送一个字节及其补码 (异或 = 0x00)。7 `' d$ z: N2 _/ o
每个包或接受 (ACK 应答)或丢弃 (NACK 应答):( k+ R3 x5 Z) V- h; d* t
• ACK = 0x79
  d: m4 k' X7 ^& |• NACK = 0x1F
$ K: b; U2 }% W4 _对于 No-Stretch 指令,当操作正在进行时,会发送 Busy 状态而不是 ACK 或 NACK:
' W* L% i/ e" ~6 I! z% @5 X+ \• BUSY= 0x76
. I3 l% c$ X" Z: n注: 主机的帧可为下列之一:% r3 Z" a% C$ x
• 发送指令帧:主机作为主发送端发起通信,向器件发送两字节:命令代码 + XOR。
! n& V5 t' O0 J0 b" N/ ^• 等待 ACK/NACK 帧:主机作为主接收端发起 I2C 通信,从器件接收一个字节:ACK 或NACK 或 BUSY。
- b1 F4 ]9 o- A3 e5 X/ h3 u• 接收数据帧:主机作为主接收端发起 I2C 通信,从器件收到响应。收到的字节数取决于指令。0 ~+ L2 r* J! w; H9 ]; ]4 x, K
• 发送数据帧:主机作为主发送端发起 I2C 通信,向器件发送需要的字节。发送的字节数取决于指令。4 @/ u3 s6 d6 f
小心: I2C 通信实现了超时机制,这是自举程序指令正确执行所必需要考虑的。此超时在同一指令的两个 I2C 帧间实现。例如,对于 Write memory 指令,在指令发送帧和地址存储器发送帧之间有超时机制。 此外也将在同一 I2C 帧中的两个连续数据接收或发送实例之间插入同一超时周期。如果超时周期已过,则生成系统复位以避免自举程序崩溃。有关每种 STM32 产品的 I2C超时值,请参考 AN2606, “I2C 自举程序时序特性 ” 一节。% V" o- q* `1 I, v
0 V& J) z% Z6 @* S7 W' C
2.1 Get 指令9 d; ^8 `4 Q8 I  N7 k; }% c
Get 指令可帮您得到自举程序版本及所支持的指令。当自举程序收到 Get 指令时,它将自举程序版本和所支持的指令代码发送给主机,如图 2 中所示。) o8 `. X8 {1 X9 D7 M' r1 t/ _" ?
0 P; e; d. V3 B
8 q5 y+ Z2 U4 E$ _# ]  ~* S
F(I)3@}BX]UJ5K$$_0U@IO8.png
8 {$ i. G* D3 b. s- t5 z2 `  W' \0 `4 }3 b
STM32 发送的字节如下:
% ~# c+ m! n6 Q- f/ `+ c$ n1 [• 对于 I2C 协议 V1.0:
3 m( J, w) i- R6 N/ Q– 字节 1:ACK/ v7 {3 V" a1 }; t' S8 G
– 字节 2:N = 11 = 后续字节数 - 1,不包括当前字节和 ACK。
7 ^2 n5 c1 T% E– 字节 3:自举程序版本 0x10 = 1.0 版本
3 t# N5 a* z2 q, n7 K– 字节 4:0x00 - Get 指令
9 \# H4 u2 W1 Z& e– 字节 5:0x01 - Get Version
0 ~% `8 k- i( h1 g2 J, r3 A– 字节 6:0x02 - Get ID: Z) j# O- f  A0 K3 j2 H
– 字节 7:0x11 - Read Memory 指令1 ?& I7 h4 h! G! o( m8 [) r
– 字节 8:0x21 - Go 指令
) L" w. A) v  l  M& S/ w5 q– 字节 9:0x31 - Write Memory 指令; O" ?4 K5 ]  h' z. q: U+ F
– 字节 10:0x44 - Erase 指令
  \9 f( I3 A7 T2 S% d1 a– 字节 11:0x63 - Write Protect 指令: {4 \" ~/ `' a; P
– 字节 12:0x73 - Write Unprotect 指令+ S6 Q- o. u9 l4 ]% P% g) n% V& N4 n
– 字节 13:0x82 - Readout Protect 指令
  {8 v0 q9 m% o2 r, x, W% e3 o* d. u– 字节 14:0x92 - Readout Unprotect 指令
/ U! J% k/ p' W& P2 `# n1 S: N6 Y– 字节 15:ACK4 V* r+ C1 |! N" J( L6 E1 {
• For I2C protocol V1.1:% c( `1 U: r- L! @; w- e0 v
– 字节 1:ACK
" M- e& u, p, W– 字节 2:N = 17 = 后续字节数 - 1,不包括当前字节和 ACK。
9 S4 D; O; @* i9 K% t. N8 k– 字节 3:自举程序版本 0x11 = 1.1 版本' ^' N7 t& ?" |/ H8 c
– 字节 4:0x00 - Get 指令4 ~% a6 |. e- @9 M+ D
– 字节 5:0x01 - Get Version2 C6 [/ U9 W# b! p1 z1 t# u4 D2 H
– 字节 6:0x02 - Get ID4 O8 b5 Z; I+ c' [* e7 L+ X- b
– 字节 7:0x11 - Read Memory 指令
* y' X7 h! t7 L" S! n– 字节 8:0x21 - Go 指令( ~5 S* J" ?9 f( L
– 字节 9:0x31 - Write Memory 指令
+ {$ k2 C  A3 ?3 ]# D/ Q2 Z– 字节 10:0x44 - Erase 指令3 y* e' l: C  `
– 字节 11:0x63 - Write Protect 指令$ [, B3 Q8 h% X& Z/ l* A8 m! H
– 字节 12:0x73 - Write Unprotect 指令
/ ^) d/ C* q5 t, R– 字节 13:0x82 - Readout Protect 指令
2 T7 L$ h! `0 ^5 Z8 ^2 X. H– 字节 14:0x92 - Readout Unprotect 指令8 Y5 m( k! S. X' C% V( b! ?8 A
– 字节 15:0x32 - No-Stretch Write Memory 指令
1 l! J# r6 T0 h9 j– 字节 16:0x45 - No-Stretch Erase 指令
1 l( i) H/ A9 t5 `" B– 字节 17:0x64 - No-Stretch Write Protect 指令
- A% l+ X& o& U2 \$ j8 Y– 字节 18:0x74 - No-Stretch Write Unprotect 指令
8 [& V6 y* P* v! |– 字节 19:0x83 - No-Stretch Readout Protect 指令
2 F6 p5 E4 N, }" j9 \– 字节 20:0x93 - No-Stretch Readout Unprotect 指令$ N& G" T- c' a, [- T& e# t9 S+ D
– 字节 21:ACK
/ q+ c: F9 w2 R. K% _* f5 }  x) e$ o8 m/ s% x  G: Q: w

( n+ D2 Q2 Z6 g1 \完整版请查看:附件
) d2 g2 ~) y6 B2 \, }
7 k; E6 C3 h) @" k* @
' b* s0 [, u7 [: T! N" p

STM32 自举程序中使用的 I2C 协议.pdf

下载

727.07 KB, 下载次数: 0

收藏 评论0 发布时间:2022-12-5 22:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版