- <p>这里给出一个实现用DMA传输IIC数据的实现过程</p>
复制代码 & b) b3 {" ]" [7 a
这里咱们说3个点6 ]$ U/ ~8 t, Z3 \6 e9 Q0 G) d8 ^
1.检查IIC总线上是否有指定地址的器件) L2 @/ }6 ]- O. t; f- q. {
2.IIC读取数据
* ]( t, W8 o3 ^ p* c4 e3.IIC写数据
; }; v9 G& B8 V0 u3 U- }# [下面来一个一个详细说明
2 p! g0 H& S9 X. U# e j
( x5 g0 ^/ t. t4 Q; j$ d1.检查IIC总线上是否有指定地址的器件
7 q8 L( i! d/ s+ y5 F- T
. U6 N$ `0 j5 U# V- b& z- 1.判断是否总线忙,如果忙则等待/ l* M$ s% ?: C: Q0 R- n, x T
- 2.产生起始位
6 b- y& Y9 B# _; [8 [; ]5 e& l - 3.等待起始位产生完成
8 B: O, t: T4 t0 t" V' U4 } - 4.发送器件地址(这里选择读写都是可以的)
1 H }4 ]$ `0 ^6 X6 u$ ]$ l - 5.等待是否有ACK位回应,(这里有两种判断方法1.通过判断ACK标志2.通过判断ADDR标志),最好使用ADDR标志位% p8 y1 t5 J) q0 }7 u+ V1 F
- 6.清楚ADDR标志位
0 r" d# Z5 N6 m0 Z& _) S - 7.产生停止位1 P" A, g9 V2 p
- 8.通过判断是否有ACK,就可以判断是否有指定地址的器件
复制代码
+ [7 \, k6 A3 O& s1 V2 T2.IIC读取数据
, K% w) o6 G: ^1 J( z/ p( m
. o+ V+ i7 x+ @' I, z6 H- 1.判断是否总线忙,如果忙则等待
# a/ Q/ ~) G$ d5 v# i3 u - 2.产生起始位
; y. J- \4 X1 E* x" b1 p7 @ - 3.等待起始位产生完成
; M3 r0 S% q( }0 p" a, O - 4.发送器件地址,这里方向上选择写数据
) [- T' g# U& k' o - 5.等待发送完成,通过判断ADDR标志位是否置位' n9 R9 A# ~! @- R: [: k5 o
- 6.清除ADDR标志位# j- v9 z3 Y* y* c: T' ^) s
- 7.同时判断TXE位,这个在发送数据完成之后,也会被置位4 ]( x; h) K {/ c: J& T
- 8.发送要读取内存的地址
: p( g/ s, g% ?! E& K" } - 9.等待TXE位置位, N9 k9 G7 G- ^5 X" D! P- K: _6 Q
- 10.再次发送起始位
i8 d* a& P4 K+ k - 11.等待起始位产生完成* v7 w4 ^* S* k3 I7 q6 Z7 j
- 12.发送器件地址,这里方向上选择读数据5 @0 H% A! R! g2 N
- 13.等待发送完成,通过判断ADDR标志位是否置位
' k5 B& B7 L5 R$ K" q( j! } - 14.使能LAST位,使能这个,就能做到在传输最后一个数据的时候,自动产生NACK
# ?9 p% x: J# B& f. B - 14.开始用DMA传输下面的数据
复制代码
0 a. ^9 h9 H9 z: I) h3.IIC写数据
, X" |: T& N. K# \) w! ?$ N" R }' {1 n' e
- 1.判断是否总线忙,如果忙则等待
1 T+ Y! h- t. ^$ f5 B5 v. a - 2.产生起始位8 z. K; z$ Q; y' ?
- 3.等待起始位产生完成
' k' y& q8 H" e/ V2 l/ w - 4.发送器件地址,这里方向上选择写数据* n# O% C- w- V5 j* t4 K3 j* I
- 5.等待发送完成,通过判断ADDR标志位是否置位
2 x- E8 d( {" i, |6 C - 6.清除ADDR标志位% |2 ~& j* l; Z
- 7.同时判断TXE位,这个在发送数据完成之后,也会被置位
/ o4 G- ]5 i. C" h - 8.发送要读取内存的地址
2 P& l0 A) I5 g+ Q& V - 9.等待TXE位置位
2 @; }* V/ `4 s; ?+ o3 C6 E, } - 10.开始用DMA传输下面的数据
2 O. ]+ H5 J# _3 {+ V6 Q - 11.在DMA传输完成中断中产生停止位
复制代码
5 v$ w* @' z0 m3 M b7 b# ]7 d+ K! a" }
: ~7 T2 _$ g. P" [8 ` |