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

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

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

[复制链接]
STMCU-管管 发布时间:2019-4-3 11:04
STM32 自举程序中使用的 I2C 协议2 r8 K, n: D$ H' L
: W& G1 U* p) `+ r/ e2 }
前言 ( N- R. i! q. h. R4 v/ z5 q
1 p8 a/ Z: r9 h( K
本应用笔记说明了 STM32 微控制器自举程序中使用的 I2C 协议。它详细说明了每个支持的指令。
2 v5 B7 U/ E( W' p# ^1 ?
0 K5 C! E9 d/ x( M" @$ K: A5 V: c2 m
若需器件自举程序 I2C 硬件资源和要求的更多信息,请参考应用笔记 AN2606 “STM32 微控制器系统存储器自举模式 ”。& R- N  C2 w, S$ ~
5 q9 k1 h# {9 N3 Y( z
2.png

* `* d* D* O& t# X' l% ^- K# D  t4 G' N$ b
1 I2C 自举程序代码序列4 u) D; A/ M" M2 ?' t

+ V" v3 _. t- j) d9 G. ~
1.png
% X3 [/ j* h* x# w! P  s

& `* c2 \' F/ ?2 e+ A注: 在 AN2606 中规定了每个产品自举程序的 I2C 从地址。进入系统存储器自举模式后,并且此时 STM32 微控制器已配置好 (若需更详细信息,请参考您的 STM32 系统存储器自举模式应用笔记),自举程序代码开始扫描 I2C_SDA 线引脚,等待检测它自身在总线上的地址。检测到之后, I2C 自举程序固件开始接收主机指令。
& I" Z& k9 i; E+ Y: [8 A; l" b8 _: @
- j) K" V6 x# [( y+ Y2 自举程序指令集 2 D: M4 N6 w9 Q# D7 ^: x0 r
2 G9 N0 n+ Y4 V4 K2 Q
从 V1.1 协议版本开始支持 "No Stretch" 指令,当自举程序完成操作之前主机必须长时间等待时,它可以支持更好的进行指令管理。 6 D* x. H) y/ F6 i" D- E: q; o- C

) [, @$ C, j! }: o只要可能,强烈建议使用 "No Stretch" 指令而不使用相应的普通指令。
0 i* S; l+ X! P" X
6 _0 Z2 ?3 c  `! N/ C- k
支持的指令列于表 2 中。  Y% h! {# F- g' S

" J! l& K# S/ T
1.png
% d5 ]- p  Y8 O. d9 D) J

# V  I( \: J, I; n+ Q! aNo-Stretch 指令 ) z0 V" f( W( @) @( e) E

8 c, Q% O1 C  s) \+ E$ H当自举程序执行操作时, No-Stretch 指令可执行 Write、 Erase、 Write Protect、 WriteUnprotect、 Read Protect、 Read Unprotect 操作而不延长 I2C 线。当自举程序执行的操作需要等待时间时,这些指令允许与总线上的其它器件通信。
( r+ j4 D+ _# i. P# V8 C2 `9 E
: s% f, g' r' ]0 d+ Y这些指令与标准指令的不同之处在于指令结束:当主机在指令结束要求 ACK/NACK 时,自举程序不会延长 I2C 线,而是使用第三种状态 ——Busy (0x76)来响应。当主机收到Busy 状态时,它会再对状态轮询,读取一个字节,直到收到 ACK 或 NACK 响应。
5 a6 t0 l8 P4 ]: r
" X% j, D+ a) \6 H& b
通信安全0 q2 B0 ^- i& t8 S0 u+ n, R
, `) ]8 Q! I  {+ e
从编程主机到器件的所有通信都经过校验和验证。接收的数据字节块都经过异或计算。所有字节异或计算后算出一个字节,加到每次通信的末尾 (校验和字节)。对所有收到的字节 —— 数据 + 校验和 —— 做异或计算,最后结果必须为 0x00。! m7 @/ C6 z9 x9 k' h, `

0 s, h% t5 d0 J对每个指令,主机会发送一个字节及其补码 (异或 = 0x00)。
! x' g6 |3 X+ J) Q
  ~6 T% _& @2 [, O+ h9 l每个包或接受 (ACK 应答)或丢弃 (NACK 应答):# l. P  c7 u3 _& E4 n
• ACK = 0x79
+ k" t; \, J$ A! ~. r• NACK = 0x1F
. n/ C4 k' F. L* N9 G
7 U1 R) N$ _: s' _* a
对于 No-Stretch 指令,当操作正在进行时,会发送 Busy 状态而不是 ACK 或 NACK:1 S( o' F. u* r9 P5 r9 t

9 t+ |, s+ @* V6 G' y2 R1 x7 j• BUSY= 0x76
+ V/ v1 m: f7 W% w, H' j' }& c: j) W- T3 W3 `
注: 主机的帧可为下列之一:8 X0 ?9 H1 U) A8 r
• 发送指令帧:主机作为主发送端发起通信,向器件发送两字节:命令代码 + XOR。! l7 W* H0 ?% _; n0 Y% o
• 等待 ACK/NACK 帧:主机作为主接收端发起 I2C 通信,从器件接收一个字节:ACK 或NACK 或 BUSY。$ @' G: c6 o/ x- f$ i: `6 ^# e6 Z
• 接收数据帧:主机作为主接收端发起 I2C 通信,从器件收到响应。收到的字节数取决于指令。
4 c7 `; l1 ^  I- S, m• 发送数据帧:主机作为主发送端发起 I2C 通信,向器件发送需要的字节。发送的字节数取决于指令。  B! c' S. S# D* J( D9 g

2 Z- W& C# s: G1 h小心: I2C 通信实现了超时机制,这是自举程序指令正确执行所必需要考虑的。此超时在同一指令的两个 I2C 帧间实现。例如,对于 Write memory 指令,在指令发送帧和地址存储器发送帧之间有超时机制。 此外也将在同一 I2C 帧中的两个连续数据接收或发送实例之间插入同一超时周期。如果超时周期已过,则生成系统复位以避免自举程序崩溃。有关每种 STM32 产品的 I2C超时值,请参考 AN2606, “I2C 自举程序时序特性 ” 一节。- N! z- j+ Q) D- {. u
4 k' t( O6 `8 E
...........

$ s, z- [& z$ F4 Q3 g2 w1 i, l
想了解更多,请下载原文阅读

  k- j0 X$ b1 `* c. o  b3 a/ v7 D! a' P/ t5 ?0 V* d5 O' O# s

+ c  \* }+ I2 C, ]
收藏 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 手机版