OpenEdv-开源电子网

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

IIC程序,等待应答

[复制链接]

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2015-10-23
在线时间
8 小时
发表于 2015-11-25 12:34:21 | 显示全部楼层 |阅读模式
5金钱
px; -webkit-text-size-adjust: auto; -w//等待应答信号到来
//返回值: 1,接收应答失败
// 0,接收应答成功
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN(); //SDA 设置为输入
IIC_SDA=1;delay_us(1);
IIC_SCL=1;delay_us(1);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;//时钟输出 0
return 0;
}


请问原子哥,这个250的数字是怎么来的?实在分析不出来这个程序的意思

最佳答案

查看完整内容[请看2#楼]

自己设定的。你可以修改成其他的~。这里加上超时等待,是为了程序的稳定性。 打个比方,就好比约了地点等人。你等他等了30分钟,人不来你就走人了。这里的30分钟就是跟程序里的超时一样。 你没有时间限制的,你就从早等到晚,做不了其他事情。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
373
金钱
373
注册时间
2015-3-7
在线时间
43 小时
发表于 2015-11-25 12:34:22 | 显示全部楼层
自己设定的。你可以修改成其他的~。这里加上超时等待,是为了程序的稳定性。
打个比方,就好比约了地点等人。你等他等了30分钟,人不来你就走人了。这里的30分钟就是跟程序里的超时一样。
你没有时间限制的,你就从早等到晚,做不了其他事情。
为人莫作千年计,三十河东四十西,莫欺少年穷。
回复

使用道具 举报

3

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
373
金钱
373
注册时间
2015-3-7
在线时间
43 小时
发表于 2015-11-25 12:39:22 | 显示全部楼层
读取SDA端口上的应答时间,如果超过250响应时间,就判断为接收应答失败。如果不加ucErrTime>250判断的,就一直会在while里等待了。
为人莫作千年计,三十河东四十西,莫欺少年穷。
回复

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2015-10-23
在线时间
8 小时
 楼主| 发表于 2015-11-25 14:07:19 | 显示全部楼层
回复【2楼】Mcu_learning:
---------------------------------
那这个250的时间值是我们自己设定的嘛?有没有什么来源出处的?可以换一个其他的数字不?
回复

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2015-10-23
在线时间
8 小时
 楼主| 发表于 2015-11-27 10:38:23 | 显示全部楼层
回复【4楼】Mcu_learning:
---------------------------------
嗯嗯,我在理解下,谢谢你
回复

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2016-4-1
在线时间
5 小时
发表于 2017-1-6 09:48:04 | 显示全部楼层
这里先把IIC_SCL=1和IIC_SDA=1,再去等待SDA从1变为0。这不就是在SCL为高的时候SDA跳变了么?为什么这里可以这样设置而不认为是起始信号呢?
回复

使用道具 举报

5

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
440
金钱
440
注册时间
2016-11-7
在线时间
63 小时
发表于 2017-1-8 21:33:33 | 显示全部楼层
IIC_Send_Byte(WriteAddr%256);   //发送低地址  是不是注释错了 应该是发送高地址吧??
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-4-29
在线时间
12 小时
发表于 2017-1-12 09:19:28 | 显示全部楼层
lihilong 发表于 2017-1-8 21:33
IIC_Send_Byte(WriteAddr%256);   //发送低地址  是不是注释错了 应该是发送高地址吧??

请问你搞懂IIC的程序了吗
回复

使用道具 举报

5

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
440
金钱
440
注册时间
2016-11-7
在线时间
63 小时
发表于 2017-1-12 20:59:57 | 显示全部楼层
djt_dream 发表于 2017-1-12 09:19
请问你搞懂IIC的程序了吗

之前光纠结于每句语句的含义了,没有从器件入手,协议已经基本搞懂了
回复

使用道具 举报

23

主题

323

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
金钱
1010
注册时间
2016-11-8
在线时间
233 小时
发表于 2017-1-13 08:48:50 | 显示全部楼层
liuwei598 发表于 2017-1-6 09:48
这里先把IIC_SCL=1和IIC_SDA=1,再去等待SDA从1变为0。这不就是在SCL为高的时候SDA跳变了么?为什么这里可以 ...

虽然都是IIC_SDA由高变低,但是应答信号时,SDA线是输入状态,停止是输出~~
亦余心之所善,
虽九死其犹未悔。
回复

使用道具 举报

6

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
341
金钱
341
注册时间
2015-9-22
在线时间
32 小时
发表于 2017-1-13 13:54:09 | 显示全部楼层
应该有更专业更详细的一份说明就好了
嵌入式开发微信公众号:嵌入式STM32软硬件开发
STM32交流,加好友,Q707372788
STM32交流群:383260480
回复

使用道具 举报

6

主题

12

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2016-11-17
在线时间
4 小时
发表于 2017-4-14 17:28:54 | 显示全部楼层
原子哥,从E2PROM接收信息的时候不应该是STM32给发一个应答信号吗?为啥是STM32接收应答了?他接受的是E2PROM的应答吗?
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2017-7-16
在线时间
3 小时
发表于 2018-3-25 13:22:10 | 显示全部楼层
liuwei598 发表于 2017-1-6 09:48
这里先把IIC_SCL=1和IIC_SDA=1,再去等待SDA从1变为0。这不就是在SCL为高的时候SDA跳变了么?为什么这里可以 ...

你的理解是对,原子哥者的代码有问题的
应该写成这样:
        u8 ucErrTime=0;
        SDA_IN();      
        IIC_SDA=1;
        delay_us(1);          
        IIC_SCL=0;
        delay_us(1);         
        while(READ_SDA)
        {
                ucErrTime++;
                if(ucErrTime>250)
                {
                        IIC_Stop();
                        return 1;
                }
        }
        IIC_SCL=1;
        delay_us(4);
        IIC_SCL=0;       
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2019-8-13
在线时间
11 小时
发表于 2019-8-27 14:18:36 | 显示全部楼层
hannimao 发表于 2018-3-25 13:22
**** 作者被禁止或删除 内容自动屏蔽 ****

我有个疑问点就是,既然都配置成输入IO了,此处为何还要操作IIC_SDA=1呢,然而我若在SDA_IN()前面操作的话,程序又会出问题!
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2019-8-13
在线时间
11 小时
发表于 2019-8-27 14:24:22 | 显示全部楼层
hannimao 发表于 2018-3-25 13:22
**** 作者被禁止或删除 内容自动屏蔽 ****

而且,我这边验证了你的代码,是错误的!
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2020-5-9
在线时间
1 小时
发表于 2020-5-12 10:08:01 | 显示全部楼层
陈运de 发表于 2019-8-27 14:18
我有个疑问点就是,既然都配置成输入IO了,此处为何还要操作IIC_SDA=1呢,然而我若在SDA_ ...

我也有这个疑问,请问你解决了吗?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-29 17:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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