|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
下面是一个I2C写函数,但是始终不能理解这个函数里面的“I2C_SDA = dat >> 7;”这句话,请高手解答一下!谢谢!!!!
9 T0 O/ U- r K ~& J. L
3 @" f' v" R3 K) u suchar I2C_SendByte(uchar dat, uchar ack)( D3 o) n0 g \2 w( b' {( M
{& d b* P' a: }- e5 N9 c% g+ B" M
uchar a = 0,b = 0;//最大255,一个机器周期为1us,最大延时255us。: j" P5 _. K8 x! L
+ h' h, x: f/ d; y for(a=0; a<8; a++)//要发送8位,从最高位开始$ M; w; x: o9 m+ c
{8 t9 Z" o# g7 U* Y3 Q$ w
I2C_SDA = dat >> 7; //起始信号之后I2C_SCL=0,所以可以直接改变I2C_SDA信号& C& }8 V7 N2 O9 p7 H* j8 y6 G
dat = dat << 1;
( ~7 L ~7 Y( e4 e/ J: ~ I2C_Delay10us();4 ~- F3 y6 U3 c) r: c
I2C_SCL = 1;
' u/ h- r6 V. l" \. f& R) t" K I2C_Delay10us();//建立时间>4.7us
- ^& m$ e* E# @9 C8 N* y- a- b I2C_SCL = 0;" I( ~+ [$ D, @! u+ Y( M
I2C_Delay10us();//时间大于4us " \6 e1 ^- I M4 e; n' P3 i3 M
}
! n& X& l0 o/ X1 H! C2 x% P6 E- |+ H' j0 U4 y7 r* N. j) B3 s
I2C_SDA = 1; d2 b6 H% `! `8 C
I2C_Delay10us();/ l; c2 Z1 ?" b
I2C_SCL = 1;
4 r, a( H7 q5 y) f; h9 E7 d while(I2C_SDA && (ack == 1))//等待应答,也就是等待从设备把I2C_SDA拉低* e' a+ ~' A3 p4 K1 z" [
{
8 I w, b8 N, n b++;6 d. _8 D9 w0 ~. g
if(b > 200) //如果超过200us没有应答发送失败,或者为非应答,表示接收结束' B, ^( k4 h, `) b/ |: X6 \2 ]
{
! j, ]+ F6 c# B I2C_SCL = 0;1 s0 W) w" r( }
I2C_Delay10us();
, O% ]" S& M( q# e return 0;
- b6 Y; U; Y% D }
0 ~5 j/ A. i! t5 q }
! |" S, Q4 p: D3 `# M* z+ @/ [5 G! E
I2C_SCL = 0;
$ S' Q" `1 X% x' |. T$ Q I2C_Delay10us();8 u' s# c9 u$ o
return 1; - g3 H: g2 C' x! z7 P7 L5 m
} |
|