OpenEdv-开源电子网

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

关于I2C的应答信号,钻牛角尖了,求高手解答

[复制链接]

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2016-5-29
在线时间
19 小时
发表于 2016-10-9 21:21:28 | 显示全部楼层 |阅读模式
1金钱
u8 I2C_Wait_ACK(void)
{
               
                u16 errtime=1;
                 SDA_IN()
                 IIC_SDA=1;
                 IIC_SCL=1;
                while(READ_SDA)
                {
                        errtime++;
                        if(errtime>250)
                        {
                                I2C_Stop();
                                return 1;
                        }
                }
                IIC_SCL=0;
                printf("errtime=%d\r\n",errtime);
                return 0;
}
上面这样写,一点问题都没有但是这样写,就不好使了
u8 I2C_Wait_ACK(void)
{
               
                u16 errtime=1;
                 SDA_OUT()
                 IIC_SDA=1;     这里我先让SDA输出1,等到第9个上升沿的时候,24C02会把SDA拉低,然后把IO口变成SDA_IN() 转为接收方式,为什么时序就错了呢??想了好久好久也没想明白
                 IIC_SCL=1;
                 SDA_IN()
                while(READ_SDA)
                {
                        errtime++;
                        if(errtime>250)
                        {
                                I2C_Stop();
                                return 1;
                        }
                }
                IIC_SCL=0;
                printf("errtime=%d\r\n",errtime);
                return 0;
}

最佳答案

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

谢谢各位的指点,通过抓捕波形,已经彻底明白IC2的应答机制,首先在第9个时钟的上升沿之前,从机会拉低SDA,以确认接收到数据,然后在第9个时钟的下降沿,从设备会发送一个高脉冲,来确认已释放总线。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2016-5-29
在线时间
19 小时
 楼主| 发表于 2016-10-9 21:21:29 | 显示全部楼层
谢谢各位的指点,通过抓捕波形,已经彻底明白IC2的应答机制,首先在第9个时钟的上升沿之前,从机会拉低SDA,以确认接收到数据,然后在第9个时钟的下降沿,从设备会发送一个高脉冲,来确认已释放总线。
回复

使用道具 举报

47

主题

212

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
金钱
292
注册时间
2016-1-2
在线时间
80 小时
发表于 2016-10-9 23:37:56 | 显示全部楼层
软件仿真 看一下逻辑时序图
原子教程前面有教程  
回复

使用道具 举报

2

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
206
金钱
206
注册时间
2016-7-26
在线时间
33 小时
发表于 2016-10-10 08:48:43 | 显示全部楼层
为什么要输出高呢?你等待从机将SDA拉低也应该是输入高吧!你这样的操作时序相当于给从机发送不应答信号。你仔细看下非应答信号的时序。
回复

使用道具 举报

10

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2015-12-19
在线时间
99 小时
发表于 2016-10-10 10:03:37 | 显示全部楼层
抓一下波形吧   会一目了然  感觉你这个高低位  不太对
回复

使用道具 举报

44

主题

298

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
209
金钱
209
注册时间
2016-9-9
在线时间
84 小时
发表于 2016-10-10 17:54:25 | 显示全部楼层
15904520807 发表于 2016-10-10 13:47
谢谢各位的指点,通过抓捕波形,已经彻底明白IC2的应答机制,首先在第9个时钟的上升沿之前,从机会拉低SDA ...

也就是说,这信号是从机给的,不是自己先置的,所以导致的不好用吗?
回复

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2016-5-29
在线时间
19 小时
 楼主| 发表于 2016-10-24 19:11:54 | 显示全部楼层
本帖最后由 15904520807 于 2016-10-24 19:14 编辑
dreamARM 发表于 2016-10-10 17:54
也就是说,这信号是从机给的,不是自己先置的,所以导致的不好用吗?

IMG_0766.JPG
这是我的抓的波形,我的问题就是出现在了那个红色SDA 第9时钟下降沿小小的脉冲,经测试,没有这个小小的高电平,以后的逻辑就错了
所以SCL如果设置输出高,那么从设备,拉不低,我估计是这样的,单片机输出的电流强度太高,在从机的下拉电阻上产生电压,所以应答失败
如果SCL设置输出低,那么第9时钟的下降沿,这个小脉冲将不复存在,所以应答失败,用输入模式的上拉,IO引脚不会输出强电流,所以从设备可以
顺利的拉对拉高还有好多错误的波形,我就不放出来了,免的大家看不懂,大概就是这个意思

起始只要你能模拟出这个波形,你等不等应答无所谓,以后数据从机照样接收,我亲自测试过的了
回复

使用道具 举报

0

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2014-8-23
在线时间
10 小时
发表于 2016-10-28 10:55:09 | 显示全部楼层
I2C总线,两根线都应该是带上拉的,当主机、从机都不控制时,就应该是被上拉拉高,第9个时钟主机不用刻意去拉高,只需要放开控制就行了的。
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2016-6-6
在线时间
2 小时
发表于 2016-12-9 16:36:32 | 显示全部楼层
原子的MYII2程序,写了SDA和SCL两总线的状态。当然工作时有输入输出态,但这个实在主从机的程序中根据时序逻辑写的。
你所提到的SDA_IN() 和SDA_OUT()变化,在另一段有主从状态的程序中可以看到。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-29 05:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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