- <p>这里给出一个实现用DMA传输IIC数据的实现过程</p>
复制代码 & q: B8 }" J7 M5 C
这里咱们说3个点! Y! z+ O- O5 ^8 _6 C# q4 h4 r
1.检查IIC总线上是否有指定地址的器件# Q6 C" m5 ?, t
2.IIC读取数据$ e8 x1 Z# U P U; |" J
3.IIC写数据% V4 k" ]1 }$ j; L: d/ P n: N
下面来一个一个详细说明8 J0 q9 g0 g9 T
4 j9 N/ v0 [' n9 A+ g" L z$ D3 ~* V1.检查IIC总线上是否有指定地址的器件
! h9 j5 m9 o3 g$ B& c- Q0 B" ]6 z: C& L1 w
- 1.判断是否总线忙,如果忙则等待% J n+ S4 Z; C$ ^' o2 _1 L* P
- 2.产生起始位4 |# y. q B3 \0 u- h
- 3.等待起始位产生完成
& P; _7 R' T0 E, W - 4.发送器件地址(这里选择读写都是可以的)6 [2 }0 j4 C! K. w3 T7 F
- 5.等待是否有ACK位回应,(这里有两种判断方法1.通过判断ACK标志2.通过判断ADDR标志),最好使用ADDR标志位. A. V3 ?0 M! f# @) r# Z0 o
- 6.清楚ADDR标志位
4 z! u7 |- |% J j/ @9 h' S - 7.产生停止位
Z# X9 W: Z9 a9 w# K) e - 8.通过判断是否有ACK,就可以判断是否有指定地址的器件
复制代码 9 P. w, m5 F: h
2.IIC读取数据6 d* _2 z% q0 D; X0 s6 v& H
' \* N- S6 h6 e. U
- 1.判断是否总线忙,如果忙则等待2 S' D- d; n" @" o& M5 V
- 2.产生起始位. y9 g. f4 S! a. }
- 3.等待起始位产生完成
' W- E. c- k$ J0 k' E - 4.发送器件地址,这里方向上选择写数据
# ]/ {9 O( U+ R6 c) z" e2 V8 V. \ - 5.等待发送完成,通过判断ADDR标志位是否置位3 x* R' ^. W+ C9 s
- 6.清除ADDR标志位2 m8 ^* j! q! L0 X6 r1 g
- 7.同时判断TXE位,这个在发送数据完成之后,也会被置位) H: X" G' h- }" p- u# C
- 8.发送要读取内存的地址
% W$ J) H% M, Y$ W- N - 9.等待TXE位置位1 B" n' [' W& W$ K4 l+ N
- 10.再次发送起始位
* k! Y4 g) b" r: T3 v - 11.等待起始位产生完成
; l+ |) i6 C# l! q9 y - 12.发送器件地址,这里方向上选择读数据
3 P8 f! C, u' v/ Z2 ? - 13.等待发送完成,通过判断ADDR标志位是否置位
# h3 D$ D, ~6 Q: T6 `1 k - 14.使能LAST位,使能这个,就能做到在传输最后一个数据的时候,自动产生NACK
; M) n1 r6 l! w4 z) j, D- x9 ? - 14.开始用DMA传输下面的数据
复制代码 . Z3 m; P: H9 t! O2 f |
3.IIC写数据- ~8 q% b! H0 S/ e+ g9 w
) l& K. N, U6 p
- 1.判断是否总线忙,如果忙则等待
! F) d2 @- z0 @7 |" C j - 2.产生起始位8 M' O' H, h) G5 A; ^
- 3.等待起始位产生完成' B7 x, h+ L& n/ o
- 4.发送器件地址,这里方向上选择写数据
1 i% @, A$ v3 a$ y& o/ o# m - 5.等待发送完成,通过判断ADDR标志位是否置位
4 F& v8 I$ ?6 ~' f - 6.清除ADDR标志位
3 V3 a* e/ n: t1 C7 y. Z$ h - 7.同时判断TXE位,这个在发送数据完成之后,也会被置位9 E- c, _" c9 u: U
- 8.发送要读取内存的地址
5 { f) q) o/ ]% G" g& ` - 9.等待TXE位置位
3 j, U& p' k* B2 n j( b- w2 c& C - 10.开始用DMA传输下面的数据
7 d6 T, I( I2 k - 11.在DMA传输完成中断中产生停止位
复制代码
+ }( C2 L( f/ V9 p0 q [2 N, \2 M4 ^7 G$ I/ C4 L
. |) L$ P" P5 N1 f" H4 ^
|