OpenEdv-开源电子网

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

sda设成上拉输入以后还执行SDA_H

[复制链接]

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2013-10-16
在线时间
0 小时
发表于 2014-1-2 10:47:57 | 显示全部楼层 |阅读模式
SDA没有接上拉电阻,但是配置成了上拉输入模式下,为什么还是执行SDA_H将SDA置高了呢,我的本意是让他释放SDA啊

static bool I2C_WaitAck(void)   
    u8 ucErrTime=0;
SDA_IN();
SCL_L;
   I2C_delay();
SDA_H;  //释放总线
    I2C_delay();
SCL_H;
    I2C_delay();
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
I2C_Stop();
       return FALSE;
}
    }
    SCL_L;
    return TRUE;  
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2014-1-2 11:39:24 | 显示全部楼层
SDA空闲状态就是高啊!SDA_H难道不是释放?
回复 支持 反对

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2013-10-16
在线时间
0 小时
 楼主| 发表于 2014-1-2 12:10:31 | 显示全部楼层
回复【2楼】hechao3225:
---------------------------------
执行完SDA_H后SDA被置高了,不是我希望的空闲状态,WHY
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-1-2 12:38:29 | 显示全部楼层
回复【3楼】小悦怡然:
---------------------------------
你贴出的是等待从器件的应答信号的代码,你还是详细的看下IIC协议里面各种状态下的书序要求吧,这样对照着看会比较好理解怎么回事
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2014-1-2 12:40:07 | 显示全部楼层
回复【3楼】小悦怡然:
---------------------------------
楼主你要明白IIC总线的空闲状态就是高电平,也就是你这里的SDA_H,所以把它置高就是我们说的释放,SDA被释放后就可以准备传输数据了,要1就置高,要0就拉低。
回复 支持 反对

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2013-10-16
在线时间
0 小时
 楼主| 发表于 2014-1-2 13:10:23 | 显示全部楼层
回复【5楼】hechao3225:
---------------------------------
SDA_H后,while(READ_SDA)里的READ_SDA就时钟是1,不是应答信号0
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2014-1-2 13:28:39 | 显示全部楼层
回复【6楼】小悦怡然:
---------------------------------
时钟肯定是1啊,时序里等待应答前就把时钟置高了啊,然后第九个时钟沿就等待应答,应答信号也是通过SDA传递的,应答有效就返回0,无效就1,最后再拉低时钟
回复 支持 反对

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2013-10-16
在线时间
0 小时
 楼主| 发表于 2014-1-2 13:34:32 | 显示全部楼层
回复【7楼】hechao3225:
---------------------------------
while(READ_SDA)里的READ_SDA是判断应答信号的,他就是高,没有应答信号。是否和硬件没接上拉电阻有关
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2014-1-2 13:40:41 | 显示全部楼层
回复【8楼】小悦怡然:
---------------------------------
你的意思是实际测试发现等待应答一直是高是吧?说明从机没反应啊,可能性很多,比如从机地址不对,从机没就位?GPIO内部有上下拉,而且你已经已经配置上拉输入了,这段应答代码貌似没问题,仿真看看
回复 支持 反对

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2013-10-16
在线时间
0 小时
 楼主| 发表于 2014-1-2 13:47:24 | 显示全部楼层
回复【9楼】hechao3225:
---------------------------------
有人说SDA,SCL必须接上拉电阻http://www.openedv.com/posts/list/12888.htm
回复 支持 反对

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2013-10-16
在线时间
0 小时
 楼主| 发表于 2014-1-2 13:52:12 | 显示全部楼层
回复【9楼】hechao3225:
---------------------------------
SDA_H;以后PB7的IDR和ODR中都为1了
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2014-1-2 13:54:33 | 显示全部楼层
回复【10楼】小悦怡然:
---------------------------------
我怎么没看到有人说必须接上拉,他是说配置内部上拉,你看看STM32的GPIO结构图,你配置成上拉输入的时候内部已经接上拉电阻了,还外接干嘛,一直IO模拟IIC,从未外接上拉电阻
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2014-1-2 14:00:41 | 显示全部楼层
回复【11楼】小悦怡然:
---------------------------------
我觉得楼主可能还是一个理解的问题, 你要注意你的每句代码都是从MCU的角度出发的,而从机那边的IIC接口由硬件控制, SDA_H之后,对MCU来说SDA就处于空闲状态了,这时由从机控制SDA返回MCU一个应答,不一定应答就要是SDA=0,如果SDA一直为高说明硬件上并没有接收到应答,也就是应答无效,这个时候应该检查为什么从机没应答,你这段代码没问题,但是不保证你模拟IIC的其它代码没问题,还有硬件上的问题,比如从机没就位?所以可以用J-Link仿真看看哪里的问题
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-16 20:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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