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

【中文文档】AN4221_STM32引导加载程序中的I2C协议

[复制链接]
STMCU-管管 发布时间:2019-4-3 11:04
STM32 自举程序中使用的 I2C 协议
4 ?; n( R2 J  o" P+ p/ Q8 {  x( A& f" C5 @
前言
4 g( }% m& c7 D! o/ s5 z4 o; b) G+ ]+ ^6 v: t. X( P
本应用笔记说明了 STM32 微控制器自举程序中使用的 I2C 协议。它详细说明了每个支持的指令。
% T0 H3 w* L. x- c+ K
: q6 Y1 f* v$ d
若需器件自举程序 I2C 硬件资源和要求的更多信息,请参考应用笔记 AN2606 “STM32 微控制器系统存储器自举模式 ”。
8 r+ I1 ^3 X- v4 j% c

- i6 d% F8 y# |8 c( K+ W& I; i
2.png

! n7 W4 Z9 ^# m: h2 x$ Q7 ^! W$ a/ w0 v
1 I2C 自举程序代码序列
+ f6 N) a5 n+ ~3 R( }+ \
7 T! U) x- P9 H" i
1.png
" Y7 B2 Q' b4 H, ?( p0 p% T- w
# |- E6 w7 A: _+ r2 B$ z
注: 在 AN2606 中规定了每个产品自举程序的 I2C 从地址。进入系统存储器自举模式后,并且此时 STM32 微控制器已配置好 (若需更详细信息,请参考您的 STM32 系统存储器自举模式应用笔记),自举程序代码开始扫描 I2C_SDA 线引脚,等待检测它自身在总线上的地址。检测到之后, I2C 自举程序固件开始接收主机指令。
6 a2 p& W+ a2 Z/ m2 W$ W6 W& f9 E) i0 U( `/ w
2 自举程序指令集
0 x4 W8 `( k7 P
- S1 a# i. d+ d2 R+ e5 o0 l从 V1.1 协议版本开始支持 "No Stretch" 指令,当自举程序完成操作之前主机必须长时间等待时,它可以支持更好的进行指令管理。
/ |( M' O$ Y! c. F4 ^
: ]4 J) s& T2 q: r只要可能,强烈建议使用 "No Stretch" 指令而不使用相应的普通指令。 3 M1 T) [: i3 ~! z1 K. d3 z' Y

! a5 n9 n; T# q$ @8 ?7 U8 c支持的指令列于表 2 中。* l# Z3 J5 `7 B- D2 v; y# k
% {2 I* F8 L$ ?' d
1.png
- A3 C" g) g+ }5 w% {( D  J/ H

- p; X/ i$ r& O- N% kNo-Stretch 指令 % B' @6 S- F8 g

9 }8 L3 t3 D0 A  [7 ~当自举程序执行操作时, No-Stretch 指令可执行 Write、 Erase、 Write Protect、 WriteUnprotect、 Read Protect、 Read Unprotect 操作而不延长 I2C 线。当自举程序执行的操作需要等待时间时,这些指令允许与总线上的其它器件通信。
/ A, t: G5 s: T; ^* j* L2 D6 g$ R) a) P/ k
这些指令与标准指令的不同之处在于指令结束:当主机在指令结束要求 ACK/NACK 时,自举程序不会延长 I2C 线,而是使用第三种状态 ——Busy (0x76)来响应。当主机收到Busy 状态时,它会再对状态轮询,读取一个字节,直到收到 ACK 或 NACK 响应。 / k6 h) z. T) {5 ~7 f* J
- a! X9 ?% _$ K& W  |) z5 a) V. Y- v
通信安全
: D4 ?( i+ w& D5 K# f4 Y% s

$ G' f1 P( b& q. G从编程主机到器件的所有通信都经过校验和验证。接收的数据字节块都经过异或计算。所有字节异或计算后算出一个字节,加到每次通信的末尾 (校验和字节)。对所有收到的字节 —— 数据 + 校验和 —— 做异或计算,最后结果必须为 0x00。
% W7 z% N' z. B, C3 v. f" s  X

6 {  U$ p. E4 y. o9 n7 m4 F9 P5 x对每个指令,主机会发送一个字节及其补码 (异或 = 0x00)。$ u: c: s+ H% M! V9 `3 a
, v4 n, C6 H: l1 S7 `: Y
每个包或接受 (ACK 应答)或丢弃 (NACK 应答):' D& C( u1 \  C
• ACK = 0x79. M  C% ]+ T: ]4 r( d' ]
• NACK = 0x1F8 I5 P3 t1 A3 e8 m/ k

8 s- E# K7 i; n( D/ }! @对于 No-Stretch 指令,当操作正在进行时,会发送 Busy 状态而不是 ACK 或 NACK:/ f4 T. q# K$ @# \! d. \

+ G/ }' X6 E5 Q, I9 U, R! x) W• BUSY= 0x76) O; u: N( p$ V" Z* U& L1 F  `8 S; W

, q0 Z. f/ z/ z- q. @注: 主机的帧可为下列之一:
$ E- z, M6 h; f- a$ T' s• 发送指令帧:主机作为主发送端发起通信,向器件发送两字节:命令代码 + XOR。' |9 B) s( Y  q  \7 ^$ x7 e
• 等待 ACK/NACK 帧:主机作为主接收端发起 I2C 通信,从器件接收一个字节:ACK 或NACK 或 BUSY。2 k- f0 d6 N+ B' X* z% c
• 接收数据帧:主机作为主接收端发起 I2C 通信,从器件收到响应。收到的字节数取决于指令。
2 l. ]. x5 y- G  b) [. n& S• 发送数据帧:主机作为主发送端发起 I2C 通信,向器件发送需要的字节。发送的字节数取决于指令。
; k9 m6 H6 f- I: A

" ]6 T% \  i% p- u) T% `小心: I2C 通信实现了超时机制,这是自举程序指令正确执行所必需要考虑的。此超时在同一指令的两个 I2C 帧间实现。例如,对于 Write memory 指令,在指令发送帧和地址存储器发送帧之间有超时机制。 此外也将在同一 I2C 帧中的两个连续数据接收或发送实例之间插入同一超时周期。如果超时周期已过,则生成系统复位以避免自举程序崩溃。有关每种 STM32 产品的 I2C超时值,请参考 AN2606, “I2C 自举程序时序特性 ” 一节。# t" ]. B, \% W8 h5 B

3 f; T8 F3 q2 ?* Q" N
...........

) Y2 n7 h7 C6 m2 X
想了解更多,请下载原文阅读

# V$ i0 F$ J$ {$ \9 g1 |/ B
& i- c, T$ n4 b1 p% @. |( l& m6 i3 b# j! D; K+ d& @# r
收藏 1 评论3 发布时间:2019-4-3 11:04

举报

3个回答
一代睡神的崛起 回答时间:2019-4-3 14:37:39
谢谢图图的分享
STM1024 回答时间:2019-4-3 16:12:58
感谢分享~~~
Kevin_G 回答时间:2019-4-4 09:39:23
收藏

所属标签

相似分享

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