|
3#
楼主 |
发表于 2010-2-25 11:39:07
|
只看该作者
/*--------------------------------------------------------------------+ [/ y3 ]2 f- p: ~& x
# [4 T/ p5 [5 u! Y! N" n* H
函数名称:I2C_RcvNAckDat
+ X. `/ X" @# @ G
$ O" w3 c! V6 c( X% P函数功能:I2C接收数据且不产生应答
- I- K- h7 d! B8 X
" T$ Q7 C( K/ y) Z& J注意事项:
3 P2 W; ~1 R) i
! t" M F' ]8 r* {9 Z. h8 i提示说明:& y; t4 s9 p( t b
8 j- E6 w* H( B9 k5 ^
输 入:接收数据存储空间指针
9 O# P- A; v" V& `% b$ X( I! Y' |0 I2 y" T2 N) _- a' |' \
返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
& e6 T3 z% W7 a% I* L
! D# p K a" s$ ^--------------------------------------------------------------------*/9 ~+ P( e* B" c1 ~% j- K% a
/ Y! ]' ?! _2 a1 Y0 V* g) h
unsigned char I2C_RcvNAckDat(unsigned char *pRdDat)
+ G0 w C" P n7 q& q6 ]& n( U4 c' }4 @
{% ^0 C9 L5 {8 [3 G! M) c
5 |" S, H4 Z. Y4 z5 a+ y- ~; H I2CRcvNckByte();. K, o9 y: J4 N# X# k
$ Z2 u, R$ \3 i" t# q' ~ if(!I2C_WaitINT()) return I2C_ERR;
; ], |0 y. {: @, W( e0 v
+ T1 c! l8 z5 R" q! ` if( I2C_STATUS!=I2C_MR_DATA_NACK )
* J3 g( q. s) l( m3 x% G" D1 e7 X! k8 V; k" G% a
return I2C_ERR;) ^0 G- P) |9 g" C8 u
X8 w2 u1 R: u5 H# J# q( o8 [
*pRdDat=TWDR; e* ]7 M5 A" S7 c+ B, d
3 o" _- B; s& r; \5 s% h
return I2C_CRR;3 C, C/ h' C0 p4 ?* U
6 Z% P& P/ @) a) s% ?}
: W( q# K! Z, H' {7 G4 S: G2 C) J! N' i& ?8 M
/*--------------------------------------------------------------------. A3 D5 G* O Z5 R) z
6 o ?# ?' b8 ]
函数名称:I2C_RcvAckDat6 R L+ V7 V+ L" P8 ~
4 C" L9 V* H: V/ ]3 a% D1 Y
函数功能:I2C接收数据且产生应答
+ i. F3 p1 {) i6 i% O* \( G3 C( T: a. ~. a. N! n+ ^
注意事项:6 ]7 Z! m* Q+ v
, m5 h2 w7 y0 Q6 t4 M提示说明:8 F( N" ]4 M- F
) Q1 K; V* G! t
输 入:接收数据存储空间指针- I8 {) K# x) w1 ]' H4 [$ U
$ V, \: M9 I& ^* G4 Q C/ W* z返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确5 L; j) ^( S3 D/ Z, ]4 w7 b k
# S$ @5 @ O2 U y7 a, s--------------------------------------------------------------------*/
# Y" k' i1 k; h
% e$ {0 j M4 N _: P1 ?0 nunsigned char I2C_RcvAckDat(unsigned char *pRdDat) & y+ z `+ w/ `
. ~" G9 _6 ]1 w* X: E
{
# a0 {$ \4 K. ?! F# ]9 |0 p3 i- I( N8 \+ w f. `4 H0 Y: s2 H: n! W
I2CRcvAckByte();
: | Y9 Z, U/ `2 A) }9 n$ `
/ i. O- u. G. |$ B if(!I2C_WaitINT()) return I2C_ERR;" f. u) {& h# T# B( {4 E
: T+ E, G/ ]# G5 A$ Y3 a" C if( I2C_STATUS!=I2C_MR_DATA_ACK )
$ E0 T) Y6 m( Z1 B& ` e! s' z2 y- D; q- A# p: F
return I2C_ERR;
. l" x, n& k, o. [8 X+ c3 E# \8 y: \; B0 D, I
*pRdDat=TWDR;; d W( ]. L* p/ J- Y2 l+ K% c* V+ k
* h0 G% e! a6 B- {* a8 D return I2C_CRR;. v7 \2 e1 W. E5 m2 K2 f* B
) t# U6 C. {9 Z" g9 G: t$ ]; S- O9 r1 |
}
9 J3 x0 l6 g3 A8 M( n0 \. c+ i# a0 v- W& _ @* t2 U0 H
/*以下是API函数*/" }% \) s' Z2 M$ t
5 K3 o& ]$ f+ v* [( y! e R0 s//(Application Program Interface 应用程序接口) U) S$ B0 G9 A( c8 t0 Y
, Q" l7 a( e6 O9 N/*--------------------------------------------------------------------
; }/ l+ r- W: r* z. _5 k
, Y( k2 j' m0 f7 q4 k0 a$ e& z函数名称:I2C_Write(unsigned int wrDAdr,unsigned char wordAdr,unsigned char dat)3 A: C4 y; y5 [
7 E, b, b9 b# I2 b函数功能:I2C写器件,写一个字节
6 h! b3 F2 u7 t0 m5 L+ A* j5 X5 M
Y. e3 n' s. J/ u" L注意事项:
6 w3 Y1 P; M3 t5 M# \3 v1 e
/ W, i# {5 n! |提示说明:
* W/ R: c: v# v8 d: ^) e3 V- P, m$ x) S6 H
输 入:wrDAdr : write device-address 写器件地址 {! J( \$ D8 M9 B% i3 u. E4 F. K
, Z [0 F) g* [5 }4 J4 n2 i
wordAdr: word address 从地址# e4 q n O' q! \- r P M
+ k2 u" p, A; ^$ O0 [ dat: data 数据
1 ~0 k" s9 c8 j8 g5 y
/ B/ R# B' G8 _0 j! {& L返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确 z, i, U# G- q5 T# |% ^
U, D) }" U, Z2 J--------------------------------------------------------------------*/2 y [6 D% S7 P! M% L6 Z
% |! N2 L# e1 d! i( Iunsigned char I2C_Write(unsigned int wrDAdr,unsigned char wordAdr,unsigned char dat)$ n3 i0 t, z% `5 D+ B' C0 g9 n
0 z. x1 e4 H9 m4 n1 \3 T2 L
{
# W% z" N* |5 B! i( h* q4 j
5 k3 X3 T$ L. J) r- H if( I2C_Start()==I2C_ERR )! L* K$ `6 Y# \
/ P$ V4 s/ Z, C& l$ V3 O return I2C_ERR;2 I1 }/ i: q2 }, Q2 S
% {# Y6 e. G H( Z8 t0 c! J; v% T9 N //wrDAdr &=0xfffe;8 ~0 _+ g1 U* o+ P: t
; x- z$ n2 \8 k if( I2C_SendWrDAdr_((wrDAdr&0xfffe)|I2C_WRITE)==I2C_ERR )//保证写控制位正确$ u( I6 W6 p4 p, ?
- v, P# p, D: L- q; d4 A return I2C_ERR;- Y+ t# M4 i ]! h z3 d
8 e3 U4 p: t+ E. P9 z( c
if( I2C_SendDat(wordAdr)==I2C_ERR )//从地址当作一般数据发送3 X8 k R; E5 c2 h/ v0 n
& ]5 `8 z7 g) ?- d# t- x ]! | return I2C_ERR;1 J$ Q5 S# x1 g; a
$ [3 s9 x- v$ _7 ?( r4 X
if( I2C_SendDat(dat)==I2C_ERR )
3 b) L' P1 J2 J W6 s. b4 R
1 s7 {$ R$ N# u+ ^6 ^2 N# {& w. M return I2C_ERR;/ P& V: [) m6 x$ p( y; w# a+ W6 ~
6 Q+ A; o8 X6 F' e \- ^4 r I2CStop();
9 C7 |# Z% O4 x/ @- H" f* {; a' E2 J+ [6 y2 w
return I2C_CRR;/ {2 U) c& c g2 A" I* f
( z6 O% a( Z+ m/ z' K- Y) O}* t6 H6 ^- n8 V; J
7 r( U* |1 A' I2 J6 D5 b* P- m; Y
/*--------------------------------------------------------------------: J( T' E. k! _+ a7 z$ K0 i
( `7 ~. H4 Q9 z) j
函数名称:I2C_Write_
" s# U! W1 Z) J. y) }8 _, E1 l# R" {5 f
函数功能:I2C写器件,写N个数据0 X: P8 T2 G" R0 h7 B+ j% V
. I1 [, O: a' P4 e3 o% L* `注意事项:# U, e0 ?: h: A* T2 J
8 O( I: p2 M3 d* d2 \% }9 {4 w提示说明:
$ `# E3 z7 y( q6 z4 e2 z
2 F; f/ `: a3 ^% H: m输 入:wrDAdr : write device-address 写器件地址; r7 v! ^8 s7 @- W! H
- P! @+ ?) j% ~4 n
wordAdr: word address 从地址1 Y+ _7 q8 G7 y6 n' G
$ X; P$ W. `+ Q/ S *pWrDat: p->write data 写入数据的指针" N# j, n$ b Z+ f) a; `
5 { v4 l4 r9 x( E num : number 写入数据个数
$ z( w, Z' W9 z) c- c$ _9 `
, ?4 ?: _6 j# i8 k' F' C返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
) Z8 h% G' |3 ^/ k. S! L
- a/ O( h2 |4 Y--------------------------------------------------------------------*/8 U3 G9 L& m; |5 [( _3 C& D z' k
3 v3 X2 I& l' n9 Yunsigned char I2C_Write_(unsigned int wrDAdr,unsigned char wordAdr,
3 w0 |0 d7 Q2 g) Y* s3 T8 R3 a0 P3 [! e0 W/ |8 J: s( y
unsigned char *pWrDat,unsigned char num)
- y/ f2 ?& \& S/ s" i; C' J8 C+ c' |5 F' I6 X
{8 Y: [; u6 _; T/ o" n! N, u! V
2 G5 S. X- O4 _' o" M
unsigned char i;1 c# k/ B& A1 c# ?: S8 Y
. k2 r. A p, o( g6 `; d
if( I2C_Start()==I2C_ERR )
. i) ? s* m: ?, j! S% N7 [5 C+ e" M$ C
return I2C_ERR;
; A" c5 d7 k: f& R
1 L# k7 j h0 ^) t R ] //wrDAdr &=0xfffe;" T7 J$ g. s6 D1 y
* u5 }, \, Q% l8 \$ @2 r3 E$ _ if( I2C_SendWrDAdr_((wrDAdr&0xfffe)|I2C_WRITE)==I2C_ERR )//保证写控制位正确
" l: A- p6 S y& t/ b8 X! i! z3 f6 ]
' a, r& i# l* i$ s6 U0 G: j( c" f return I2C_ERR;9 g% _+ B( F7 e `! s
5 e- I, z+ J' A/ s* k if( I2C_SendDat(wordAdr)==I2C_ERR )//从地址当作一般数据发送
z6 Q- [1 N! B1 J ?
1 _* O/ `8 M, C, z return I2C_ERR;
" e$ M! P) n5 G" R6 r0 z1 y. |: S/ b& W! T/ P" s$ s/ W4 }
for(i=0;i<num;i++)
* \+ |5 s |$ G; s
2 k: t# H5 @ F3 _+ [' B4 ? if( I2C_SendDat(*(pWrDat++))==I2C_ERR )0 R. p) r4 {" G, @7 k4 v; \4 r
, Z% \ D- m6 |7 k7 { w: O return I2C_ERR;4 a( L# D. A$ D& C
+ B9 Q) Q- r( p( }7 c3 S# Q
I2CStop();
( o( i, i+ K5 E# Q' @+ `; ^: z7 J( O; T' j; Z
return I2C_CRR;
3 D1 P0 p7 k7 j# g7 Q% O
) B, K6 {3 M1 M* b} 0 W( _% D' g! u: @0 [! {
: a% v+ O- H; K' F6 U, w/*--------------------------------------------------------------------
^8 y" ], O/ d1 V ~! _& u6 o; W/ h8 }! ` q/ @( s
函数名称:I2C_Read* f5 j9 h5 ?$ \/ X3 x
4 C$ e2 g" `0 g4 A( \" X) U函数功能:I2C读器件,读一个数据
) D- y1 ~+ m" h# [- d7 t/ m1 f+ \
注意事项:, S% l8 A9 f ?
9 i+ u1 S" @9 F+ e提示说明:
$ @! z+ U+ \. q* U; H0 P2 p, Y2 Y! R
输 入:rdDAdr : read device-address 读器件地址; u/ p- M4 m6 O; ^" G2 Q
; q- y5 d+ i6 n- { Z8 h/ A& P
wordAdr: word address 从地址1 o1 L* O; J: o% U! a
' Q7 O @3 [: }( r" O
*pRdDat: p->read data 读取数据指针! ^+ P2 p& ~% h, H- m0 s
0 N* e$ `& n2 U# Y5 V: T: D返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
8 ~' e7 K; Q) E; N, Q6 e- w
; H2 N( ? ]7 j# q& I--------------------------------------------------------------------*/
+ G4 x4 h& V9 _" D1 R: Q9 W$ l
: [7 h a5 W7 c! O8 Y+ r7 yunsigned char I2C_Read(unsigned int rdDAdr,unsigned char wordAdr,unsigned char *pRdDat)
% c: b8 a1 S7 B0 u6 o' W2 T- G- M% S# w: x% u- H
{: |6 e) z- P0 q9 i6 h
" R1 R9 z) K y) b' \" R% z/ @
if( I2C_Start()==I2C_ERR )
5 t: O" X1 o" l2 s( F+ Y% R4 Z% R; d( \1 m2 c4 R: l! J
return I2C_ERR;
9 D' `1 w+ \$ ~9 }
) p6 E+ X# v, f7 l6 _$ P //rdDAdr &=0xfffe;
7 g3 v. A! I; v* ~! M0 r
& z* Z& `' _2 g$ O7 U if( I2C_SendWrDAdr_((rdDAdr&0xfffe)|I2C_WRITE)==I2C_ERR )//保证写控制位正确* z% E+ u4 n+ x/ R, O
% t! U6 ^! d+ a. U0 \5 Q return I2C_ERR;
+ O5 X) f5 b/ k( x0 l
Z# I6 n) j3 P# j. r5 ^6 r# |! ^ if( I2C_SendDat(wordAdr)==I2C_ERR )//从地址当作一般数据发送。
$ M5 s7 ]3 i& Q8 ^3 D, N2 Y4 C/ k# E( ^6 E+ Z/ c# P
return I2C_ERR;( i L" r. x& Q4 I3 H
% E% H1 }, D6 f if( I2C_Restart()==I2C_ERR )//重启动
, I& j& O+ [5 `$ L' V; p/ q4 Q; [/ y
return I2C_ERR;
! n! I( E' Y/ Y: h, Q! a
@) c3 e# D( [! R& D% K( ~2 x //rdDAdr &=0xfffe;# a$ i0 `/ @6 r
) |9 b, E$ ]; [7 L3 B! ]4 } if( I2C_SendRdDAdr((rdDAdr&0xfffe)|I2C_READ)==I2C_ERR )//保证读控制位正确$ N) D, ^# G' `
* u" e7 c6 j7 M0 b
return I2C_ERR;
9 O( L' b9 e/ w) c$ O+ d' J& w% V: N; N) a' ~
if( I2C_RcvNAckDat(pRdDat)==I2C_ERR )//接收数据- f. ^7 r$ o+ f6 I( R4 e @7 W* J
; K# C% m7 a/ [. n, b return I2C_ERR;
" E" T! Q- t3 e. R, m: l% F5 |
0 F% f9 a! w$ {. V# H I2CStop();4 p$ @' w; A# j/ j& i
3 f% q- v' ` h/ m
return I2C_CRR;# ~; p" W6 X: D# @2 Y
4 n% r6 @; m" z8 q" C: `- Y3 @4 L
}% |& b+ s$ ]" o
: h4 y/ ]5 ~" P5 O
/*--------------------------------------------------------------------5 j" P Z1 Z2 n0 _
2 {) a+ G* G- q( ?& L1 p; r' t7 }0 n
函数名称:I2C_Read_
8 H$ F& i; Q2 R; p7 i
. Z4 m$ Z1 k; M# ]4 W$ l5 r函数功能:I2C读器件,读N个数据
4 |# Q* x" K$ k7 v* M* l& J) U' F4 a [
注意事项:% V2 [5 u h; \; ]8 e
d, L" A# F! U* v. w提示说明:
* q! s0 G8 y# ^
9 S+ C, e ~4 `输 入:rdDAdr : read device-address 读器件地址
+ ~6 i3 B2 R6 }& W+ Z4 r/ O* R; w
wordAdr: word address 字地址8 |! K9 z# v+ I6 l8 t
3 J% _3 v: u. t g1 _
*pRdDat: p->read data 读取数据指针 |
|