|
3#
楼主 |
发表于 2010-2-25 11:39:07
|
只看该作者
/*--------------------------------------------------------------------1 n! `" |- ~" R# }9 d* R
7 G/ u7 I+ J, M* W- H m7 }函数名称:I2C_RcvNAckDat8 a. w. @* T' X; `; r, m
6 M) q |* K% G4 P' c函数功能:I2C接收数据且不产生应答
& T: M! b8 X+ m" ^! |4 o
& t6 A9 O0 p/ C, n8 [9 A/ g注意事项:: \/ }$ ?7 @3 r8 o
% U3 l' }2 {" @. F提示说明:: |* V( J; G( N. u3 W2 n
2 k" X$ ~+ [8 f; A p5 O* k; C) p输 入:接收数据存储空间指针
) w2 w( e8 S0 Q9 L! {! @2 F2 G& C1 ]: u0 V$ }
返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
" t' }. B6 `: c. J+ R: `# N* _
/ O8 }" W- L7 p/ T9 Y--------------------------------------------------------------------*/
/ x7 r, v8 I% s) h
5 }* i+ @4 E& w0 y/ Q6 R( |0 Runsigned char I2C_RcvNAckDat(unsigned char *pRdDat)
) k F# `# u$ a4 D5 R6 p2 C4 p% {; @' I$ ~! Y5 y* ]& e' f
{
; N- P4 K4 q5 Y
; w9 G% q9 w! F; _ I2CRcvNckByte();. H6 f4 r }2 w$ @5 e+ y% M
2 `$ h: f9 j* ]2 J if(!I2C_WaitINT()) return I2C_ERR;- r1 V! B- O7 `2 q. \) H7 H
& d: L9 w) N, |6 a& }. b if( I2C_STATUS!=I2C_MR_DATA_NACK )
9 Z( R+ C7 H" I2 t: s- w
+ m" n7 F) d( o. g return I2C_ERR;
% m3 ]& u8 t2 E/ m$ E& W
+ u. w8 L+ I; M) G2 q* d+ q- o# O, j *pRdDat=TWDR;
7 q, }; `% n# n# N6 N( P
/ h) ^/ X+ j. I, q0 y% M: J return I2C_CRR;; n1 P4 T& D% V3 n9 G* K8 P! w: y
. I; ~& w( I( Q: V! U8 L3 U' l}0 g1 g+ A. p! T: V; h5 S
/ y3 g/ I( w% f; Q, s" M
/*--------------------------------------------------------------------7 V/ X& x: E7 p& n
* z; y) P7 v: F1 ?3 u; w% j& B
函数名称:I2C_RcvAckDat
+ P8 \+ C+ n8 V! z( K! s
6 h9 D6 P0 x2 O+ B! c# ~函数功能:I2C接收数据且产生应答
& Y r4 s8 @; \9 ^& l
1 ^! I. ~' a8 p* }1 N5 L) X注意事项:% }; r( u; P. {% U* c$ ]4 c: Z, R0 @
# B$ r B1 [6 p提示说明:( x% j1 J* F% c5 A& D2 K- {. f& v; H2 ^
( z) R+ h1 ?+ V3 T f% i) ]! a输 入:接收数据存储空间指针
$ s/ i& R' H" Z" Z9 w5 V8 n
. n7 f+ |: S* w, S返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
" }- r9 m, J& _8 z
5 S* O K4 A N3 X# `: j- G- D. z1 Z; y--------------------------------------------------------------------*/' \1 d! y. o8 P: K: h$ J
# n0 ^2 `- J( ^8 {unsigned char I2C_RcvAckDat(unsigned char *pRdDat) ( N9 }3 u+ V/ M& z8 U3 Z% k
7 y9 _( R; O) @1 ^
{. W. u- m6 B, B- d: l2 z* s8 ]
3 f1 k0 o# f6 R I2CRcvAckByte(); 9 T$ y0 F/ Y N6 Y* N
3 b! G. N' O u/ ~1 r9 _ h- A# v9 U
if(!I2C_WaitINT()) return I2C_ERR;. P" {( _# t4 e l# S5 V
$ e8 w! K2 S1 N1 _
if( I2C_STATUS!=I2C_MR_DATA_ACK )- p% J! }' q H
. U* {! n9 n; Y% Y4 W7 F return I2C_ERR;$ M$ E6 i8 c0 e! V/ v3 X
P9 M( Y* \2 ^9 l *pRdDat=TWDR;# o) R9 M' u" N2 w, ~" U( r% r
, C G& T a' x$ o* k, D* d
return I2C_CRR;
' ?2 s7 ^. y$ p+ S# |5 \/ ~ N7 d8 V* k, S6 g
}
- _2 Z c8 q) z5 v7 h' n
* u: C: S; j; u* Y- q# E9 K0 j/*以下是API函数*/
/ }* }# J+ u+ a7 H' C, _1 |! `
7 X" Y6 V6 O% q$ l//(Application Program Interface 应用程序接口)
2 k2 X9 ?5 O9 K5 d8 T) s2 U3 E' K, l5 a
/*--------------------------------------------------------------------
* `4 } b1 I; V9 C+ W- z; V# n" R
- j. g* L, y0 N9 |. w# s6 E' f函数名称:I2C_Write(unsigned int wrDAdr,unsigned char wordAdr,unsigned char dat)# a1 U. Q3 @" Q0 u! P( B
. r9 J n+ i1 i' Y: ?( P+ Z函数功能:I2C写器件,写一个字节 o, `3 n9 s( C. q. x
7 j7 e$ n, J4 N, i注意事项:
, c6 g" P. h* c a2 Q5 O/ H
! v W+ [( g, \# l$ ~! e$ F提示说明:! q( n/ L2 }) c$ c
' V3 o/ j, b7 ~6 K
输 入:wrDAdr : write device-address 写器件地址: }5 {( b" W/ u
* \2 V2 h& s. \3 Q% B2 y( ^# U
wordAdr: word address 从地址5 F$ D# b! L$ G
3 }/ j! r! N( ` dat: data 数据 F6 }! {" e! z/ j/ g* \3 g
& ^: k' X0 y% }8 M6 G5 ] H返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
% o" G! M4 g- w H( o: ?2 g/ [2 x8 m% p, D* A/ z/ Q! h: Y
--------------------------------------------------------------------*/
/ P) ^& I' o6 f
0 l' ^0 A" V2 U% eunsigned char I2C_Write(unsigned int wrDAdr,unsigned char wordAdr,unsigned char dat)/ z# f; V$ p, v
' p4 M: g: q4 h- X) m7 c( ~
{
' m- _' Q# B# O: G' m; @
) ^2 w2 c( ?& D& x5 @5 }3 ]2 N+ y4 t if( I2C_Start()==I2C_ERR )
7 X9 B* L6 q3 [2 V
- G" G! C* a8 F. i% q, \ return I2C_ERR;
5 z) {* E$ z7 A7 k, W6 |; e1 O
# q& g( r( o# M5 h8 a4 }* X7 G //wrDAdr &=0xfffe;
. ]( I% X7 U% Y0 i- q }4 O: D3 O6 x/ t$ _1 j9 [
if( I2C_SendWrDAdr_((wrDAdr&0xfffe)|I2C_WRITE)==I2C_ERR )//保证写控制位正确
, P$ S- X6 Y+ v- g9 j% @' o h( N0 P( Z( j
return I2C_ERR;$ J- h! ~+ R( Q( f \8 o! N. [4 h
$ x1 X9 e; r. z% p if( I2C_SendDat(wordAdr)==I2C_ERR )//从地址当作一般数据发送) k) Y; Q$ `( T- Z1 E0 f& C
1 ~) h6 f7 K/ u0 D4 \ return I2C_ERR;
- F0 M, E' s4 T' `2 W/ n
0 {& X& d) h) @: ^ j* y) [* s if( I2C_SendDat(dat)==I2C_ERR )% F2 a/ L: R: m: [# q0 n. E5 O
+ o! s, t* |) [7 i8 b: D return I2C_ERR;! t+ S1 L: l& _% J0 P }0 G' q" X8 h
5 ?/ _8 S0 u% ~' y3 a I2CStop();
4 o" q' @/ A' V0 d5 u
$ T% u, S" U7 F return I2C_CRR;
7 e* A/ h l- Z) h* B0 D! ~3 q
: {- ^. t- N1 I* {7 J4 B* V}; J _2 f/ R8 R- }: _7 ~; J
" f0 G* k+ s; O3 O) o$ s
/*--------------------------------------------------------------------
8 }* k; r. s X# C, s2 u* T k# j, ^2 H& B
函数名称:I2C_Write_
- \$ l6 G+ T5 ]9 T! K. ]$ G. F. m! Z& B- {1 X
函数功能:I2C写器件,写N个数据) y4 R0 \. U- K
; l& o7 s- H4 h) m# u2 [
注意事项:6 x+ n% p+ U" c5 f
7 c2 W" Z+ S9 j4 f, m
提示说明:
! C( a: k$ G, W+ s+ \" J: ~( M% O# [ H3 O, W7 ]
输 入:wrDAdr : write device-address 写器件地址
! i/ A5 ?' o$ T; C9 w0 P8 P. P9 ^' q
wordAdr: word address 从地址
! J! d5 g1 l( y# j- ?7 H, S1 q
& o8 L; @- Y# {2 Z) @3 o *pWrDat: p->write data 写入数据的指针( y9 [) M1 B, `
+ z1 p+ j6 M5 Z; j num : number 写入数据个数6 i! B! v0 S; z6 b' ^' B% |
+ Z' f+ t( u4 w8 E
返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确1 o! P. p" T1 x; ]0 Z4 h3 k, N
( ]2 s3 [& T1 y0 l
--------------------------------------------------------------------*/7 k" @$ C v, d3 s
4 v! J/ R* g+ Y# o: p! B# yunsigned char I2C_Write_(unsigned int wrDAdr,unsigned char wordAdr,
! d" }* A& E+ y7 M" g
1 L: K: U$ [$ D8 f* J3 Y( c! n unsigned char *pWrDat,unsigned char num)
; E* r3 j+ N$ d/ ~, e9 G6 f0 z0 h( Z4 W$ s2 C, s7 I
{
2 q* \, p; I* s) N+ a
% t4 w! P2 a" n% a) K- O unsigned char i;6 X1 y$ O5 ?. i3 O% U) Y
3 a7 W- \) C* w. T if( I2C_Start()==I2C_ERR )
" Z' Q% \+ ~5 ?: T& `, a9 {. s! O. R, Y. F
return I2C_ERR;) ?" w- N3 d+ J# c, A% o2 Z( }
{" Y0 P6 @: L, z# U //wrDAdr &=0xfffe;
4 O$ W( A% U7 Y3 c& x
/ Q, t& I' d; O if( I2C_SendWrDAdr_((wrDAdr&0xfffe)|I2C_WRITE)==I2C_ERR )//保证写控制位正确
( F8 X5 Y9 s8 m
# G) x( m5 q t return I2C_ERR;! c" l, j9 n# l2 @( b0 F P
5 z' U0 L/ x, F T. b, i& U if( I2C_SendDat(wordAdr)==I2C_ERR )//从地址当作一般数据发送
; \- ^* H5 J' Z: C) N; f: Q, m( P+ x* \/ f
return I2C_ERR;2 d h/ H1 A% J7 W$ z w0 P1 T9 K( ^" u
4 U8 [2 l" i) I4 a# {; l6 ~( s# _) i
for(i=0;i<num;i++)
7 e! Q( l: e8 Y! r0 R6 y
8 j; w( B- X, a# M5 Q) v if( I2C_SendDat(*(pWrDat++))==I2C_ERR )4 l0 N! C( q' B5 I0 |3 {, b
$ S7 K4 y5 H$ r- h) K9 c return I2C_ERR;
0 Z! s# m- U# v& |( U7 d: U) }5 S1 z' }
I2CStop();
# B" b5 A% @2 O3 @; [2 Y4 L4 F4 n! C. y
return I2C_CRR;
# D' R$ G, D! c* r/ s7 b+ b
[% l% z" I( k; j. R) p. _9 O} ! \2 l6 M3 o6 [' V) V
3 \7 x& d" l6 S. h/ U9 C. d! S/*--------------------------------------------------------------------
9 t3 z9 \2 s: |0 }0 O. f4 z
( R. \/ M) S9 C% `函数名称:I2C_Read
: R% _& `7 ~- k/ |: W) }6 n7 L) p0 ~/ { {2 {! f& [1 o
函数功能:I2C读器件,读一个数据
3 d( p2 U4 w H' g2 R+ q/ c" H2 s% B# \
注意事项:
9 ?6 {; H) r" D+ S! R l* O, p% b# ~& e* N6 B3 @
提示说明:- m+ M* ] k! r; `! l7 m
, h. \1 }- C9 }) ^- Z1 _( q- V4 I输 入:rdDAdr : read device-address 读器件地址9 W1 A7 q- J- o- g: f& a2 {; t
) v+ T7 R* Q- c9 x wordAdr: word address 从地址
3 W7 Y& n: Q5 m, c7 t+ G5 Z8 N* n9 k5 h. n( o5 r3 D
*pRdDat: p->read data 读取数据指针- [/ y$ t9 l: P: p$ n
8 u* @! I# C1 O5 J返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
1 w- W- s: D! E# C8 T. [2 ?* ^5 i' t$ F, q5 H8 w1 a$ ]4 ]
--------------------------------------------------------------------*/$ N+ V! y/ _1 o, k
$ B: [( O' Y! t4 ?8 E3 y
unsigned char I2C_Read(unsigned int rdDAdr,unsigned char wordAdr,unsigned char *pRdDat)
7 v3 Y, V# Y( G) o/ B' z% M2 Y. b) {" D! @' U: o( P3 w) s
{) B' B) I/ l7 c
# J9 t! s$ z) H/ k! }4 \" v if( I2C_Start()==I2C_ERR )
$ @) o3 E8 N9 `2 d9 B1 t! T# A! S4 ^: h% C) J$ }, |4 f- ?
return I2C_ERR;
( E2 _- Z2 t. I5 Y
9 t1 A; K( R2 Q; S //rdDAdr &=0xfffe;
# N$ r1 f% X6 x. U$ K% ~8 G! k- _3 y7 ?5 U+ M$ r4 l
if( I2C_SendWrDAdr_((rdDAdr&0xfffe)|I2C_WRITE)==I2C_ERR )//保证写控制位正确
& f6 _) K: Y" Q+ r1 U8 m7 K# _1 P3 \' v% Z5 c" [
return I2C_ERR;* {7 g# W5 l' i# f( n7 C7 J
' V' z u0 H! L r# _
if( I2C_SendDat(wordAdr)==I2C_ERR )//从地址当作一般数据发送。2 W- i& x' ?, E; q/ y: s2 W
. |6 n" H; R4 r7 I
return I2C_ERR;
& Q8 G9 W; }8 {1 p _: H3 x, }. |) h6 k% F# ]5 w5 X1 t
if( I2C_Restart()==I2C_ERR )//重启动
6 b% f3 t4 d4 Q! ~+ V2 O4 U* f1 z3 m7 X0 [- D& o0 k3 o
return I2C_ERR;
' K- ], N; `. r& A9 T- U0 M, ^6 m6 J/ s( Z! \- }6 w" S
//rdDAdr &=0xfffe;
: ]: H0 H* u6 ~8 r2 [
$ d8 i9 }! ~" v+ {- h. G if( I2C_SendRdDAdr((rdDAdr&0xfffe)|I2C_READ)==I2C_ERR )//保证读控制位正确6 y0 K/ r8 S% P. ]- u% b w
; Z! U( r7 m( R: C' }8 A return I2C_ERR;% g7 D: [( L( R0 N& c( \
" }( N. o( v4 g+ w$ Y, P$ ?
if( I2C_RcvNAckDat(pRdDat)==I2C_ERR )//接收数据2 k0 I6 }! l, W# g3 W0 a- G
/ X1 s3 d7 G3 r! l, [3 f* \( O% A4 ~! r return I2C_ERR;$ n5 R3 h; `( V/ c7 ]' a
) V5 m) D' K& f* N9 e5 w7 P4 j
I2CStop();. p" V' l! Z' t! i. P$ \6 j
6 B$ D. ]7 Q7 c6 L return I2C_CRR;0 U1 {7 x2 Y5 X# ^2 @; [& {/ k7 D
% p5 ?1 ?' G# I& a6 Z) N4 q# `}7 e4 c" h: i: R; O. t4 w/ q
0 Y9 u. S$ M5 P% h0 Y/*--------------------------------------------------------------------
. ^. x; G `, _2 d i! K) A' _# p1 k. `9 h0 x+ [2 y$ C+ r I7 b
函数名称:I2C_Read_
4 M: s% q3 ^% ^1 V+ A6 t
! d+ H V, n) e4 A函数功能:I2C读器件,读N个数据
m B, L, d% o0 _9 ^' b" L) ]! l5 `, {# U* Z' y
注意事项:' G& h* w$ |% Y% L# |
: f2 \6 L& p" l5 [( M0 ^' ]! i4 K
提示说明:
# \- E. H1 N" X3 `+ n7 q$ [& T3 g- k+ j8 o/ U
输 入:rdDAdr : read device-address 读器件地址
/ X5 ]- V3 H1 k- V7 t9 b* [
+ [/ ]+ J; C2 A* C4 u' \ wordAdr: word address 字地址1 g, F( {9 q0 c @- A* J
k3 {% n3 x: D' V l# s
*pRdDat: p->read data 读取数据指针 |
|