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

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

[复制链接]
STMCU-管管 发布时间:2019-4-3 11:04
STM32 自举程序中使用的 I2C 协议
# Y* I: f. E( L
  i% g3 K; ?8 o* A! m' H前言
  k4 U) p- ~5 A* Q+ K# v" D( d  q2 y* U! a. N
本应用笔记说明了 STM32 微控制器自举程序中使用的 I2C 协议。它详细说明了每个支持的指令。 : K, Z' ^  }  }3 l( [+ t
8 k$ N! i! M# O; Z
若需器件自举程序 I2C 硬件资源和要求的更多信息,请参考应用笔记 AN2606 “STM32 微控制器系统存储器自举模式 ”。) O1 N% N) t% A% R

. I( C9 m: a' j% o
2.png

3 V+ A/ |' c3 f! O3 L# ^; D4 F% i! c5 q7 ]/ S# K5 T! o7 _
1 I2C 自举程序代码序列( K1 U- ~. e# i3 x! g6 K

4 B$ |: ^9 U6 z' v
1.png

+ Q. ~, e4 A& l  Z$ t1 ~5 o" u3 o9 b4 q* q7 j5 k% y7 p
注: 在 AN2606 中规定了每个产品自举程序的 I2C 从地址。进入系统存储器自举模式后,并且此时 STM32 微控制器已配置好 (若需更详细信息,请参考您的 STM32 系统存储器自举模式应用笔记),自举程序代码开始扫描 I2C_SDA 线引脚,等待检测它自身在总线上的地址。检测到之后, I2C 自举程序固件开始接收主机指令。& m1 x9 k6 n8 E1 C0 e: H! i
' }4 Z) {# S& `
2 自举程序指令集
( g( ~: F, m6 F0 e4 w8 s
- m; T! n6 @; x. e从 V1.1 协议版本开始支持 "No Stretch" 指令,当自举程序完成操作之前主机必须长时间等待时,它可以支持更好的进行指令管理。 : u/ A* ~# C5 v( o7 R% f

! u. Z, W6 w5 O* Z# e只要可能,强烈建议使用 "No Stretch" 指令而不使用相应的普通指令。
  Q% {6 i  H; a, l0 z: p0 Q

  ~; l# c! q4 r- d支持的指令列于表 2 中。$ F8 i6 e4 u; u! f
  X) m' \" g4 K) c& x/ `" J
1.png
+ Z- G& T8 I4 y& e4 C! Q4 J

/ D: f9 l# y. l" l& M2 MNo-Stretch 指令 ' y& s3 f3 j' n& T7 u
0 J1 t1 R8 B+ j4 a8 L; U, E: U7 O, j
当自举程序执行操作时, No-Stretch 指令可执行 Write、 Erase、 Write Protect、 WriteUnprotect、 Read Protect、 Read Unprotect 操作而不延长 I2C 线。当自举程序执行的操作需要等待时间时,这些指令允许与总线上的其它器件通信。 4 i/ o% C+ K1 b, r

' s; j2 A7 e& ~$ u8 {4 d这些指令与标准指令的不同之处在于指令结束:当主机在指令结束要求 ACK/NACK 时,自举程序不会延长 I2C 线,而是使用第三种状态 ——Busy (0x76)来响应。当主机收到Busy 状态时,它会再对状态轮询,读取一个字节,直到收到 ACK 或 NACK 响应。 + |* R! D! I! N1 e1 s
5 t4 Q; P4 J& A9 l- Y
通信安全
2 ?( M3 I6 ]1 [% E% }9 m$ e

. w2 _  a5 g$ _- r从编程主机到器件的所有通信都经过校验和验证。接收的数据字节块都经过异或计算。所有字节异或计算后算出一个字节,加到每次通信的末尾 (校验和字节)。对所有收到的字节 —— 数据 + 校验和 —— 做异或计算,最后结果必须为 0x00。- n# S8 N8 }' D  V3 i9 l
/ C4 g3 T0 B3 p$ m" M3 U
对每个指令,主机会发送一个字节及其补码 (异或 = 0x00)。2 D# p9 T+ O. f' f
$ l. i1 |" h) e8 R/ m
每个包或接受 (ACK 应答)或丢弃 (NACK 应答):
/ x6 ?/ m3 C6 m7 @5 a• ACK = 0x79& y5 T6 l% h. d" o0 a5 B. w1 a: d) \" V
• NACK = 0x1F8 N1 e0 s9 s1 g" a3 {' Y
8 e5 A0 O7 a5 [) |  h
对于 No-Stretch 指令,当操作正在进行时,会发送 Busy 状态而不是 ACK 或 NACK:
7 x, o, c/ d. Z

  p4 R0 S2 v- F$ J- x• BUSY= 0x76
+ _) a1 u; J4 p$ V- M+ m0 u( T3 O7 n2 |& f( Z
注: 主机的帧可为下列之一:
- Z: ^- k% b" Q7 r$ Z5 G) X# [• 发送指令帧:主机作为主发送端发起通信,向器件发送两字节:命令代码 + XOR。
5 @8 m$ V4 k! k2 v+ a• 等待 ACK/NACK 帧:主机作为主接收端发起 I2C 通信,从器件接收一个字节:ACK 或NACK 或 BUSY。  n: t* k# ]! R; G4 e3 b$ D
• 接收数据帧:主机作为主接收端发起 I2C 通信,从器件收到响应。收到的字节数取决于指令。6 t) ]- P* [, ]6 c' W
• 发送数据帧:主机作为主发送端发起 I2C 通信,向器件发送需要的字节。发送的字节数取决于指令。
$ ~' x7 p/ _5 s* @& n' b

* c; r1 h; h( l5 j  t  x小心: I2C 通信实现了超时机制,这是自举程序指令正确执行所必需要考虑的。此超时在同一指令的两个 I2C 帧间实现。例如,对于 Write memory 指令,在指令发送帧和地址存储器发送帧之间有超时机制。 此外也将在同一 I2C 帧中的两个连续数据接收或发送实例之间插入同一超时周期。如果超时周期已过,则生成系统复位以避免自举程序崩溃。有关每种 STM32 产品的 I2C超时值,请参考 AN2606, “I2C 自举程序时序特性 ” 一节。0 |# u) L( m: M4 ^  D% H* f
1 C1 ^( q' f% w1 q3 q
...........

. _+ u4 Y/ q- \5 W
想了解更多,请下载原文阅读
/ |: B, J( h9 W1 B) e' u/ T6 W# x

  h; @0 s  f) C4 n2 R- A$ I2 j! v2 l
赞 收藏 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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版