|
3#
楼主 |
发表于 2010-2-25 11:39:07
|
只看该作者
/*--------------------------------------------------------------------2 g7 g' C6 d5 a- s
. h% m* Y1 Z, q7 z* ] l0 A0 |1 d- F+ x函数名称:I2C_RcvNAckDat
- V6 k2 q/ _7 A. W
8 W9 M+ R8 h; E函数功能:I2C接收数据且不产生应答3 s! x3 S! T; F
- e9 A: _( ~. u5 z6 _( n, O注意事项:. |* D; C+ I8 u
/ j% R6 Y+ J5 H5 B, W' o提示说明:
& M6 R+ B1 z6 r4 z& k( [1 v6 X+ S* h) H5 G! F6 D% |
输 入:接收数据存储空间指针
6 h- o' J ]7 {% C
9 g5 `6 F$ f: ]/ e0 p" {返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确' l) D2 N8 ]2 }! [' i( U$ ^- e8 s H
4 U& `5 O* N: Z+ Y8 d& j& a
--------------------------------------------------------------------*/# V" W- Z( W1 b) L
: ?& t, ^; p2 N L$ Xunsigned char I2C_RcvNAckDat(unsigned char *pRdDat) 4 e# p: M+ ~+ P# Z% |( T
# K* r+ l3 }5 D) C7 x7 C; V
{; R# f7 C" O; G
8 |7 d1 G/ {' i; q' F" Y' W* T; g
I2CRcvNckByte();
6 z; W, ~6 c# B( F. a
- \/ b; A2 k6 Z! C* s+ L/ z if(!I2C_WaitINT()) return I2C_ERR;
2 O+ n( J9 I. C9 [6 ^% E- G3 `1 D* \: P4 A$ r; ~$ z
if( I2C_STATUS!=I2C_MR_DATA_NACK )0 ^* _! h: Q! W9 ]/ m4 [* ^' W
& i3 H* B1 x; \3 k) g
return I2C_ERR;2 y: @6 Y: K. ]) P; D
4 x5 ?0 d" M4 B1 l
*pRdDat=TWDR; _9 @8 }9 d$ m! {" a. R% X8 m
6 C: K' L3 N7 _2 X& ~
return I2C_CRR;( U' x" V: ^# A a/ B& d2 U
' d+ u" y' X. p. R% h( A}
/ M( p- |, q+ S% a. d4 K" V$ c$ a6 H4 H/ Y$ s* C; s
/*--------------------------------------------------------------------
* |0 t" q& j. A' I! P
0 Q' S0 i' D7 t$ \) @函数名称:I2C_RcvAckDat' Z8 K- P6 w0 @( V4 G* N$ ~4 @! d
4 Z, U/ q% h, c/ }
函数功能:I2C接收数据且产生应答
' L2 H K+ p, D
* T6 i/ u# k0 }: u% R注意事项:+ F% L# ^9 R B* }
/ i; v, P% c2 C* _$ Y* ^+ y3 n' f提示说明:- ]# Y$ J2 j5 ^5 J+ m9 h5 f
0 M& Y( V O& C3 e* L* Q
输 入:接收数据存储空间指针+ c* k0 Z4 f* |7 N b; F1 u1 Q$ r
p5 Z2 c: @" w: G( c. u: T3 t
返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
- D0 K1 z9 [/ q* a+ x7 r7 x& A2 Q+ O6 G$ {' r
--------------------------------------------------------------------*/. S1 Z! }3 @9 @* O$ N
7 x! }/ m# q& Q5 g, ]6 T$ B' munsigned char I2C_RcvAckDat(unsigned char *pRdDat)
. w* z3 [/ O8 O% n9 `5 s
) e& L U @' q0 X3 f9 k{
. d2 \+ j" i: e2 s; l: m/ n/ J) [4 g3 T
I2CRcvAckByte();
7 @" d Y6 B' ~! {3 e3 W' y- C2 U4 @. s2 e8 Y3 k
if(!I2C_WaitINT()) return I2C_ERR;8 t2 |' T7 V" M
, Y5 c% n' d! B, _+ x& [# @' C if( I2C_STATUS!=I2C_MR_DATA_ACK )( O5 ?, O/ _& E
3 [6 Q4 w- h6 _9 L# K return I2C_ERR;: @' m2 t1 ~) a, u* E
: P$ x6 f: ]( s# q- }- X' i
*pRdDat=TWDR;3 j7 w) J+ `0 K* y3 d
+ Y5 c7 h! b' e. @4 O$ @
return I2C_CRR;
2 d3 j1 n8 Q. c+ V P1 i% J0 ` A
}2 i1 b4 d: h' c
0 b. j* g+ b& r; P( T5 [& a/*以下是API函数*/) |( b ` {1 D& z
7 Z$ n$ P9 n% b4 p6 P//(Application Program Interface 应用程序接口)
' v+ t) a7 Y- |" X3 O/ F, C q1 R6 a3 ?; e& Q
/*--------------------------------------------------------------------
$ g6 |9 P5 W# v2 Z7 j# J/ T+ @, s6 Y' e( G* O) _/ M& {
函数名称:I2C_Write(unsigned int wrDAdr,unsigned char wordAdr,unsigned char dat)
2 b, r5 W- R% u( k) k g/ `/ h
) v' J3 a& t4 E; \6 p# E函数功能:I2C写器件,写一个字节, A w# L0 e% R$ j! ?
- M% U: i9 D2 D; \4 Y; y' V
注意事项:8 T; a4 ]3 I1 ?" |& q
( _1 K4 Z6 s" b8 g& z
提示说明:
% b1 Z. A8 z+ I& Y
6 {1 p \: R+ }7 y输 入:wrDAdr : write device-address 写器件地址
* N+ h X4 S3 v. h8 g S+ d& M- x D1 _( w5 E& }6 c4 m
wordAdr: word address 从地址
* o3 H2 T' [" q" W8 Z0 Z) R2 S% @% N7 s
dat: data 数据
3 I& R; B% l3 q* ?+ f. \8 `
7 U0 [9 D# s/ |返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确1 y; y' k3 V: z& V
5 W& U; c* L3 @) n8 p
--------------------------------------------------------------------*/
' s# D O. t) Q1 K& ^4 |9 i) f; R0 O7 h
unsigned char I2C_Write(unsigned int wrDAdr,unsigned char wordAdr,unsigned char dat)2 B7 I# c1 ~7 x" g/ J5 _. s# M: N
' G+ g- J% d( H' W{; k2 V1 u: Z! \8 ~! N5 b0 h' L& V K
! ~0 k7 V$ X- \( r& v9 ^' e5 \
if( I2C_Start()==I2C_ERR )
7 g3 z+ X; n4 U# e+ x* G1 D4 _1 h/ |
return I2C_ERR;9 n9 V9 H/ M3 J: Z
% M1 P# t" @( Z/ t //wrDAdr &=0xfffe;, E# C, Z; }+ v6 l3 s ~
0 A4 E! X" K+ P9 L if( I2C_SendWrDAdr_((wrDAdr&0xfffe)|I2C_WRITE)==I2C_ERR )//保证写控制位正确
' X- q; c* ^9 U7 w$ a" S
: y9 y: r b7 X- k8 _3 O j return I2C_ERR;2 Y/ O( ]5 ~% I- `& G2 k
. P1 w7 [! _- c2 L
if( I2C_SendDat(wordAdr)==I2C_ERR )//从地址当作一般数据发送
, Z9 q( R3 Q. Q# s- f* M: K: N0 d+ k$ \0 q5 B7 z
return I2C_ERR;0 g+ i4 A' k' y2 Y0 v) i8 A
' {+ f2 `; ^+ M, k8 i5 W0 c; {
if( I2C_SendDat(dat)==I2C_ERR )
+ A/ F+ U" y* m# A$ ^; ^
7 X! L# G+ D& c* a return I2C_ERR;
! F8 R% I5 I7 t1 h% k& W6 b( r2 y' `0 ?/ W8 l7 T
I2CStop();+ N- C3 f! V! F! A2 ^) f7 H% R
: T- S6 c2 j8 u, Y" ^& ? return I2C_CRR;
# |; }% X. Z6 n- o2 g# l/ `/ T! K4 w9 V! Z0 W/ ]
}
" J/ ~: w: y1 ?% W0 X* @$ a* {/ ?* ^5 [1 O: ^, K3 N& Z4 m
/*--------------------------------------------------------------------
7 p0 _3 O. R y7 s8 N+ l6 h$ S$ x' H
函数名称:I2C_Write_# @, u% ?% B4 i; E% b
0 i/ v9 l: E; n5 I" i4 x' `8 ]: X5 `0 p函数功能:I2C写器件,写N个数据" a. D& l5 ~8 k9 {# x: Z/ C v0 z
5 S3 L; t5 c6 @注意事项:& A: k7 Q+ F$ S2 w0 F
9 x( R. D7 T5 O9 D提示说明:
6 `, l" g( L5 A1 ?! U* B
$ e- G7 C1 A" B" s6 O输 入:wrDAdr : write device-address 写器件地址: u( W4 r5 }6 J/ m2 s# |- a
) A. R3 f' ^% b8 {# {5 O2 A
wordAdr: word address 从地址
0 P |/ ?* l0 p2 u* @% t+ g: t
3 O+ T9 E1 z+ u: V *pWrDat: p->write data 写入数据的指针8 f6 ^& ]) i; @2 ^- x D2 Q
% t' H1 S+ q- P4 y; i+ P
num : number 写入数据个数8 S5 n' X' x( n& d) S7 }+ T
3 F3 Y, t, q, R, Y. j返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
2 ]' s6 t; H- X
+ F) y/ k8 M+ g, ~& ?--------------------------------------------------------------------*/
' ?; Y; p' p: e4 K6 e% |: E5 L% k3 n9 A- Q0 t
unsigned char I2C_Write_(unsigned int wrDAdr,unsigned char wordAdr,7 ?* J/ w8 K* Y% [6 D5 ], n, R5 ?
+ ^: P8 x6 R/ d# T* _% v8 q unsigned char *pWrDat,unsigned char num)
8 N$ P2 L9 i8 D; h* o: S3 d1 Y: o" w2 s% x. O8 j' d
{' O {4 H4 Q6 J3 A1 ] W
9 Q+ r, e" O, F# z; r
unsigned char i;( t. D8 E2 F* q) H B" Q9 H" X
! M6 A# Z, ~+ a0 I
if( I2C_Start()==I2C_ERR )
; J( N3 E+ W2 I, o
5 R( y# u' d( X6 {' Q \) A return I2C_ERR;
6 d, r4 z& ~4 M
+ y+ e$ E( @. a' n1 M: _/ } //wrDAdr &=0xfffe;
! @4 M A6 y* U: d" F. k; o
" x: a# u' ]# Q3 P% O if( I2C_SendWrDAdr_((wrDAdr&0xfffe)|I2C_WRITE)==I2C_ERR )//保证写控制位正确& y' E3 `9 q' b
7 n+ c# e/ t2 r! C, l4 B
return I2C_ERR;
) M1 P/ l2 y7 h$ P) ~5 j6 n6 R, E9 T$ G7 X* A# Y
if( I2C_SendDat(wordAdr)==I2C_ERR )//从地址当作一般数据发送, r- D4 r" E+ \1 i) \* n
8 r0 `) _( w5 D# |5 A5 |1 T
return I2C_ERR;
; N3 z1 d+ R$ M9 g! W0 _
, ~0 A; a! w1 R9 x% A; c, v for(i=0;i<num;i++)
0 W J7 j" L0 M& A% {6 ^0 k7 [* f+ `, ?
if( I2C_SendDat(*(pWrDat++))==I2C_ERR )8 g h; S4 s: S" _, L" P
, E' {# _, k* w6 [( Z- R
return I2C_ERR;3 ?1 n+ T" T+ W
& H' [) d0 {* V
I2CStop();/ \+ A- g; K6 q# t8 G
: ^( b" `: \1 U$ c! |* j6 H# @" {
return I2C_CRR;
' V. {, [/ k L- r6 {+ |
' w. ~1 m/ n! E% Z} 7 c& T+ J2 R: j
* n |" e! B& s9 u/*--------------------------------------------------------------------
! o: x: ?; w4 a8 ^0 V( \( G: e% [! F: H. H' G! U7 G8 j
函数名称:I2C_Read
2 A! x R7 K) I- K" r4 ^' w: L8 j( _( \* a% C
函数功能:I2C读器件,读一个数据& R' F+ i& l# h, G" |/ b
5 i7 f: W" n5 I4 Q
注意事项:
; Q: P& T! A& {( G. v6 n! g; N2 N
! B: a L# q6 t9 w提示说明:
7 J/ Z! A; I1 S' E+ U* n8 `
) y" ~5 B/ o5 @; H+ l输 入:rdDAdr : read device-address 读器件地址4 d; E* w; Y- y- G0 c. b
3 Z& y( B. D) N+ O2 H! p7 _ wordAdr: word address 从地址
* r; M/ r. H; P5 A" @: J2 B; Q
0 G4 g/ P% f* m G7 A5 C *pRdDat: p->read data 读取数据指针
8 V. v' r0 W% j# ]1 Q- v& j5 w- k. Z' d1 R
返 回:运行状况 I2C_ERR :错误 I2C_CRR :正确
8 [6 X7 R' H- G4 u4 C) b4 A$ R S: Y2 w. I+ {+ {8 z# k/ v/ _
--------------------------------------------------------------------*/8 d& Y4 J$ ]2 s6 x9 [+ b6 N5 F1 K
7 G0 V$ n% H$ W) V0 r Junsigned char I2C_Read(unsigned int rdDAdr,unsigned char wordAdr,unsigned char *pRdDat)
* I |2 [6 u9 N4 P; n* i3 q' r4 I, ?/ c8 R
{
5 e# w& u1 {$ K8 _# [' |! l/ E8 b0 B1 f3 G/ k- J. s: |
if( I2C_Start()==I2C_ERR )' p2 z1 [* V0 \7 K9 l, l
2 ?4 D: H8 g5 Z6 t* t return I2C_ERR;) D5 c( r: O8 ~) |
& D2 n/ s+ H/ A9 B7 @' I6 s
//rdDAdr &=0xfffe;
; s- d! g3 n6 ^5 e! `9 ]2 K/ ]1 s' p, F/ K! f. J. r1 i
if( I2C_SendWrDAdr_((rdDAdr&0xfffe)|I2C_WRITE)==I2C_ERR )//保证写控制位正确
# i; x0 o0 A* c; I/ D5 d1 O+ l) ?! Z6 g$ i* Q
return I2C_ERR;
+ S& G, n5 r4 s' g$ ~/ q/ H5 y9 r, D. `$ G1 i( r
if( I2C_SendDat(wordAdr)==I2C_ERR )//从地址当作一般数据发送。& U) N# I* O' S1 P
9 K+ o% ^* P3 j/ o( }$ l- X return I2C_ERR;- l# x2 _/ |7 k* j: W
7 \, Y' C. O0 X( b0 ` if( I2C_Restart()==I2C_ERR )//重启动
+ k6 }: L# H- y0 i" [- P* `8 ] O. B- q- [
return I2C_ERR;
. \0 I+ W4 J& a$ o7 V* l5 k6 U) |. I1 \) m0 T- p
//rdDAdr &=0xfffe;" W$ H$ y% n/ f" f4 h9 y
5 E6 b B5 r1 w5 {1 L) \6 S
if( I2C_SendRdDAdr((rdDAdr&0xfffe)|I2C_READ)==I2C_ERR )//保证读控制位正确
9 G- H' g/ e& @& o9 s' o$ o) B
8 T l, P' b6 A( X( J# ~3 | return I2C_ERR;+ R Z+ P; p) o; G% |! t0 V% h
' X9 m: n* E! q$ s. h/ x& I F if( I2C_RcvNAckDat(pRdDat)==I2C_ERR )//接收数据
$ U$ V3 i! f q% H9 Z
! i$ ?- j* X! K2 b1 U return I2C_ERR;
7 D T+ W' J& j) K: V9 ~
7 x, N$ H- ~' a# `* D I2CStop();
U2 l2 \; M: d6 P: }8 n, E! w: z3 o" J! d" j6 t. u$ I* l
return I2C_CRR;
4 ]# q! g6 |+ d
: ?+ H" W! g8 | ]6 m; F! z7 g2 _}2 g4 E, U& p* L2 N, D
+ R7 {! y" t# Q' g: j/*--------------------------------------------------------------------8 t6 F6 D( c, H* p9 i
8 `: l' s; \0 X8 J4 P8 {
函数名称:I2C_Read_
% L; h- g$ j# o' f
1 p) T+ t4 p; w, t5 E, `& k函数功能:I2C读器件,读N个数据
! k; `# P- G% ]& S, x5 |9 ^; f( M. i F- g5 a: p" B- r$ }
注意事项:1 A" T1 `# f( O0 q& q0 a
# z5 D, V0 Y0 l9 O; \- y7 p
提示说明:
' O) f( Q! @# p- [6 V: @% D1 N+ x) Z- n, X( {2 w6 G
输 入:rdDAdr : read device-address 读器件地址3 T+ V2 n4 Z: B3 S$ w
3 A: Z7 `" F2 h0 W# p' w" o wordAdr: word address 字地址
6 ^8 h7 F; ~, a8 p% O6 c
" g! \# {3 z9 T! ?2 p# A; ` *pRdDat: p->read data 读取数据指针 |
|