- <p>这里给出一个实现用DMA传输IIC数据的实现过程</p>
复制代码
9 r! X) b' t+ m; F2 Y* w1 a这里咱们说3个点
4 @8 w" p- l2 C1.检查IIC总线上是否有指定地址的器件/ \, E! n9 X n7 y# e+ x
2.IIC读取数据0 J2 l) [8 @* g- o! T& Y4 O
3.IIC写数据2 U2 g6 u5 P% b7 i/ Y
下面来一个一个详细说明
( d6 x2 k0 @- Y" b ?1 }0 N* x, r+ Y2 K
1.检查IIC总线上是否有指定地址的器件& I; l: w0 N- }0 W4 h0 n
. T" O3 l6 I; W4 s8 N' X
- 1.判断是否总线忙,如果忙则等待1 E; \2 O& B# Q( h
- 2.产生起始位& d9 W. }4 X7 ]! j) H2 E
- 3.等待起始位产生完成
& `' M9 ^+ ` g1 l2 d8 ?( o - 4.发送器件地址(这里选择读写都是可以的)3 A( |( w3 ^# ?3 z. [/ \
- 5.等待是否有ACK位回应,(这里有两种判断方法1.通过判断ACK标志2.通过判断ADDR标志),最好使用ADDR标志位
/ b# O1 l* d6 j - 6.清楚ADDR标志位
5 T3 m+ }# T+ `) u5 Q: L) c1 {7 O - 7.产生停止位0 X% y) P$ B, R3 y) S% J
- 8.通过判断是否有ACK,就可以判断是否有指定地址的器件
复制代码
$ b. K/ M- }7 X3 z8 V1 K; Y2.IIC读取数据
- Z. g; x% W$ ~0 \5 K3 x, P# N" z$ @* m) M5 i
- 1.判断是否总线忙,如果忙则等待- C6 s2 K" P) X
- 2.产生起始位
* L0 y1 p. f( B3 ~' v+ U7 H - 3.等待起始位产生完成
# @" f7 \3 {* E: `' q - 4.发送器件地址,这里方向上选择写数据4 P4 K3 X9 _: ?, `1 K
- 5.等待发送完成,通过判断ADDR标志位是否置位
# `5 ^0 A' a! Y0 x; G1 Y - 6.清除ADDR标志位# J, m9 \1 h' j, Q
- 7.同时判断TXE位,这个在发送数据完成之后,也会被置位- d# o, A* z: ]
- 8.发送要读取内存的地址
9 m; q; P, j! n5 \5 z) q# ^ - 9.等待TXE位置位0 T. w& i3 v( n; u
- 10.再次发送起始位
/ V! u# X" W7 Q; j0 I: g4 v; K - 11.等待起始位产生完成/ x7 s, A; X! Z
- 12.发送器件地址,这里方向上选择读数据
8 _7 q; J0 U/ {- m - 13.等待发送完成,通过判断ADDR标志位是否置位6 p6 }3 z+ E4 p4 r2 |; ~
- 14.使能LAST位,使能这个,就能做到在传输最后一个数据的时候,自动产生NACK
& w0 L" o/ l" s - 14.开始用DMA传输下面的数据
复制代码 # [# k1 ~, ]& V6 o9 X8 t* v5 X
3.IIC写数据+ ], r/ \0 ?5 L; {* e! j7 u- d
|9 q7 S( E( T( X6 |- 1.判断是否总线忙,如果忙则等待( l5 v4 v; f) { D
- 2.产生起始位
3 u, c/ Q. W/ v$ y3 [; ] - 3.等待起始位产生完成
( r3 u+ D6 Y$ A) L - 4.发送器件地址,这里方向上选择写数据4 a9 Z. e: W3 a8 l
- 5.等待发送完成,通过判断ADDR标志位是否置位
9 N) L! a+ a; b7 U3 w. k - 6.清除ADDR标志位
# G! t( I5 r& h8 M. M+ [9 [ - 7.同时判断TXE位,这个在发送数据完成之后,也会被置位
, j( ?' y3 n. ^3 X, C - 8.发送要读取内存的地址
J* R8 i0 R8 t2 j - 9.等待TXE位置位
+ m9 ]: l1 H6 ^- z- M5 V - 10.开始用DMA传输下面的数据, s; z2 t0 C* t! B' y, y
- 11.在DMA传输完成中断中产生停止位
复制代码 # V: T# l$ _2 ?- T
: w2 S! K0 y" F1 G# e6 j1 Q" C7 {. a$ g7 {! _( u% c; v8 ~
|