|
3#
楼主 |
发表于 2010-2-25 11:39:07
|
只看该作者
/*--------------------------------------------------------------------/ r' z% Z. K6 E/ w. w& {; ^; K
: i: g. A5 ^, ^: J6 z3 L* u8 G, R
函数名称:I2C_RcvNAckDat
! V& C) K: e8 }' r2 O. @; p1 ?* O; R- w7 Q8 i
函数功能:I2C接收数据且不产生应答
, {. f4 N, k; N+ E5 ?' C8 ], [* e4 N
, G. e3 b. O" d8 E1 u+ Y注意事项:
. f2 a4 f% L) @) o/ ^; y V {% ?% F" s9 I! c. W* M% Z
提示说明:
& p. y6 r% G7 ]: e% {! Q5 f5 S# l8 u: w' s2 }
输 入:接收数据存储空间指针! ^. z$ |6 o2 s
}0 J9 C f& n% ^$ u返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
/ B, Y; |# W; o! k ?" @( o/ A1 T# z9 N4 Z
--------------------------------------------------------------------*/
- k# K& Q% W0 F7 W0 y+ _% ^0 _; n8 a- U
unsigned char I2C_RcvNAckDat(unsigned char *pRdDat)
6 k4 J9 y( Q. a7 y. L. A/ W# K! n* Y; q! W2 J5 q7 f, N0 m8 d
{5 V# j' {* k; r1 D) f7 H S" B
d: h# w; ]9 E: s
I2CRcvNckByte(); X: ]1 W$ W! J, T& H) O7 G
9 W1 }( C2 R0 N) m- Z' p7 ^0 m8 y
if(!I2C_WaitINT()) return I2C_ERR;8 ?& w4 |$ z+ N; _* U
8 J; h- L+ A) B8 Q( S: Y if( I2C_STATUS!=I2C_MR_DATA_NACK )
4 {5 F+ U$ j7 {7 g+ c$ v+ A! `% o8 A0 T* T( s' W
return I2C_ERR;
9 k) l6 ~6 D4 x8 |* \$ Q% L9 @
9 U( c- A" M' e7 F' y *pRdDat=TWDR;
4 e7 `" X9 m9 Z4 e& w
( m2 f h$ ]! c! K5 B) H! V return I2C_CRR;. U }8 A f/ h/ O
5 u: O0 c2 C5 f+ b, _, A2 f}
% M2 v$ T3 j* p& R1 z$ l' S# x. [/ d: _0 V% h
/*--------------------------------------------------------------------
6 f; @4 U8 \8 e+ z
" q$ a. | s0 @函数名称:I2C_RcvAckDat
4 Z" a0 x7 F( S2 M$ M! c, r* E) F9 Z) M: G2 W; A
函数功能:I2C接收数据且产生应答
: X9 S% a: ]. v& t; I9 ?
4 o! R) r; b; Q0 z1 Z注意事项:
6 ~3 N/ j# ]/ b5 _1 l
# f" x4 H/ x3 S' f! v' i提示说明:
5 x/ I! t% w$ {- A9 K: q! _6 m4 }+ \% _ Y0 q) F
输 入:接收数据存储空间指针; x5 v! p3 Q( Y
) p+ T) l5 M/ F* O! o+ e
返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确8 A: Y M% y3 g# Y
& X* l7 y: I R# a. u--------------------------------------------------------------------*/
* J" }" r- w9 U; \- [
P8 }/ p. \4 ?7 Z4 C2 vunsigned char I2C_RcvAckDat(unsigned char *pRdDat) , o' x; k# n* r0 X
3 ?5 Q; q& K, F# @& N
{
# b& n4 f8 s6 p8 ~0 j3 x
' N, Z6 Y$ a1 Q8 H1 f+ h' x6 n I2CRcvAckByte();
8 ?# k/ R- z( F4 D/ s% Y
0 z7 {, D) t5 `2 d if(!I2C_WaitINT()) return I2C_ERR;3 f3 ?% l3 a6 A" K$ d
& D g1 J3 U; I: h: Q if( I2C_STATUS!=I2C_MR_DATA_ACK )
8 Q2 h, ?$ Q5 _4 F# \3 `% o
6 D5 M, V5 S, O3 M return I2C_ERR;
& a# d; q) l! V9 c5 I" U. y5 l0 |1 Q/ n+ L) c$ H; M
*pRdDat=TWDR;/ k' f( u$ _- R
9 c0 F1 Q; v' R5 B( w* f# o
return I2C_CRR;
3 v3 [- e% ^' m0 v8 Q L( m4 [
/ ~# X$ G3 ^) m8 Y. T2 Q}; D# h7 }) @' R: {- t* f
4 F0 H5 S& E7 C2 r ?/*以下是API函数*/( C% a/ d1 V; _; e; J
, K" X- c0 K7 l/ c/ M2 G//(Application Program Interface 应用程序接口)
9 p5 d/ ^( s8 f6 A N' D5 P% |' B+ L
/*--------------------------------------------------------------------; w0 t0 L2 S* j8 w- o$ Y: A
" l+ \- d) `9 P4 N/ R4 o# @3 ~ s
函数名称:I2C_Write(unsigned int wrDAdr,unsigned char wordAdr,unsigned char dat)6 a- Y: ?* Z- O f7 s
* X/ u: S/ g+ i0 p$ m& j# k5 J
函数功能:I2C写器件,写一个字节
0 P; f' [7 M7 c. u) p) k7 |6 N3 U' b" H) g
注意事项:
m8 d ]) T& E# F4 y9 i3 B0 F0 U4 i, i) y% m
提示说明:9 l- _7 f( x9 Y( Q3 J
( g6 S; m A+ }. v
输 入:wrDAdr : write device-address 写器件地址
$ V( P/ A c% r1 m% K8 s# U4 G7 ^2 l" p1 Q) Y* ?
wordAdr: word address 从地址
% E) |3 \+ \: x% o/ R$ Y: h! t) w0 h& ^! G5 y
dat: data 数据 K1 h4 l5 O) H) z
9 a/ x; K6 ?/ y* O/ V' p' T# x返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
: [5 E A9 ]1 M9 C% Z5 ~
4 h. v0 b- V4 v--------------------------------------------------------------------*/
- e4 a& Y# t1 U+ q& [6 w4 G7 k$ I4 r
unsigned char I2C_Write(unsigned int wrDAdr,unsigned char wordAdr,unsigned char dat)
) \# u: k* D% a' h. ]
8 A, F7 }: S2 W5 G5 q+ V& o{
# c0 g3 w# g4 m/ Z/ I" y4 ^: t: L* F
; f9 c. S- S9 p; ?- t if( I2C_Start()==I2C_ERR )% B0 c6 \) Y8 g$ |6 k7 c J
" b. W% D6 ?; B) t( }7 J: B" ]' Q return I2C_ERR; {! C1 d' L$ G% G8 E6 r: p
7 ? M* H$ e. d //wrDAdr &=0xfffe;
$ W" R+ u& ?1 q# T" V* ^% `1 }+ N8 E8 I* P8 T+ G0 v" b
if( I2C_SendWrDAdr_((wrDAdr&0xfffe)|I2C_WRITE)==I2C_ERR )//保证写控制位正确
3 o. v3 }1 m2 W. l$ H
4 h8 C F# d0 C2 _ return I2C_ERR;
- @! |8 D$ a, R" v) P0 |8 s6 Q2 y
: D! N0 n# Q l if( I2C_SendDat(wordAdr)==I2C_ERR )//从地址当作一般数据发送' @; k+ T1 j8 n1 n T( E. R3 A& D
1 ?9 k2 L' c* p5 @$ _ return I2C_ERR;
6 z0 c; ]1 p, B1 N+ h% r5 m
* e/ V0 A1 W5 q6 U: j if( I2C_SendDat(dat)==I2C_ERR )7 k$ x' |# |+ J7 w5 @5 z% L, x# a" b
4 F( X9 W2 x; i& ~ return I2C_ERR;- [" H6 ^4 P7 U h7 V
0 ?* q8 Q; q7 h' V& i2 d, N" d I2CStop();4 W+ ]8 ]4 Z! g& k; ]% ~! J- O* @0 r
4 v& P4 s! U, o) s0 i" A/ k( H
return I2C_CRR;
, Z2 R$ o! O4 x6 [: `; `" @' L
$ B( U) {/ Z) C. M# i) L5 x}0 G/ O' L9 k' y& X8 K; U
& q5 z" G" N2 I0 E$ q f/*--------------------------------------------------------------------, S9 J+ e% n' f
0 Q) @7 B! p0 H4 g函数名称:I2C_Write_0 F+ F$ X3 P$ L l/ ~6 I
9 k" ~9 R( e' O( Y8 h0 k函数功能:I2C写器件,写N个数据- Z J# l- X, O2 N$ m1 @+ J8 E
" Y7 F, T- H. J注意事项:3 g. A7 Y! b/ }; F
2 Z# n% m. y; B- \& H/ r Z0 c
提示说明:
1 r' P5 Y& H, k2 ?( j& A8 J6 e E* } @9 Q. Z
输 入:wrDAdr : write device-address 写器件地址
+ X! w+ O& p' ~' d- T3 H2 `6 d1 t; L$ M, {
wordAdr: word address 从地址+ p7 U8 l( B" G( ]2 T+ m2 k
) g9 p% @% ` f) {3 w, W *pWrDat: p->write data 写入数据的指针. }* i# V/ w; d% I6 k
7 ]' ?: ?$ G0 _4 H' `0 g. P num : number 写入数据个数& ]& P" d) Z1 `2 b( j
3 V& m0 ]7 D3 S返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确! v4 y0 r* o7 o
/ A3 }% p5 d& C- f T/ W% L& B
--------------------------------------------------------------------*/5 ?$ T6 K' i) x* a$ N8 j) M
4 ^5 q$ L/ j& W% [+ g0 v" Uunsigned char I2C_Write_(unsigned int wrDAdr,unsigned char wordAdr,! A' V- r% r& [# q9 ^; w1 z
- L6 x ?9 S& D/ D: w6 Z; f
unsigned char *pWrDat,unsigned char num)4 y/ q1 A% |) x: t- X
- v. R, v$ }. ~- Z3 h# V{
1 u M. ^" B: J/ E) `6 K" s4 z* c/ ]0 |7 B+ ^' i2 X+ @
unsigned char i;7 J G+ h3 G0 r. V H, G
4 o" t3 R# _, ]: \
if( I2C_Start()==I2C_ERR )
3 ?6 p; k% x& g R. }& |" y6 e% V9 T0 g& b# ?6 B, @2 Z
return I2C_ERR;, {1 B2 _+ Y+ o* O# \ v" \! f
' ^$ Q5 E0 O- |# Z8 ~
//wrDAdr &=0xfffe;* u- S0 j, c, I% j
6 f$ [: u: O6 n if( I2C_SendWrDAdr_((wrDAdr&0xfffe)|I2C_WRITE)==I2C_ERR )//保证写控制位正确
2 L4 J3 v7 _9 o& {& @9 [# E. W
return I2C_ERR;2 r* D9 B U* e1 b* \6 |
8 i+ ^) n2 `2 |* y/ D' Q, ~- j" N
if( I2C_SendDat(wordAdr)==I2C_ERR )//从地址当作一般数据发送 f& \% i+ h/ q
5 w$ p. |, | I( e; O7 m9 Y
return I2C_ERR;
6 j: k' o' [" v- P; L( m3 w4 M1 ]5 _, |* {9 Z8 j8 n* c6 Z' r
for(i=0;i<num;i++)0 ]1 G+ K' B/ y- c& R! k
3 B, W; K0 i% d2 d3 `- Z9 v if( I2C_SendDat(*(pWrDat++))==I2C_ERR )( ]0 B: B2 A. C
% M9 E" S& p9 }; F+ p return I2C_ERR;
/ F7 R+ K% u+ Y4 A
3 c) w: V" m1 w( }' t- z0 g( C% M I2CStop();1 T" c, U8 D8 B v4 j+ |( b
8 m( U/ g! d) F+ j5 o! ^: z/ F
return I2C_CRR;5 c. Z1 w8 l: W3 f9 s3 Z
- E, i; K1 R7 _8 v. F; I} 3 Q9 K8 I+ n! |9 s0 G
- F+ `$ h9 e7 s) t. b2 G, r4 Z/*-------------------------------------------------------------------- L+ c0 c- f& H8 Z0 G
% K. U9 S- V y2 K% V4 Z
函数名称:I2C_Read
/ W, Y) w2 n- | d& Z- } W. k6 g1 J
函数功能:I2C读器件,读一个数据1 y8 o2 S: I9 {' }( {; p5 S
1 m. d' Z% d# y. k
注意事项:4 F+ l* g* b& T
6 p3 V7 k5 h6 j( A4 A8 q9 @
提示说明:! J/ a. k; f( S
, b4 G2 X( Y% I* @$ ~5 F( l输 入:rdDAdr : read device-address 读器件地址/ i2 `8 _! C+ C0 Q7 H
' }. e" f+ R! v
wordAdr: word address 从地址
. P) L; c) P% A h' E9 s, S7 Y
3 Q$ o2 e* [6 X9 K; N *pRdDat: p->read data 读取数据指针! D% l2 J+ d5 L/ N/ j
6 k7 m* [) u- r7 y: ~( d! w2 P+ V I
返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确4 F; ^. h& O6 s. P; W& N
& z* \3 t7 G% t4 `: i
--------------------------------------------------------------------*/
3 r2 N3 c4 y# Y9 k3 B' a( M: U
8 b8 G6 {7 j1 f6 I6 c, Q- zunsigned char I2C_Read(unsigned int rdDAdr,unsigned char wordAdr,unsigned char *pRdDat)
4 G8 ] I% D) ]: o( G! ^ b! F% W: Q( ^- e" |2 k
{
* Z, M3 [" ]6 q: x4 ^6 K, d
& J' m3 s5 I6 b) a) j if( I2C_Start()==I2C_ERR )( l! X6 p1 i. s' A
/ I& R2 R8 k1 h- z% |% {3 n
return I2C_ERR;. [, _: ?5 p$ T; ?2 |" c: R
( e8 N1 V- \7 H2 a# W; `6 g //rdDAdr &=0xfffe;
$ a& U5 N% o+ r8 n1 b e5 @: p) \# y s' V6 X
if( I2C_SendWrDAdr_((rdDAdr&0xfffe)|I2C_WRITE)==I2C_ERR )//保证写控制位正确. u7 ^7 G$ ^! M9 g4 O
0 {# P' k" p9 s( ], J$ E* a
return I2C_ERR;
. @2 G. ~ F9 o w$ n
4 z6 o, U* c1 o) Z if( I2C_SendDat(wordAdr)==I2C_ERR )//从地址当作一般数据发送。. m3 D* O& w# g% `5 D' D2 {. a) Z2 a! h
7 W" y' X, u, D. N8 l
return I2C_ERR;
$ J8 K9 k# ^6 Q' ^
) ` F v/ x' k2 E4 D if( I2C_Restart()==I2C_ERR )//重启动5 B5 j8 E; f) Y/ T, S
2 \3 i0 K& r3 t$ N6 U; D2 }
return I2C_ERR;
4 A* B3 q5 [- ^* c; K9 i
% N z A! g* P% L5 V1 D+ F1 @9 x //rdDAdr &=0xfffe;
. {) A9 M' U( _8 j8 T4 R( H9 |& X+ J* B: G. h! Z8 U
if( I2C_SendRdDAdr((rdDAdr&0xfffe)|I2C_READ)==I2C_ERR )//保证读控制位正确
+ F% B# \ I7 x0 ]1 P1 I7 n b6 n
+ K! Q1 x1 h1 v3 E return I2C_ERR;
h) R- H; t0 o$ Y& F2 G& H. s, a' ^# w2 s1 W
if( I2C_RcvNAckDat(pRdDat)==I2C_ERR )//接收数据
" K& g) H* S7 f i3 ^( Y
: r5 V7 n4 ]6 ~8 _! I return I2C_ERR;! I& R/ d# C% @! A
7 N! x$ X, P4 V# f. o I2CStop();
& O+ i4 n0 w; f. C6 @% |
6 S/ A/ d6 d' T! N return I2C_CRR; H* A$ ]! N- W, S
( O8 }9 }' V4 s. w% t}; Z" \, i$ R* }* |
- N8 x( K( Z) R: U- { C# ^% B! s
/*--------------------------------------------------------------------2 V( V& y9 x4 u) C. n5 ` d# \& e
& L+ r) t$ m! {* J1 Z7 Y
函数名称:I2C_Read_
/ s) s: L- P$ r; @# ?8 n0 s# F
0 c$ x* F6 Y) _函数功能:I2C读器件,读N个数据
: B0 G, s0 o; ^; Y6 R# O
- t, h1 \* h/ ^, D, Y注意事项:
9 z" k H) p4 ]+ s; o3 G6 p9 m; E3 c" K) S& E
提示说明:
1 \) T G7 [; \% r; G* p, L) [! }* N( j6 R4 }
输 入:rdDAdr : read device-address 读器件地址
5 w" |3 V# n( a8 m! a1 t1 _/ {
wordAdr: word address 字地址
, O5 Z. A. \" o; b* T) \% g% D+ a5 o
" I4 @. K6 r; R *pRdDat: p->read data 读取数据指针 |
|