OpenEdv-开源电子网

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

IIC通信等待ACK的时序问题

[复制链接]

3

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2018-7-27
在线时间
9 小时
发表于 2018-8-27 17:19:13 | 显示全部楼层 |阅读模式
5金钱
TIM截图20180827170825.jpg
程序中IIC_SCL拉高之后,如果IIC_SDA再变的话就成了起始信号或终止信号了吧,但是图中while()循环却通过检测IIC_SDA的状态来判断是应答还是非应答,这怎么解释?

最佳答案

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

起始信号和结束信号[/backcolor]要先有sda线输出才行, READ_SDA置1,就一直产生停止信号,接收应答失败 置0的话,产生IIC_SCL=0,接收应答成功
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-8-27 17:19:14 | 显示全部楼层
本帖最后由 1208 于 2018-8-27 21:36 编辑

起始信号和结束信号要先有sda线输出才行,
READ_SDA置1,就一直产生停止信号,接收应答失败
置0的话,产生IIC_SCL=0,接收应答成功

业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

3

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2018-7-27
在线时间
9 小时
 楼主| 发表于 2018-8-27 17:26:39 | 显示全部楼层
问题补充:如果IIC_SDA的状态是在IIC_SCL拉高之前变的,那么下面只需用一个if()语句来判断是应答还是非应答就行了吧,即判断应答而不是等待应答
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-8-27 21:51:33 | 显示全部楼层
灰虫子 发表于 2018-8-27 17:26
问题补充:如果IIC_SDA的状态是在IIC_SCL拉高之前变的,那么下面只需用一个if()语句来判断是应答还是非应 ...

你这样做就不方便后面数据的读取,如读1个字节,ack=1时,发送ACK,ack=0,发送nACK
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

3

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2018-7-27
在线时间
9 小时
 楼主| 发表于 2018-8-28 10:03:40 | 显示全部楼层
1208 发表于 2018-8-27 18:14
起始信号和结束信号要先有sda线输出才行,
READ_SDA置1,就一直产生停止信号,接收应答失败
...

明白了,起始信号和终值信号只能由主机来产生呀,多谢你的帮助
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-8-28 11:57:06 | 显示全部楼层
灰虫子 发表于 2018-8-28 10:03
明白了,起始信号和终值信号只能由主机来产生呀,多谢你的帮助

嗯嗯!互帮互助
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

6

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2018-8-23
在线时间
12 小时
发表于 2018-10-17 21:34:26 | 显示全部楼层
灰虫子 发表于 2018-8-28 10:03
明白了,起始信号和终值信号只能由主机来产生呀,多谢你的帮助

楼主,我也有这个疑惑,你明白这个解释了吗,我怎么还是感觉是你问题里描述的,SCL=1的情况下,如果SDA发生变化,那不是相当于起始信号和结束信号了吗
回复

使用道具 举报

6

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2018-8-23
在线时间
12 小时
发表于 2018-10-17 21:35:57 | 显示全部楼层
1208 发表于 2018-8-27 17:19
起始信号和结束信号要先有sda线输出才行,
READ_SDA置1,就一直产生停止信号,接收应答失败
...

大神,借着楼主的帖子顺便问你一个问题,也是这段代码里的,代码中SDA_IN()把IO口设置成了输入模式了,为什么下边紧接着还能用IIC_SDA=1把SDA拉高呢,这块不是很能理解
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-10-18 11:03:08 | 显示全部楼层
GAOSIY 发表于 2018-10-17 21:35
大神,借着楼主的帖子顺便问你一个问题,也是这段代码里的,代码中SDA_IN()把IO口设置成了输入模式了,为 ...

这个等待应答是先将SDA设置为输入,IIC_SDA=1和IIC_SCL=1都要置高,是为了发送完数据,再将时钟线IIC_SCL再置低
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

6

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2018-8-23
在线时间
12 小时
发表于 2018-10-18 11:09:38 | 显示全部楼层
1208 发表于 2018-10-18 11:03
这个等待应答是先将SDA设置为输入,IIC_SDA=1和IIC_SCL=1都要置高,是为了发送完数据,再将时钟线IIC_SCL ...

其实我不明白的是IO口已经被定义为输入模式了,怎么又去输出高电平了,这个不矛盾吗,一个IO口可以同时作为输入和输出使用吗?
回复

使用道具 举报

8

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2018-1-31
在线时间
49 小时
发表于 2018-10-18 18:54:04 | 显示全部楼层
1208 发表于 2018-8-27 17:19
起始信号和结束信号要先有sda线输出才行,
READ_SDA置1,就一直产生停止信号,接收应答失败
...

你好,我发的一个帖子 我自己的回复被你设置了最佳回复,你是不是弄错了,还有我的问题还没有得到回复呢,这个问题我还没弄明白!!!
http://www.openedv.com/forum.php?mod=viewthread&tid=280966
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-10-19 09:51:50 | 显示全部楼层
xiao19344859 发表于 2018-10-18 18:54
你好,我发的一个帖子 我自己的回复被你设置了最佳回复,你是不是弄错了,还有我的问题还没有得到回复呢 ...

已回复
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-11-9 18:06:38 | 显示全部楼层
GAOSIY 发表于 2018-10-18 11:09
其实我不明白的是IO口已经被定义为输入模式了,怎么又去输出高电平了,这个不矛盾吗,一个IO口可以同时作 ...

上拉输入就是处于高电平状态,也就是空闲状态
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2018-12-1
在线时间
0 小时
发表于 2018-12-1 14:09:07 | 显示全部楼层
本帖最后由 浅忧 于 2018-12-1 14:15 编辑
1208 发表于 2018-11-9 18:06
上拉输入就是处于高电平状态,也就是空闲状态

你好,请问for循环是为了避免从机的应答信号处于亚稳态采用的么?
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-12-1 16:04:32 | 显示全部楼层
浅忧 发表于 2018-12-1 14:09
你好,请问for循环是为了避免从机的应答信号处于亚稳态采用的么?

一般是稳定,准备好信号
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2018-12-1
在线时间
40 小时
发表于 2018-12-1 22:09:29 | 显示全部楼层
本帖最后由 alun2102 于 2018-12-1 22:32 编辑
1208 发表于 2018-12-1 16:04
一般是稳定,准备好信号

你好,请问这样理解对不对:从器件在应答时钟周期的低电平期间(SCL=1之前)已经收到SDA线变为输入模式(SDA_IN)且已经释放(SDA=1),此时必须拉低SDA线(第一个延时函数期间),作为有效的应答信号,然后应答时钟周期的上升沿来临(SCL=1),在for循环处检测应答信号的持续时间是否符合IIC协议,然后应答时钟结束(SCL=0)。
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-12-3 09:48:22 | 显示全部楼层
此时必须拉低SCL线,等待SCL上升沿得到来,符合。
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

37

主题

212

帖子

0

精华

高级会员

Rank: 4

积分
900
金钱
900
注册时间
2019-6-6
在线时间
100 小时
发表于 2019-8-9 19:17:54 | 显示全部楼层
1208 发表于 2018-12-3 09:48
此时必须拉低SCL线,等待SCL上升沿得到来,符合。

借楼问个问题,时间有点久远了,但是还是抱有你可以看到的希望。如楼主的图,已经设置为输入状态了,再把sda输出1有用吗?接口已经是输入状态了啊
不会就要俯身倾耳以请啊,博客地址:https://blog.csdn.net/qq_39521541?spm=1001.2101.3001.5343
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-15 22:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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