|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
下面是一个I2C写函数,但是始终不能理解这个函数里面的“I2C_SDA = dat >> 7;”这句话,请高手解答一下!谢谢!!!!
7 g% |' O! |( M
B$ z1 x5 P# D$ z* L1 U6 iuchar I2C_SendByte(uchar dat, uchar ack)) W' o7 j6 B$ \& Z! J& P0 x: S: b
{! @/ P6 ^4 J5 N" E
uchar a = 0,b = 0;//最大255,一个机器周期为1us,最大延时255us。5 X9 U. M) q* a8 I
$ v4 h) J9 E0 W' R9 F3 \ for(a=0; a<8; a++)//要发送8位,从最高位开始9 L( x* d) n9 J: }0 M& O8 i
{
5 P6 A7 }! B2 y7 N8 H/ ]$ n, { I2C_SDA = dat >> 7; //起始信号之后I2C_SCL=0,所以可以直接改变I2C_SDA信号
4 c4 v4 n( l7 M! M: A# @) e dat = dat << 1;0 ~$ N2 O+ w9 A4 a
I2C_Delay10us();4 g7 W. r; N5 T/ V& j! n1 Y: Z4 Z
I2C_SCL = 1;
+ H# F) T$ F4 n. j! [' x I2C_Delay10us();//建立时间>4.7us p0 @; Z$ O! L. s
I2C_SCL = 0;1 u9 b2 }7 l: g1 n9 D& Q$ Y
I2C_Delay10us();//时间大于4us
( t* I/ ^) e; u3 I/ x4 r# k! F }
) B$ F9 |& N& I2 ~* k [. w$ e. n" k# ^; G
I2C_SDA = 1;
8 x3 Y+ V) K2 P( A+ W0 V$ I/ s' A I2C_Delay10us();
" U, d. h( d' C6 | I2C_SCL = 1;
0 T# P+ F. ^. F9 J% X while(I2C_SDA && (ack == 1))//等待应答,也就是等待从设备把I2C_SDA拉低2 ^. G# B% l0 q4 |* c
{; W$ v- ?, I0 ^9 R/ T
b++;
2 b; w' f" Y8 R' I; t2 `( p if(b > 200) //如果超过200us没有应答发送失败,或者为非应答,表示接收结束
1 ?; ]1 ?1 i: x7 M; z2 d( X$ B {
% Q( U7 d. g/ t& S* o I2C_SCL = 0;2 f% j: T# a3 [: |2 L' c
I2C_Delay10us();: j* K5 T4 i0 z3 F* {& s
return 0;
+ i! M3 p6 Q- A! g9 H }
% K3 A. q' U- W }
/ O' j7 a1 D6 v. v' k* f2 j: a( f9 D, |
; _) n7 H# y. `7 u% K: p* m6 e) M I2C_SCL = 0;
$ H0 @9 w/ Q) V, [- l I2C_Delay10us();
" d8 G3 S: k( z- q" a: C& t return 1; * y8 t# ^6 t% N; K8 @5 i
} |
|