|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
下面是一个I2C写函数,但是始终不能理解这个函数里面的“I2C_SDA = dat >> 7;”这句话,请高手解答一下!谢谢!!!!0 [5 k0 S+ u5 e
3 w, U* m$ r) T+ b# a( S" `uchar I2C_SendByte(uchar dat, uchar ack)
; F/ y% k- i% q* V/ y, D4 f{ v+ C; d, X! a2 X; |( S, U
uchar a = 0,b = 0;//最大255,一个机器周期为1us,最大延时255us。
) @, c" i: k f( y* y. W7 A5 i
: J3 S6 N8 A% x! ` for(a=0; a<8; a++)//要发送8位,从最高位开始
; {, ^# P Q9 x0 k; Y f/ | {, a, q; }9 a3 V
I2C_SDA = dat >> 7; //起始信号之后I2C_SCL=0,所以可以直接改变I2C_SDA信号6 i& n/ t- o* Y# S
dat = dat << 1;
5 P7 N) e: K- {, C I2C_Delay10us();9 F& \2 E8 s( ~# G
I2C_SCL = 1; l9 B* n9 D8 |3 A
I2C_Delay10us();//建立时间>4.7us+ f$ `( n5 h, v$ v9 ?# }- d, U
I2C_SCL = 0;
2 ^/ M, f: c- ?8 X4 } I2C_Delay10us();//时间大于4us 8 h: g* U/ m7 r5 {1 y2 D9 e, @
}
! s% N& v) c/ c: M8 [; d( a) ^: R, `, n) X
I2C_SDA = 1;4 Z1 P- g0 c) Z+ A5 Q, Q
I2C_Delay10us();4 W/ } w3 @+ j4 {3 P
I2C_SCL = 1;
5 z: O8 j* M2 F9 @/ l; y while(I2C_SDA && (ack == 1))//等待应答,也就是等待从设备把I2C_SDA拉低3 W k A; L/ F: L
{' H6 [ H. F7 U" p' ?: [# E
b++;) n; b2 L$ n9 |# C2 ]
if(b > 200) //如果超过200us没有应答发送失败,或者为非应答,表示接收结束: P" D" }& O% P2 N8 _/ _
{
* G) n* d$ y1 l0 e I2C_SCL = 0;6 D+ }8 d- `& q. U% t4 }
I2C_Delay10us();6 v5 H8 \. l" D4 W0 P
return 0;
- }2 L) o# w+ N0 w1 l4 [/ N& h }5 ^2 W F: `: K! g7 Z
}
A9 M5 z1 {+ P6 e+ ^# s" u1 ?; A5 H5 F D" U& G! N( L
I2C_SCL = 0;8 k% Y* e: O* Z, ?# ~
I2C_Delay10us();
9 ~, k- n& J+ U9 \' L- c. w return 1;
2 v8 ?! | S% r- B! z+ j- P} |
|