OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12414|回复: 6

原子哥 请教一个I2C的写字节读字节的问题!

[复制链接]

2

主题

4

帖子

0

精华

新手入门

积分
32
金钱
32
注册时间
2013-8-24
在线时间
0 小时
发表于 2013-8-24 23:22:48 | 显示全部楼层 |阅读模式
下面程序中两个函数里面的for循环语句中看得有点蒙,希望给个详细点的解释  不胜感激!
//写
 void IIC_Send_Byte(u8 txd)
{                       
    u8 t;  
 SDA_OUT();     
    IIC_SCL=0;//
    for(t=0;t<8;t++)
    {             
        //IIC_SDA=(txd&0x80)>>7;
  if((txd&0x80)>>7)
   IIC_SDA=1;
  else
   IIC_SDA=0;
  txd<<=1;   
  delay_us(2);   //
  IIC_SCL=1;
  delay_us(2);
  IIC_SCL=0; 
  delay_us(2);
    } 
}     
//读
u8 IIC_Read_Byte(unsigned char ack)
{
 unsigned char i,receive=0;
 SDA_IN();//   
 for(i=0;i<8;i++ )
 {
        IIC_SCL=0;
        delay_us(2);
  IIC_SCL=1;
        receive<<=1;
        if(READ_SDA)receive++;  
  delay_us(1);
    }     
    if (!ack)
        IIC_NAck();//   
 else
        IIC_Ack(); //  
    return receive;
}
牧狼人。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2013-8-24 23:34:27 | 显示全部楼层
这个你要根据具体的I2C协议来看,建议你对着时序图看。
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

头像被屏蔽

52

主题

440

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1237
金钱
1237
注册时间
2013-1-9
在线时间
151 小时
发表于 2013-8-25 01:37:15 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
32
金钱
32
注册时间
2013-8-24
在线时间
0 小时
 楼主| 发表于 2013-8-25 09:21:31 | 显示全部楼层
回复【3楼】hexboot:
---------------------------------
讲得好详细噢  终于解开了两天的结,非常感谢,另外,你想通的时候竟然在数9013?
牧狼人。。。
回复 支持 反对

使用道具 举报

头像被屏蔽

52

主题

440

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1237
金钱
1237
注册时间
2013-1-9
在线时间
151 小时
发表于 2013-8-25 10:51:22 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
32
金钱
32
注册时间
2013-8-24
在线时间
0 小时
 楼主| 发表于 2013-8-25 16:05:31 | 显示全部楼层
回复【5楼】hexboot:
---------------------------------
花了两天的时间 把I2C协议给弄清楚了  以后还望多多指教!
牧狼人。。。
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-8-27
在线时间
5 小时
发表于 2015-11-6 10:58:59 | 显示全部楼层
u8 IIC_Read_Byte(unsigned char ack)
 {
  unsigned char i,receive=0;---------------------举例说明吧: 初始的时候 receive 0000 0000 ,假设接受的数据(即SDA)SDA=0X81 (1000 0001)
  SDA_IN();//   ---------------------------SDA变成输入模式
 for(i=0;i<8;i++ )
  {
         IIC_SCL=0; ------------------以下是SCL动作,让芯片发SDA信号过来
        delay_us(2);
   IIC_SCL=1;
         receive<<=1;---------------------每一次循环接受变量左移1位, 0000 0000 <<1 还是0000 0000 ,共8次
                                                         
                                                    
         if(READ_SDA)receive++;   -------------如果SDA是高电平(从高位传数据),执receive++....... 第一次receive=0000 0001,第二次receive=0000 0010,第三次receive=0000 0100 ,第四次receive=0000 1000,第五次receive=0001 0000, 第六次receive=0010 0000,第七次receive=0100  0000,第八次receive加1,receive=1000 0001,                                            
   delay_us(1); 
     }      
     if (!ack)--------------------下面ACK什么的就自己datesheet了
        IIC_NAck();//   
  else
         IIC_Ack(); //  
     return receive;           返回receive即SDA的值
 }
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-17 18:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表