|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
下面是一个I2C写函数,但是始终不能理解这个函数里面的“I2C_SDA = dat >> 7;”这句话,请高手解答一下!谢谢!!!!
; |6 t! Z* S5 n4 l2 O* S
% e/ u8 S" t" Wuchar I2C_SendByte(uchar dat, uchar ack)
- I5 u! i: N$ E{
! u4 A4 Y# ` p. m$ m0 ~( c uchar a = 0,b = 0;//最大255,一个机器周期为1us,最大延时255us。% \7 h# l3 J% C8 U& d
5 G' e4 w! Z' |0 i for(a=0; a<8; a++)//要发送8位,从最高位开始
& T& t7 M& P! t6 P1 m2 ^) B& C {3 C7 L- H: X0 L" E0 h
I2C_SDA = dat >> 7; //起始信号之后I2C_SCL=0,所以可以直接改变I2C_SDA信号- d# i& y; u; A) Y6 S2 C
dat = dat << 1;# N6 R5 s- D) |
I2C_Delay10us();
/ u& a$ w' q* w* e8 |4 w' E! x I2C_SCL = 1;/ t8 p$ t; ]) p n9 S$ Q3 q
I2C_Delay10us();//建立时间>4.7us
$ A! B+ w/ X" R7 j I2C_SCL = 0;1 V8 Z+ L* d q* m w* |: {1 H( m
I2C_Delay10us();//时间大于4us * Z; q! D0 I1 h# r
}
! F! ` \' E' z: K
: y+ N Y/ D' U/ ^$ m' \5 I/ @ I2C_SDA = 1;7 v) U, H1 x3 E) x( G& }
I2C_Delay10us();) U3 c$ s2 B9 h6 `4 P
I2C_SCL = 1;7 h1 J; y) m& o$ E" N# L9 w
while(I2C_SDA && (ack == 1))//等待应答,也就是等待从设备把I2C_SDA拉低
; Z& B" J8 R8 |1 e T0 S {8 q ^0 t- o% s5 A- T6 D& J# ]' ?
b++;( a0 ?. `" m1 P; ]- R
if(b > 200) //如果超过200us没有应答发送失败,或者为非应答,表示接收结束" C1 D3 I* p, _ w2 Y* a5 s
{
9 b$ u, Q1 t% i I2C_SCL = 0;
7 C( r5 S/ j& T# Y X I2C_Delay10us();
5 Q+ e( H Y( T$ v) k return 0;
( d$ k+ j3 U a. [! s1 }1 l }; j% f x9 ?, D `
}9 p1 [: w( o' C8 ^" T+ H- L( W
$ w" Z, U. n9 A9 \. t- o# H, S
I2C_SCL = 0;
. l6 Q/ d. @( _. P. u8 f+ I G I2C_Delay10us();& h6 ?3 }( @7 s! A0 L
return 1;
0 w# F5 }: M2 ?} |
|