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

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

[复制链接]
STMCU小助手 发布时间:2022-12-5 22:00
前言
8 i. s- A- L& h( D( e' |1 n7 |7 S* w* e本应用笔记说明了 STM32 微控制器自举程序中使用的 I2C 协议。它详细说明了每个支持的指令。+ h! @: q. t9 o" D& E- F' }
若需器件自举程序 I2C 硬件资源和要求的更多信息,请参考应用笔记 AN2606 “STM32 微控制器系统存储器自举模式 ”。
7 f) A  f4 A% ^3 Z* ?# v
" F; X5 I0 C: D  k4 ~+ `4 a
}WI}[H~1PJMGS7SO4(KZM.png
, R8 G8 c% H0 ?: I# y8 S* P
) o( j# [9 }+ f; V' e7 e! A! \1 I2C 自举程序代码序列
& i; h6 K$ ~& v* j, z" }# S

3 t0 i& c8 K: b2 Q% d3 U3 h B)ZG{T]`SZ%GH$@(SD_AO96.png
- J4 N# _# x2 p& x
( h' E8 R9 H$ d' w, V2 自举程序指令集
' ~) s4 a5 U/ Q从 V1.1 协议版本开始支持 "No Stretch" 指令,当自举程序完成操作之前主机必须长时间等待时,它可以支持更好的进行指令管理。
5 H* \, _* z, U+ f& P只要可能,强烈建议使用 "No Stretch" 指令而不使用相应的普通指令。* U2 R/ [% T; G, N- y/ ^1 v2 L' g: i( Z
支持的指令列于表 2 中。% I# I0 J* N* j
/ w2 `/ t2 h. d/ g( Q8 P

7 F* B( Z5 {, t& m: I %`(B(N63YL{SE`077J[2(37.png 9 o5 }. `) V; U
; w+ z% t/ O# T' N, I! _
1. 若收到了拒绝指令,或指令执行期间发生了错误,则自举程序会发送 NACK 字节,然后返回到检查指令状态。5 g1 j- j; @+ @9 R- q0 a0 ^
2. 读保护 - 当 RDP (读保护)选项激活时,仅能使用此有限子集的指令。所有其它指令都会被 NACK,对器件没有作用。取消 RDP 之后,其它指令变为激活。
* Z9 v0 J8 _: s  o$ @8 g3. 若需了解哪些存储器空间可执行这些指令,请参考 STM32 产品数据手册和 AN2606:STM32 微控制器系统存储器自举模式。
/ B) }4 L- f$ B; \3 [  \+ ^4. 仅 V1.1 的 I2C 协议才支持 No-Stretch 指令。
5 c4 v' D0 E4 h4 c8 E; E! F( V  W
No-Stretch 指令
6 P. F1 a4 v' r# @. Z, k
当自举程序执行操作时, No-Stretch 指令可执行 Write、 Erase、 Write Protect、 Write Unprotect、 Read Protect、 Read Unprotect 操作而不延长 I2C 线。当自举程序执行的操作需要等待时间时,这些指令允许与总线上的其它器件通信。
9 Y1 Y' [9 e1 X$ I5 r8 c; Y, ^这些指令与标准指令的不同之处在于指令结束:当主机在指令结束要求 ACK/NACK 时,自举程序不会延长 I2C 线,而是使用第三种状态 ——Busy (0x76)来响应。当主机收到Busy 状态时,它会再对状态轮询,读取一个字节,直到收到 ACK 或 NACK 响应。
7 C5 Z- ?- R% @* E6 U( _8 Y) v, l
通信安全; G0 F. Z* S! i8 l' }
从编程主机到器件的所有通信都经过校验和验证。接收的数据字节块都经过异或计算。所有字节异或计算后算出一个字节,加到每次通信的末尾 (校验和字节)。对所有收到的字节 —— 数据 + 校验和 —— 做异或计算,最后结果必须为 0x00。3 v* U9 Z& g1 d0 r) g0 E% C. K
对每个指令,主机会发送一个字节及其补码 (异或 = 0x00)。9 q5 h/ d% H- [9 U8 w( M% u) r! v* e- ?2 w
每个包或接受 (ACK 应答)或丢弃 (NACK 应答):
* p8 G. l3 @1 [) p6 n• ACK = 0x793 z5 D, A7 R; U
• NACK = 0x1F/ |) S& m- v6 j1 u% W3 A4 k4 Y7 q
对于 No-Stretch 指令,当操作正在进行时,会发送 Busy 状态而不是 ACK 或 NACK:
& a! `4 m% U$ o$ }• BUSY= 0x76
3 a+ n+ y0 q2 s# U0 R1 a+ ~& w5 B注: 主机的帧可为下列之一:
; A" p6 z. P# g7 a• 发送指令帧:主机作为主发送端发起通信,向器件发送两字节:命令代码 + XOR。! H' c' v* R- @3 K( w
• 等待 ACK/NACK 帧:主机作为主接收端发起 I2C 通信,从器件接收一个字节:ACK 或NACK 或 BUSY。
/ P* X# \) T' @+ \2 g$ Z• 接收数据帧:主机作为主接收端发起 I2C 通信,从器件收到响应。收到的字节数取决于指令。
2 Q& L. |8 e2 x8 A& X• 发送数据帧:主机作为主发送端发起 I2C 通信,向器件发送需要的字节。发送的字节数取决于指令。& R" R. c( x; n: H! r! o, z
小心: I2C 通信实现了超时机制,这是自举程序指令正确执行所必需要考虑的。此超时在同一指令的两个 I2C 帧间实现。例如,对于 Write memory 指令,在指令发送帧和地址存储器发送帧之间有超时机制。 此外也将在同一 I2C 帧中的两个连续数据接收或发送实例之间插入同一超时周期。如果超时周期已过,则生成系统复位以避免自举程序崩溃。有关每种 STM32 产品的 I2C超时值,请参考 AN2606, “I2C 自举程序时序特性 ” 一节。  p+ h# }) ^/ ]' [' h8 ~  g$ R
6 [. i5 G! [7 S# V7 P9 h
2.1 Get 指令; C" W: A& i4 C" q9 i
Get 指令可帮您得到自举程序版本及所支持的指令。当自举程序收到 Get 指令时,它将自举程序版本和所支持的指令代码发送给主机,如图 2 中所示。
1 R  F% i7 I! [' K! B* X0 l
, ^7 b1 W. ?  A2 x$ K
% z! W8 d) \/ h
F(I)3@}BX]UJ5K$$_0U@IO8.png
  s* R" E7 h$ ?' i6 S0 ~  A2 A, Q9 i) C- D2 ], ~) M
STM32 发送的字节如下:, g$ E! \& c# i: Q+ |
• 对于 I2C 协议 V1.0:1 s! x+ S7 n7 y% w2 _, m
– 字节 1:ACK" I. l4 w: K( A2 |, ^
– 字节 2:N = 11 = 后续字节数 - 1,不包括当前字节和 ACK。) I0 W- }% `7 r9 `8 F/ }3 R& T
– 字节 3:自举程序版本 0x10 = 1.0 版本) Q9 N! g9 d# A' S" K' y2 k
– 字节 4:0x00 - Get 指令
+ n3 I& h6 N$ R. X% Q% J  n– 字节 5:0x01 - Get Version; s/ [# X  V0 S( P- r
– 字节 6:0x02 - Get ID* k6 L( I" }" q' o- |# _
– 字节 7:0x11 - Read Memory 指令  C4 F) i7 j! B
– 字节 8:0x21 - Go 指令
* j4 {7 X: H( P9 |+ B( a– 字节 9:0x31 - Write Memory 指令
# {9 x0 T3 Q% T– 字节 10:0x44 - Erase 指令
) n9 E, A1 z" l2 n– 字节 11:0x63 - Write Protect 指令# H4 V6 c. A% T! V8 L
– 字节 12:0x73 - Write Unprotect 指令
8 Z: M9 w* v( C1 _! A– 字节 13:0x82 - Readout Protect 指令
8 `+ Y; L) o8 x1 i, d– 字节 14:0x92 - Readout Unprotect 指令: \+ ^1 f/ p& |. r$ W1 k  D
– 字节 15:ACK
; e& A9 v5 t0 P' t. L8 W. A• For I2C protocol V1.1:
# r6 z: A1 @- @: C" H% r. G– 字节 1:ACK
) Q. F$ x7 K+ T' @/ o% W– 字节 2:N = 17 = 后续字节数 - 1,不包括当前字节和 ACK。
' C' S% I) @$ }! \– 字节 3:自举程序版本 0x11 = 1.1 版本
$ L& ]. k. l+ ~/ I/ u" i; L– 字节 4:0x00 - Get 指令
6 p$ W. c$ D! r+ b, Z9 m  Y# }. p– 字节 5:0x01 - Get Version  Z' B' m1 z4 r( o
– 字节 6:0x02 - Get ID6 _! U: u' q! S  f; Q: N1 R9 g! I5 }2 A
– 字节 7:0x11 - Read Memory 指令% Y* V! v/ M& O; k* r
– 字节 8:0x21 - Go 指令4 {% N( t) V: J- h
– 字节 9:0x31 - Write Memory 指令
" q3 P5 _# L7 N% d* Q$ u– 字节 10:0x44 - Erase 指令
: e, x) Q+ p! r7 |– 字节 11:0x63 - Write Protect 指令
9 t7 c; d3 D- F$ {– 字节 12:0x73 - Write Unprotect 指令7 H  @: n, q% {$ Q) b) h# J
– 字节 13:0x82 - Readout Protect 指令* {0 K2 v! e7 p$ Y4 V
– 字节 14:0x92 - Readout Unprotect 指令
8 z  H5 L) g2 v7 T- O– 字节 15:0x32 - No-Stretch Write Memory 指令2 L$ J) c3 T; x" t
– 字节 16:0x45 - No-Stretch Erase 指令# X3 R# a* T7 l- q1 E  h9 h4 C
– 字节 17:0x64 - No-Stretch Write Protect 指令
. h. k1 h  ~0 S7 y& k# S, q$ t– 字节 18:0x74 - No-Stretch Write Unprotect 指令6 V( \, [! ]2 M7 \
– 字节 19:0x83 - No-Stretch Readout Protect 指令4 _% `0 s0 f' R
– 字节 20:0x93 - No-Stretch Readout Unprotect 指令
  O0 N, m) ~. z$ T  X  A1 c9 K– 字节 21:ACK, d. ^1 Y. H& _1 X. L3 {) C
; g: a% M' A$ d! J- L
* [* R7 u$ x% ?  ]( J5 x
完整版请查看:附件( e( [! h) \+ d; O8 N
6 m$ X2 ~, f3 u9 U& \: Z
5 `8 H# s# H1 j! c# n

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

下载

727.07 KB, 下载次数: 0

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

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版