OpenEdv-开源电子网

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

关于STM32 IIC应答线号时序问题

[复制链接]

2

主题

6

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2016-9-4
在线时间
6 小时
发表于 2016-9-4 13:44:52 | 显示全部楼层 |阅读模式
3金钱
    新手可能提出的问题有点弱智,但是就是搞不明白,求大神不吝赐教,拜谢!问题如下  
//这是原子的程序
u8 IIC_Wait_Ack(void)
{
        u8 ucErrTime=0;
        SDA_IN();      //SDA设置为输入  //问题1   此处将GPIO口设置为输入模式,但下一局IIC_SDA=1,却明明是输出语句,这两句不矛盾吗?
        IIC_SDA=1;delay_us(1);                //问题2   在i2c时序图中可以看到,从机的应答信号应该在第九个时钟脉冲的低电平器件,将SDA拉低,并且在SCL高电平期间保持稳定
        IIC_SCL=1;delay_us(1);              //       低电平才是一个完整的应答线号,可是程序里直接将SCL拉高,之后在检测SDA有没有被从机拉低,这样超时检测处理不就没意思        while(READ_SDA)
        {
                ucErrTime++;
                if(ucErrTime>250)
                {
                        IIC_Stop();
                        return 1;
                }
        }
        IIC_SCL=0;//时钟输出0           
        return 0;  
}
//产生ACK应答


这是网上关于应答信号的概述

I2C总线上的所有数据都是以8位字节传送的,发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。 应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。 对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。 如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送,并释放SDA线,以便主控接收器发送一个停止信号P。


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

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-9-4 21:59:09 | 显示全部楼层
第九个时钟就是接收应答信号的,在SCL为高电平的时候,SDA的电平有效,SDA高电平NACK,低电平为ACK
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-9-5 08:33:30 | 显示全部楼层

当I2C想读数据时应该写成IN,但这个IN好像写早了几句话。
这个问题一有人懂吗,回答时麻烦@我一下。
自在随心
回复

使用道具 举报

6

主题

110

帖子

0

精华

高级会员

Rank: 4

积分
553
金钱
553
注册时间
2014-10-23
在线时间
195 小时
发表于 2016-9-5 09:00:37 | 显示全部楼层
问题一:输入模式时,IIC_SDA=1 (也就是PBout(7) = 1),是设置上拉的意思。
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2016-9-4
在线时间
6 小时
 楼主| 发表于 2016-9-5 14:28:28 | 显示全部楼层
八度空间 发表于 2016-9-4 21:59
第九个时钟就是接收应答信号的,在SCL为高电平的时候,SDA的电平有效,SDA高电平NACK,低电平为ACK

这个我知道
第九个时钟的低电平的时候,从机若响应就SDA拉低,也就是说第九个时钟高电平的时候,若从机响应了肯定是低电平,若从机未响应程序中做超时检测也没用(I2C协议规定,在SCL高电平的时候,SDA应该是稳定的,不能变化的)
回复

使用道具 举报

0

主题

4

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5836
金钱
5836
注册时间
2019-8-17
在线时间
403 小时
发表于 2019-8-18 22:08:55 | 显示全部楼层
请问楼主理解了没有?我也有这个疑问
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2019-8-23
在线时间
1 小时
发表于 2019-8-23 13:44:46 | 显示全部楼层
yuzeyuan1 发表于 2016-9-5 08:33

当I2C想读数据时应该写成IN,但这个IN好像写早了几句话。
这个问题一有人懂吗,回答时麻烦@我一下。

现在理解了吗,我也觉得写早了,SDA_IN写的这时候就是从机控制了,为什么时钟线还能拉高拉低
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 05:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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