OpenEdv-开源电子网

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

u8 IIC_Wait_Ack(void)的while(READ_SDA) 问题

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2020-3-14
在线时间
6 小时
发表于 2020-3-14 21:45:32 | 显示全部楼层 |阅读模式
1金钱



根据IIC协议,应答的电平应该在第9个时钟的上升沿之前就要稳定。
while(READ_SDA)            // 如果是while循环中,SDA电平变低,那么和时序对不上了,变成stop信号了???

//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_Wait_Ack(void)
{
        u8 ucErrTime=0;
        SDA_IN();      //SDA设置为输入  
        IIC_SDA=1;                   //SDA电平为高
        delay_us(1);                   // 这1us SDA电平发生变化了么???
        IIC_SCL=1;delay_us(1);           // 时钟上升沿,SDA电平为高
        while(READ_SDA)            // 如果是while循环中,SDA电平变低,那么和时序对不上了,变成stop信号了???
        {                                 // 或者说只有在SCK变高之前,SDA电平已经稳定为低或高,函数才正确。
                ucErrTime++;
                if(ucErrTime>250)
                {
                        IIC_Stop();
                        return 1;
                }
        }
        IIC_SCL=0;//时钟输出0           
        return 0;  
}

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

使用道具 举报

4

主题

82

帖子

0

精华

高级会员

Rank: 4

积分
747
金钱
747
注册时间
2018-9-1
在线时间
177 小时
发表于 2020-3-14 22:44:53 | 显示全部楼层
1、
IIC_SDA=1;                   //SDA电平为高
delay_us(1);                   // 这1us SDA电平发生变化了么???

此时主机读取SDA,从机需写SDA。这1us就是等待从机响应:
从机回复ACK就应该在此延时时间内拉低SDA,否则就是NCK。  

2、
while(READ_SDA)            // 如果是while循环中,SDA电平变低,那么和时序对不上了,变成stop信号了???
        {                                 // 或者说只有在SCK变高之前,SDA电平已经稳定为低或高,函数才正确。  

while判断时,即使SDA拉低也不是stop,stop是上升沿。
另外,信号方向:主机产生start和stop给从机,因此即使此刻从机产生了异常信号,主机并不关心它是start还是stop,只有从机关心这两个信号。
循环判断没啥无意义,已经不满足接口协议了,就像你说的,从机应该在SCL上升沿之前写好SDA 。
uevip#126.com
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-3-15 00:47:52 | 显示全部楼层
sda在读取ACK的时候, 已经切换成输入模式了, 这个时候,sda的状态由从机控制。然后在SCL的高电平期间读取 sda,没问题啊
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2020-3-14
在线时间
6 小时
 楼主| 发表于 2020-3-15 09:30:51 | 显示全部楼层
谢谢原子哥回复。

我的意思是在SCK变为高电平之前,从机设置的SDA状态应该是已经确定的了。
如果在while(READ_SDA)的过程中SDA由高变为低,这不就是START信号了么?

也是因为这个原因,所以不理解这个while循环的作用,感觉加个delay再判断就状态就可以了吧

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-3-16 00:30:08 | 显示全部楼层
sanshaoye 发表于 2020-3-15 09:30
谢谢原子哥回复。

我的意思是在SCK变为高电平之前,从机设置的SDA状态应该是已经确定的了。

delay也许可以,不过while可以死等低电平的到来。
不会漏检。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2020-3-14
在线时间
6 小时
 楼主| 发表于 2020-3-17 19:21:00 | 显示全部楼层
SCK高电平期间,SDA由高电平->低电平,不会和STOP信号混淆吗???

时序图标识的是,电平稳定在SCK由低电平->高电平之前呀

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-3-18 01:09:03 | 显示全部楼层
sanshaoye 发表于 2020-3-17 19:21
SCK高电平期间,SDA由高电平->低电平,不会和STOP信号混淆吗???

时序图标识的是,电平稳定在SCK由低 ...

不会
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2020-3-14
在线时间
6 小时
 楼主| 发表于 2020-3-18 11:40:03 | 显示全部楼层
是因为主设备知道这个SDA不是它发出的么?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-3-19 00:58:20 | 显示全部楼层
sanshaoye 发表于 2020-3-18 11:40
是因为主设备知道这个SDA不是它发出的么?

这。。。
主机这个时候都已经进入接收状态了,SDA上的所有数据都是从机发的。
所以只要是拉低,,百分百是从机ack。
停止信号不会由从机发出。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-3 18:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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