|
3#
楼主 |
发表于 2010-2-25 11:39:07
|
只看该作者
/*--------------------------------------------------------------------
( t% |2 w9 r; [/ V/ c* ?/ o/ l# o ~, X3 [* E: X7 O% V
函数名称:I2C_RcvNAckDat
9 o. h2 W& E* ?. O- o$ J( r
g& H1 b0 Z! _5 _) Z! J/ ?4 b函数功能:I2C接收数据且不产生应答4 ~8 D8 s5 i7 t7 b
# K$ r! q R7 e' _' ?# v( M/ ~注意事项:
( \) y5 G q2 Y' }: _& T8 f
6 H8 O" j$ n7 A' l2 V. B$ J提示说明: t3 c& D0 w2 }( r; C
! U+ P1 L3 f5 Z" d& K' J
输 入:接收数据存储空间指针
& r$ ?' Z! [: w
; d, r! A; u; @! z+ L, G! d返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
4 K0 K2 a/ j/ a
3 l! {3 `8 ?, Q# j2 \3 Z, h* k1 |--------------------------------------------------------------------*/$ g+ p S+ d2 E1 q- g8 F; B6 e3 X
3 Y3 |9 x; r: E( B ?
unsigned char I2C_RcvNAckDat(unsigned char *pRdDat) 1 t, {) V0 h5 G; P2 i/ }+ S
' Y3 ^) `' F0 O5 Z0 @5 s9 r
{' s0 Q8 u. ? u# [
# c% r6 H% r1 I" u( i3 { I2CRcvNckByte();
4 ^+ z# P" {; @! V2 G4 i
+ J6 T8 f; e% Q) A" I5 ` X if(!I2C_WaitINT()) return I2C_ERR;
* V- ~3 ?, q) P$ R0 c) @2 s# @7 L' k! i% n7 D' Q
if( I2C_STATUS!=I2C_MR_DATA_NACK ), w) Z, y/ _9 U6 t; g
( A$ `( o! N0 m return I2C_ERR;' v) O. {0 ?( v/ J0 @0 ~* A/ p
+ c9 U: a7 e n) a *pRdDat=TWDR;( \, K4 x7 Z( z* I
7 ]1 g# l2 J! i" f; F- ? return I2C_CRR;; j0 m. t8 n2 O* ]6 x4 l
8 t4 ~6 q( T0 }5 J9 o) ], N
}
0 o& |" t) P0 L2 ?) ~
' ` ~( j% ~; L. m/*--------------------------------------------------------------------; [( I" k# h* M; B8 Z1 R/ r
9 w6 ]# j7 l& q) V函数名称:I2C_RcvAckDat& R( w3 U! }5 R/ J: j
$ _6 @- x" n3 f
函数功能:I2C接收数据且产生应答5 G! E% O, p7 _* V* G& J& Z3 v! H
]( X( G/ u; `$ S注意事项:
, ?: h6 A a: L, P+ Y1 k
8 ^/ Z1 u% k0 d! H5 n. Z提示说明:
; B6 }+ R& B Q! Z! x" v# y3 o- m) O# n
输 入:接收数据存储空间指针
& A0 u% u; `* N- C. H1 v* s3 d: F; e5 O% i1 j+ J$ r
返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
8 F& O7 J* N8 X* l% z' |+ b# r0 S( d5 M7 l/ K7 l- M3 p+ f" G; H
--------------------------------------------------------------------*/# c& e2 M$ a) h- B
+ U7 L$ W. P' W: I+ E4 Z/ M
unsigned char I2C_RcvAckDat(unsigned char *pRdDat)
9 H. ?& s0 m7 {' f4 h
% u! n1 U( ^! m f9 N$ P{
8 }7 N l5 s5 L/ v2 Y4 }7 h/ x5 A8 g2 l
I2CRcvAckByte(); 7 o+ D! u" U3 M& k! I2 `, P/ m
3 |3 B1 G8 h, k2 t* T, `% S if(!I2C_WaitINT()) return I2C_ERR;0 A2 t. q; S0 ^0 Q5 J% l
: D+ D3 z0 E: H( x" c G& L if( I2C_STATUS!=I2C_MR_DATA_ACK )
4 Z3 C- n `! j8 s6 ]' a6 ~! x( M9 M! m. o+ S B
return I2C_ERR;
6 @5 }" D1 F# d7 P3 t7 l3 H) I% ~5 Y4 Z# n8 n( n
*pRdDat=TWDR;
9 [6 |- B" B2 ?: l5 o5 m2 M8 K3 ? m
# D0 n% D$ m: x0 k- e return I2C_CRR;
9 r. W& ], T7 W$ W5 z! w8 Q4 h5 |
4 z1 ]: [4 f( E6 w8 m: K}
4 ^. G& y' m8 M Y; P' k1 L
7 N3 T; L0 ] n! j/*以下是API函数*/4 A" l. _+ X- ]( F
2 D9 v, Z2 n9 P# Z' Q# E0 @
//(Application Program Interface 应用程序接口)$ |: }' {5 p; k0 \. w" p: \& v
$ }& ^1 s1 Y# a9 w/*--------------------------------------------------------------------
/ K# \1 G3 a; s
/ h' M" }1 E6 L! V& P: x( t( A% m函数名称:I2C_Write(unsigned int wrDAdr,unsigned char wordAdr,unsigned char dat): m3 \! G; k$ U T( x, s
O ^7 C4 g; x( P$ O
函数功能:I2C写器件,写一个字节$ S- s4 q% \* F2 |; D+ V0 E% X4 U, C
! m( }/ d" S/ \0 B, L* Y
注意事项:0 {/ m* W; v k5 o
# L' q n+ J- \& E! g# Q提示说明:2 R% B8 U: r( g' j! V
; T# s( o- l) H) i" Q
输 入:wrDAdr : write device-address 写器件地址+ ^& l& O* {0 d5 g0 n9 S8 {
8 Y$ u+ t: Z0 z+ G) q! H wordAdr: word address 从地址& u( G. c" U, w* }- ^. p
$ C: q% J* J4 V _ dat: data 数据( z$ ^( T% z% h/ c
9 h1 ~1 @+ r' X4 H
返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
) E% P0 |. \2 v p5 }2 J
4 D1 g" F0 p7 ?# }--------------------------------------------------------------------*/' a2 V4 \' L. h- \& `, r. u
* t. v( ~1 q7 x. c0 H- N: @+ Qunsigned char I2C_Write(unsigned int wrDAdr,unsigned char wordAdr,unsigned char dat)/ r3 d; @; q8 M
, I+ M0 t5 X9 ^" }1 V{6 i3 E9 d f& o$ S9 D4 ~ N* |
4 ~7 f3 v- W# L
if( I2C_Start()==I2C_ERR )
4 M& S9 l/ }+ {* d
8 \4 B& c* Y# h7 S return I2C_ERR;3 G6 ?: G1 U" O4 l1 K7 H7 c5 i4 N' E
4 c+ K+ v9 o6 X2 M //wrDAdr &=0xfffe;
j. ]7 r/ n5 q9 _; f: d
+ Y4 t Q6 q" ]: J {7 `0 U2 l if( I2C_SendWrDAdr_((wrDAdr&0xfffe)|I2C_WRITE)==I2C_ERR )//保证写控制位正确
+ w9 H1 P. d' M9 I5 l9 u& U8 i+ m# n1 Z3 ?" m+ H1 _& n
return I2C_ERR;
/ t; @1 T9 {0 l
" S- |/ g" s: i" }9 q0 r" f' X: S if( I2C_SendDat(wordAdr)==I2C_ERR )//从地址当作一般数据发送
' x( A- P1 d3 b# U: C
7 `8 v2 ]* ?. l3 R( P, L# W return I2C_ERR;: G! a( Z% _3 G( Q+ m' ~! T: H/ M# x
8 U$ y8 L Y0 A. {, X5 S) @ if( I2C_SendDat(dat)==I2C_ERR )
2 A, r7 s' c6 k( @7 b
% w) _/ J3 ~ L5 O return I2C_ERR;
( i6 d+ h; @! J) V' C- H
' t% G' V! o( @: {' q7 v5 {5 i I2CStop();
- b* k7 m- b) z9 V
* }( \6 y% O$ U1 O7 p# z return I2C_CRR;5 }+ j4 ]/ x, ?. h0 a2 h J3 a0 W
, R: @' E" n' H* w! o3 B7 h0 |
}
! e4 g# q; a5 x0 b- i. V3 }! T, E+ z5 P1 d( q
/*--------------------------------------------------------------------' S. ]; B7 I: r, o. t
. f5 H- _. u# @& s" B& x; I2 P函数名称:I2C_Write_
: `& g7 C- x$ l: a# a
9 w, d# r- A' h ?% [9 @# O3 F9 ~) d函数功能:I2C写器件,写N个数据
8 I$ Q z- s8 w! q
/ G4 _2 s. h6 K2 r2 p+ D: }2 _+ |/ I/ k注意事项:
6 l4 r! z; @& M1 k/ ?; P9 z1 ]% o1 Q* B1 k/ E
提示说明:1 W8 ^4 Y' j z7 z* l* p1 P- e+ T
. K( |3 j6 U J4 P0 Z$ ]输 入:wrDAdr : write device-address 写器件地址/ o! e& q; z2 X2 ^5 X) R" f0 f
, J& j2 e& A& c8 |1 ^1 V4 J6 n9 ^
wordAdr: word address 从地址
- n: w3 ^. n H W4 u. B' \5 }& A. [* G# L
*pWrDat: p->write data 写入数据的指针8 @( l$ D" g- s
2 m3 V7 s8 t5 `% V& X
num : number 写入数据个数0 n5 M3 z) o+ S1 z
/ K3 y' ~( O/ _( n; v3 f b返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
, A' |- S% F, {% G# _, R$ v& K4 v0 U( |1 V1 t
--------------------------------------------------------------------*/1 k" `- Q s1 p/ g4 M" z. ?1 o
+ N" f1 I; _ X( e! I2 Sunsigned char I2C_Write_(unsigned int wrDAdr,unsigned char wordAdr,
; }, ~: I% o; T. A% `6 b6 S2 h, r
k3 d% P$ X9 R" w4 @ unsigned char *pWrDat,unsigned char num)3 S. C% u' |. a' w( a2 V/ `
. K5 M' [4 J5 @2 {4 T5 b6 F
{
& E7 h, C1 W, u9 d# {" }! V- _& h
! Q& l4 U1 n3 W4 l7 `4 H* ` unsigned char i;
) q4 \1 U9 J: F
M' z' D V* U/ y; V7 L7 I if( I2C_Start()==I2C_ERR )! @6 ]) a! N& f4 S) o6 v$ c
1 H* h" ~: x) O& O7 }, Z
return I2C_ERR;
6 e5 r0 S: J) p6 V6 s$ H! _' l! h* N! N6 ^& f
//wrDAdr &=0xfffe;
" L/ p: x. x& E$ J4 r( J1 p9 x" d0 [# j3 |- s C
if( I2C_SendWrDAdr_((wrDAdr&0xfffe)|I2C_WRITE)==I2C_ERR )//保证写控制位正确
" l' L+ G. t( _8 C- Q* @& j' r
* \9 @7 }; j- S- X3 f return I2C_ERR;
& _; Z6 X/ X( m/ H% l+ U/ k
8 u! T2 y2 l& R6 O if( I2C_SendDat(wordAdr)==I2C_ERR )//从地址当作一般数据发送( H% q2 r; b: ] T
$ T/ \, P% G& ?) L
return I2C_ERR;" ~" y, [ E# F3 [0 F
0 I* H/ @3 M1 h for(i=0;i<num;i++)0 Z5 |# N: l, i& `- a8 k) ?
/ q* d |+ D' n( d! M if( I2C_SendDat(*(pWrDat++))==I2C_ERR )
. @8 ~$ m- I; t# V7 u. L: W' @' b
4 v, X: |( X. m% M3 m, X- a( ? return I2C_ERR;+ C4 B3 n6 D; O8 h; k0 ?
5 r! |5 }" z/ ]! T; O- j
I2CStop();
% Q7 b' X/ J( C/ f q. u+ Y j F6 u1 z. t" S, S+ l
return I2C_CRR;* E! E9 K1 b5 Q
/ [ l# B& w9 Z
} # H7 I4 c2 S! @. _% v& q* d+ o
* ~$ x F2 y7 D8 t& s+ c6 _* j; ~) r: N
/*--------------------------------------------------------------------
& f6 ^, }$ P6 B, D4 D& ~* B: P* x; X
函数名称:I2C_Read. q, k6 X) h3 [; X2 h% Q
; P3 B* E7 {+ a' w2 { p% ]/ b函数功能:I2C读器件,读一个数据7 ]2 H5 ^3 u; o I* n! {' A$ t
, Z: j7 v* s6 ~. M7 W注意事项:0 O4 r: m+ S& a# f
8 n% K% k+ D5 J6 y, [8 h! J3 M" @
提示说明:
# E/ B1 K" K8 v9 I# T l. K/ G* L! q
! k. P# ~' C: a# y; Z输 入:rdDAdr : read device-address 读器件地址
7 V+ b" c2 p6 ]( w
. l% a7 r4 {" R9 K! d+ G wordAdr: word address 从地址
+ s8 t, n8 y+ _9 L# I' B# B0 k9 v: j" j: ]/ f
*pRdDat: p->read data 读取数据指针
# n5 J1 b" i, E! x
. a! z; K6 w: t0 M+ w返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
: \6 [6 E0 L" W5 y( K: W; v c: T# j
--------------------------------------------------------------------*/
" ]( z' \# d, @
: ?9 V) ^+ l, Funsigned char I2C_Read(unsigned int rdDAdr,unsigned char wordAdr,unsigned char *pRdDat)% P) [2 m' n+ Y* e7 a5 H
# ?. L$ B: Y+ N8 t" p
{9 o" ^) o+ C% S" G) o
3 t, Y2 ^/ G; l" M3 @0 F& P) Z/ e& j
if( I2C_Start()==I2C_ERR ); o7 T" _& U/ M. C0 e: i$ L
7 g( y/ E8 k; b4 {* i
return I2C_ERR; T! Q2 h5 O7 J: {4 ]) K$ F6 o
* \4 A) {# n& n8 n- T
//rdDAdr &=0xfffe;9 _# ~* `! m: J
- H1 s. N+ ]( K) v8 H3 @4 j& |4 m9 H
if( I2C_SendWrDAdr_((rdDAdr&0xfffe)|I2C_WRITE)==I2C_ERR )//保证写控制位正确0 t1 R: {# Q; G* ]) ~0 ]. T
) J% Z1 ?0 K- \+ n# x0 z return I2C_ERR;4 M, }/ A( n/ r! M# d: e
; K1 a! s8 s8 _! a4 ] if( I2C_SendDat(wordAdr)==I2C_ERR )//从地址当作一般数据发送。
# a! O9 U2 o d5 v+ I9 u: m- e) m3 `; p8 u/ Q7 a& F0 N% A
return I2C_ERR;; [& K" x8 z# S/ S9 R u
- V4 W# q5 @% t, X
if( I2C_Restart()==I2C_ERR )//重启动0 N- f. w3 ^# |
0 F9 I# [& M' \
return I2C_ERR;* I& V' r8 _% ?' K
6 ?/ u7 x( s- C3 A" ?2 ~: ^- M //rdDAdr &=0xfffe;
A1 \" l" m* R; @% S$ T
; ]% P# N* b* e' q if( I2C_SendRdDAdr((rdDAdr&0xfffe)|I2C_READ)==I2C_ERR )//保证读控制位正确: J' E l/ J% X" q4 Z$ x
! M4 N' i9 C1 C( {
return I2C_ERR;
, \" Z8 B/ e) j9 {, t3 H0 J s# K, ]; \ [/ _ a
if( I2C_RcvNAckDat(pRdDat)==I2C_ERR )//接收数据6 [6 v) \& c% u* U9 s
2 @- n* r1 R& q. f0 b5 f' ]4 R return I2C_ERR;
. S t. s6 `7 {: y7 A) Z8 s8 y3 G9 P2 O' z7 C2 Y' N% s' L
I2CStop();
9 h. [$ q3 t* g" _& Y
0 V" a7 `4 ?% L return I2C_CRR;
0 d7 ~8 o L/ V# C
& H: n7 F- y. L& b6 G5 Y0 I2 `! q}" _6 \1 f5 l+ Z% F1 [
7 A8 R; l% W; G3 G/ R+ P/*--------------------------------------------------------------------
7 s5 [0 {9 n: m1 Y0 C. L0 ^9 e$ k. K( H: f; v4 ?
函数名称:I2C_Read_/ a+ G5 [, A0 ^/ F; u5 q
) r' b# y/ N3 \& u- F) X4 M: j函数功能:I2C读器件,读N个数据! y1 w5 G- _! u0 t" `$ E! b; H* p$ Y
$ z; x6 m h& Q7 E
注意事项:
1 z0 s7 B) U" G. o- z+ c: `+ N* n% p: Y8 x/ N0 f; S! \4 |' @
提示说明:
( j+ h3 X8 i4 l8 \( v5 Z; N& j! W$ I. L0 m
输 入:rdDAdr : read device-address 读器件地址
8 ? _* y$ g4 v7 z1 C
1 k' J& C% I- W4 x wordAdr: word address 字地址* N! O/ |1 S* q) [) s- z
* L: U5 {& g z5 @- N+ x- O *pRdDat: p->read data 读取数据指针 |
|