EDA365电子论坛网

标题: 关于I2C读写问题 [打印本页]

作者: haha_key    时间: 2014-7-24 20:01
标题: 关于I2C读写问题
下面是一个I2C写函数,但是始终不能理解这个函数里面的“I2C_SDA = dat >> 7;”这句话,请高手解答一下!谢谢!!!!
) h1 y5 ?; v# D/ X. y/ l5 K3 X! Y- ^
* z% j/ u$ c% l, C, ~uchar I2C_SendByte(uchar dat, uchar ack)3 w: Q4 K) E  ?% s8 G3 t: Z
{
& z0 m. f6 A3 Z/ L; g, ]5 Z        uchar a = 0,b = 0;//最大255,一个机器周期为1us,最大延时255us。  p% x. }. X+ f* e* j) D
                        & y2 z( ?: N: ^( G$ t6 I0 ?! h4 x
        for(a=0; a<8; a++)//要发送8位,从最高位开始
5 @8 |* o/ r- q4 \; s        {; i$ R- H! Y& G/ ?) [
                I2C_SDA = dat >> 7;         //起始信号之后I2C_SCL=0,所以可以直接改变I2C_SDA信号
# a2 D% N8 `+ e6 J% O1 z% r, l/ ^                dat = dat << 1;
. L8 B! V  k. Z- M! m+ @                I2C_Delay10us();# Y, u5 m- h/ q
                I2C_SCL = 1;
8 _. T1 }; `8 V1 M$ D$ p) E                I2C_Delay10us();//建立时间>4.7us5 |: Y9 N. O. q' E3 T' [
                I2C_SCL = 0;
$ J! y% q# s3 x+ n/ y6 ~                I2C_Delay10us();//时间大于4us               
' T1 H% o* X+ w1 Q+ o        }: a, S- h1 R: [- |6 P: B& K7 P
9 [8 B& K. l& g( U' t  C( G* T
        I2C_SDA = 1;
5 w9 r: N9 r5 [% O( j0 m        I2C_Delay10us();
0 y# Y2 O* y8 U, V9 l4 v        I2C_SCL = 1;4 ]+ }& |6 m9 G8 ]) p0 l+ j
        while(I2C_SDA && (ack == 1))//等待应答,也就是等待从设备把I2C_SDA拉低
% e% W. r2 w5 e: ]        {5 t  E3 G5 I6 f) u4 M
                b++;; E' U- B/ _/ v& d
                if(b > 200)         //如果超过200us没有应答发送失败,或者为非应答,表示接收结束
7 o5 ^+ j7 I) U9 `                {
& l0 W9 h. p& K3 k                        I2C_SCL = 0;
9 o/ ^. s3 M9 m! c! b                        I2C_Delay10us();. q* R: e+ [7 y) B( |3 F
                        return 0;
0 B0 [, p* A; i& N) G                }
* f) {/ u7 G* t        }; p- i2 s; X4 f+ \2 B

" u$ ]2 Z( U3 f9 h2 P4 P: g* B4 n        I2C_SCL = 0;
9 |6 p$ Y" Z9 @        I2C_Delay10us();
9 w6 x0 H8 |& U7 o3 t. f: \+ y         return 1;               
+ a& ~0 ^$ |8 {6 f- y6 j# F8 f6 X}




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2