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

【经验分享】STM32硬件IIC之DMA传输数据

[复制链接]
STMCU小助手 发布时间:2021-12-29 23:47
  1. <p>这里给出一个实现用DMA传输IIC数据的实现过程</p>
复制代码

' E, j8 `/ R* t* L6 d$ N这里咱们说3个点
; W$ T7 ]+ o" d8 ]1.检查IIC总线上是否有指定地址的器件; U( K8 n7 T* k# l: m+ C
2.IIC读取数据
3 b2 {% B. m& N: l2 L  ^* ]" l; [6 f- B3.IIC写数据
5 Q, p9 t+ G- G+ d2 T下面来一个一个详细说明
  [  P. q( W2 @! a8 t% m) _
% {4 g! L) S* `3 n* m+ _; R: I1.检查IIC总线上是否有指定地址的器件6 S. a6 O. i( C+ L# Q' [- H' g1 N

8 W, F3 o: b7 K- e* _
  1. 1.判断是否总线忙,如果忙则等待
    ) R2 u) h* V7 w& A4 e
  2. 2.产生起始位
    ! F0 g! I1 s: W! o1 I
  3. 3.等待起始位产生完成# D3 g" n& ^  m  [% \
  4. 4.发送器件地址(这里选择读写都是可以的)
    ; x( h  ]6 Y6 t2 w8 w! @1 Z* Z
  5. 5.等待是否有ACK位回应,(这里有两种判断方法1.通过判断ACK标志2.通过判断ADDR标志),最好使用ADDR标志位
    + b. \' C% g* d, x
  6. 6.清楚ADDR标志位
    ; \" e+ c' `9 h' ?, p9 S
  7. 7.产生停止位
    3 V' n4 p, T8 @& a6 K  u2 d2 J
  8. 8.通过判断是否有ACK,就可以判断是否有指定地址的器件
复制代码
$ D8 z% H7 c  J( S% d
2.IIC读取数据
) k/ P4 [8 F6 L; s" [* L: ]# l# P
5 u$ _& h, M* p% Z, ]; r
  1. 1.判断是否总线忙,如果忙则等待
    * N% K; q  o: N/ D" t3 @6 _
  2. 2.产生起始位
    ' `; K0 G* l3 W  e# Y* _
  3. 3.等待起始位产生完成
    8 G% C9 ~! e  A1 k
  4. 4.发送器件地址,这里方向上选择写数据
    - Q- F! X* `2 a! M; x
  5. 5.等待发送完成,通过判断ADDR标志位是否置位
    ) R9 J' a& O9 z# r6 ~
  6. 6.清除ADDR标志位
    1 L' d  v( B7 Q' @' B$ L3 j% O( ?9 }
  7. 7.同时判断TXE位,这个在发送数据完成之后,也会被置位
    - c4 ^# i" \% Z/ m  ?! ]
  8. 8.发送要读取内存的地址
    - F, f' C) d. ]1 {) F& V& b5 _
  9. 9.等待TXE位置位$ T* ~9 C: `1 ?/ F
  10. 10.再次发送起始位
    ' c  V; Y% n3 w% I
  11. 11.等待起始位产生完成+ X  K& q9 T: f2 z' o" |* L* {/ o0 a
  12. 12.发送器件地址,这里方向上选择读数据5 r7 E" u$ g4 j  W* w4 s' E$ j. U) }
  13. 13.等待发送完成,通过判断ADDR标志位是否置位" ^& a7 _0 G# [- E2 f4 P$ Y0 U) L
  14. 14.使能LAST位,使能这个,就能做到在传输最后一个数据的时候,自动产生NACK+ n/ |" Q! l9 X
  15. 14.开始用DMA传输下面的数据
复制代码
1 E1 @- f( M3 H% d6 b
3.IIC写数据
; K0 v# @( @9 A1 \0 [  ?, Y, w1 C! T" U7 }- Y0 ^, \9 [
  1. 1.判断是否总线忙,如果忙则等待
    9 [+ j" r  K& j' ?" p' e- @
  2. 2.产生起始位
    5 _7 s# R& y# Q+ L  V
  3. 3.等待起始位产生完成
    " r2 S7 ^8 G. D
  4. 4.发送器件地址,这里方向上选择写数据/ h# W5 x/ C- c! R: m8 K
  5. 5.等待发送完成,通过判断ADDR标志位是否置位
    4 Z4 {: ~4 T  \
  6. 6.清除ADDR标志位% N3 g. i0 P# ^0 ~/ s/ ^
  7. 7.同时判断TXE位,这个在发送数据完成之后,也会被置位
    - [3 w: V/ ]% s. }3 Y) p) U, A
  8. 8.发送要读取内存的地址
    0 W# y9 x4 Q  }6 J# x' G$ U" g
  9. 9.等待TXE位置位' v1 _, C9 e: N0 U8 G* G& k
  10. 10.开始用DMA传输下面的数据
    5 K' ]# z! |# A+ _# [
  11. 11.在DMA传输完成中断中产生停止位
复制代码
! n# k4 n& D& A

; Y$ B) C2 P3 ~& ^% b0 g0 g
- O8 A+ h1 T/ V1 \5 ~! ~2 s3 _4 h1 I
收藏 评论0 发布时间:2021-12-29 23:47

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版