|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
下面是一个I2C写函数,但是始终不能理解这个函数里面的“I2C_SDA = dat >> 7;”这句话,请高手解答一下!谢谢!!!!
8 r# P* @$ L3 _) o0 s
& p# A+ o0 R6 w3 cuchar I2C_SendByte(uchar dat, uchar ack)
! p$ a* U! v; F8 L{8 h `( F3 ?/ D" X% B; R* f0 h
uchar a = 0,b = 0;//最大255,一个机器周期为1us,最大延时255us。 B+ G, c( V" j5 ~
* [$ G0 `9 {9 v4 v7 M. [! p for(a=0; a<8; a++)//要发送8位,从最高位开始' @* I, Z! o" w! j8 X& X! [
{2 a2 k: e" W$ G6 n: t
I2C_SDA = dat >> 7; //起始信号之后I2C_SCL=0,所以可以直接改变I2C_SDA信号 ^/ P2 H @7 i' J
dat = dat << 1;! f/ f% L) R6 u# e
I2C_Delay10us();
, }6 q+ z8 a8 D, a5 y9 t6 N I2C_SCL = 1;
' ~" Y! j4 `( N9 e7 u: H I2C_Delay10us();//建立时间>4.7us
/ I/ O9 ~4 s2 ^, X% h! F I2C_SCL = 0;; P3 f! R7 k& C
I2C_Delay10us();//时间大于4us
/ a$ }% F: B0 b" j+ Q% Y }, g4 P; W/ m1 A
; t3 j' A3 ^% ^6 `
I2C_SDA = 1;5 W( ^/ l7 N; K" g% y7 t
I2C_Delay10us();+ c/ S) m6 a2 {% K2 z" ~# o
I2C_SCL = 1;
, r$ h3 L, @" c) X2 E; a1 e while(I2C_SDA && (ack == 1))//等待应答,也就是等待从设备把I2C_SDA拉低' N% B: E) ?6 ^ }% t
{" ^; E, Q( c) l& Y+ U
b++;
! {5 B5 ?2 T( S0 T. Q8 h& x$ ^% f if(b > 200) //如果超过200us没有应答发送失败,或者为非应答,表示接收结束* s/ w9 }! ]1 y) y2 X
{. r5 S# X* [1 Z5 k7 L
I2C_SCL = 0;
7 Y# ]& Y4 _( _4 D7 z I2C_Delay10us();; i7 {. s, s: g. h: C
return 0;
% Q& \$ X4 K* x/ J. }; X }
1 B* P3 K/ ?9 b1 a K3 q* ~, V }
: L) v, V- a9 v% t7 R8 ?) r
2 i* s! Q- j6 _4 |& w: x I2C_SCL = 0;9 `3 { A5 M0 ~+ i+ X8 `* Q5 R+ P
I2C_Delay10us();& N9 R- R- g1 d6 K0 `) c# e- [, W/ m
return 1; ) d: P0 Q' E# Z) x
} |
|