OpenEdv-开源电子网

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

IIC等待应答信号到来的疑问

[复制链接]

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-12-6
在线时间
0 小时
发表于 2014-3-11 11:02:22 | 显示全部楼层 |阅读模式

//在AT24CXX指定地址读出一个数据
//ReadAddr:开始读数的地址 
//返回值  :读到的数据
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{     
 u8 temp=0;                         
    IIC_Start(); 
 if(EE_TYPE>AT24C16)
 {
  IIC_Send_Byte(0XA0);    //发送写命令
  IIC_Wait_Ack();
  IIC_Send_Byte(ReadAddr>>8);//发送高地址
  IIC_Wait_Ack();  
 }else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据  

 IIC_Wait_Ack();
    IIC_Send_Byte(ReadAddr%256);   //发送低地址
 IIC_Wait_Ack();    
 IIC_Start();       
 IIC_Send_Byte(0XA1);           //进入接收模式     
 IIC_Wait_Ack(); 
    temp=IIC_Read_Byte(0);    
    IIC_Stop();//产生一个停止条件    
 return temp;
}
这里的  IIC_Wait_Ack();定义如下:
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_Wait_Ack(void)
{
 u8 ucErrTime=0;
 SDA_IN();      //SDA设置为输入 主机是接收器,EEPROM为发送器
 IIC_SDA=1;delay_us(1);        //发送器
 IIC_SCL=1;delay_us(1);      
 while(READ_SDA)   //PB11--SD。 接收器为0,表示响应
 {
  ucErrTime++;
  if(ucErrTime>250) //2^7<250<2^8.即8位时间已过
  {
   IIC_Stop();
   return 1;
  }
 }
 IIC_SCL=0;//时钟输出0。清零。
 return 0; 
}
我的疑问是, IIC_Wait_Ack()返回0还是返回1,即应答成功还是不成功,AT24CXX_ReadOneByte()不都是往下执行,即发送数据地址吗?那这个应不应答,也没检测啊?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2014-3-11 11:23:44 | 显示全部楼层
返回1就会跳出while(READ_SDA)
博观而约取,厚积而薄发。
回复 支持 反对

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-12-6
在线时间
0 小时
 楼主| 发表于 2014-3-11 11:34:34 | 显示全部楼层
回复【2楼】745021926:
---------------------------------
retun不是跳出IIC_Wait_Ack()吗
回复 支持 反对

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2014-3-11 13:52:31 | 显示全部楼层
你仔细看下IIC的数据发送组合方式,无应答的时候主机会发一个终止信号。这就表示一次通信结束,后面的是另外一次通信。不需要阻塞等待应答
博观而约取,厚积而薄发。
回复 支持 反对

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-12-6
在线时间
0 小时
 楼主| 发表于 2014-3-11 22:25:24 | 显示全部楼层
回复【4楼】745021926:
--------------------------------
明白些了。不过上面说的return,是跳出IIC_Wait_Ack()而不是while把?
回复 支持 反对

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2014-3-11 22:27:33 | 显示全部楼层
恩  是的,我之前没看清,不好意思
博观而约取,厚积而薄发。
回复 支持 反对

使用道具 举报

8

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-12-6
在线时间
0 小时
 楼主| 发表于 2014-3-12 14:26:04 | 显示全部楼层
回复【6楼】745021926:
---------------------------------
嗯嗯,3Q~~~
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-11-7
在线时间
8 小时
发表于 2020-3-26 00:12:29 | 显示全部楼层
beifengabc 发表于 2014-3-11 22:25
回复【4楼】745021926:
--------------------------------
明白些了。不过上面说的return,是跳出IIC_Wait_ ...

函数只能有一个返回值,产生了返回值,函数就结束了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-23 15:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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