OpenEdv-开源电子网

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

紧急求助

[复制链接]

25

主题

82

帖子

0

精华

高级会员

Rank: 4

积分
520
金钱
520
注册时间
2018-8-15
在线时间
85 小时
发表于 2018-8-29 16:18:08 | 显示全部楼层 |阅读模式
u8 IIC_Wait_Ack(void)
{
        u8 ucErrTime=0;
        SDA_IN();      //SDA设置为输入  
        IIC_SDA=1;delay_us(1);          
        IIC_SCL=1;delay_us(1);         
        while(READ_SDA)
        {
                ucErrTime++;
                if(ucErrTime>250)
                {
                        IIC_Stop();
                        return 1;
                }
        }
        IIC_SCL=0;//时钟输出0           
        return 0;  
}
小弟有点疑惑,这是原子哥的IIC实验的程序,上面那个把SDA_IN()置成输入,下面又来一个IIC_SDA=1;变成输入之后不是只能读吗

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

使用道具 举报

2

主题

686

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
10912
金钱
10912
注册时间
2014-6-12
在线时间
1041 小时
发表于 2018-8-29 16:36:59 | 显示全部楼层
看看IIC的介绍,程序是在完成时序要求。
回复 支持 反对

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2018-8-29 17:16:12 | 显示全部楼层
IIC_Wait_Ack()实现的是从机的应答信号。设置SDA为输入,就可以用MCU检测SDA是否拉低,拉低的话表示从机发送一个应答信号回来
回复 支持 反对

使用道具 举报

25

主题

82

帖子

0

精华

高级会员

Rank: 4

积分
520
金钱
520
注册时间
2018-8-15
在线时间
85 小时
 楼主| 发表于 2018-8-29 17:24:11 | 显示全部楼层
peng1554 发表于 2018-8-29 17:16
IIC_Wait_Ack()实现的是从机的应答信号。设置SDA为输入,就可以用MCU检测SDA是否拉低,拉低的话表示从机 ...

这是先设置为输入,然后又给你赋值,设置成输入了,就没法赋值了啊
回复 支持 反对

使用道具 举报

25

主题

82

帖子

0

精华

高级会员

Rank: 4

积分
520
金钱
520
注册时间
2018-8-15
在线时间
85 小时
 楼主| 发表于 2018-8-29 17:27:16 | 显示全部楼层
xuyaqi 发表于 2018-8-29 16:36
看看IIC的介绍,程序是在完成时序要求。

只有设置成输出,才能赋值啊
回复 支持 反对

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2018-8-29 17:28:02 | 显示全部楼层
莫默 发表于 2018-8-29 17:24
这是先设置为输入,然后又给你赋值,设置成输入了,就没法赋值了啊

鬼啊 ,你好好看看应答时序,你再好好看看IIC_SDA=1是啥意思
回复 支持 反对

使用道具 举报

25

主题

82

帖子

0

精华

高级会员

Rank: 4

积分
520
金钱
520
注册时间
2018-8-15
在线时间
85 小时
 楼主| 发表于 2018-8-29 17:40:27 | 显示全部楼层
peng1554 发表于 2018-8-29 17:28
鬼啊 ,你好好看看应答时序,你再好好看看IIC_SDA=1是啥意思

IIC_SDA=1还能有啥意思,就是将SDA线拉高吗
回复 支持 反对

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2018-8-29 17:44:09 | 显示全部楼层
莫默 发表于 2018-8-29 17:40
IIC_SDA=1还能有啥意思,就是将SDA线拉高吗

看这个
4.JPG
回复 支持 反对

使用道具 举报

25

主题

82

帖子

0

精华

高级会员

Rank: 4

积分
520
金钱
520
注册时间
2018-8-15
在线时间
85 小时
 楼主| 发表于 2018-8-29 17:51:31 | 显示全部楼层

你这是配置寄存器啊
回复 支持 反对

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2018-8-29 18:01:57 | 显示全部楼层
莫默 发表于 2018-8-29 17:51
你这是配置寄存器啊

醉了,你仔细看看表格 ODR寄存器为1的时候是上拉输入,你说IIC_SDA=1与SDA_IN()冲突不、再者从机发来的应答信号MCU不接受那MCU怎么接收应答信号?  这个函数是要接收从机发的应答信号!!
回复 支持 反对

使用道具 举报

25

主题

82

帖子

0

精华

高级会员

Rank: 4

积分
520
金钱
520
注册时间
2018-8-15
在线时间
85 小时
 楼主| 发表于 2018-8-30 08:49:27 | 显示全部楼层
peng1554 发表于 2018-8-29 18:01
醉了,你仔细看看表格 ODR寄存器为1的时候是上拉输入,你说IIC_SDA=1与SDA_IN()冲突不、再者从机发来的应 ...

我也醉了,赋值只有在IO口为输出的情况下才能赋值,既然已经配置为输入口,就不能赋值了
回复 支持 反对

使用道具 举报

6

主题

315

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1669
金钱
1669
注册时间
2018-1-29
在线时间
160 小时
发表于 2018-8-30 09:19:55 | 显示全部楼层
"配置为输入口,就不能赋值了" 这句话是错的.
慢慢纠结吧!
回复 支持 反对

使用道具 举报

37

主题

204

帖子

0

精华

高级会员

Rank: 4

积分
717
金钱
717
注册时间
2016-6-10
在线时间
191 小时
发表于 2018-8-30 11:27:03 | 显示全部楼层
原子哥写错了,哈哈。把那两句注释掉,看能不能用。按照你的想法改改试试呗
回复 支持 反对

使用道具 举报

9

主题

165

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
251
金钱
251
注册时间
2018-4-6
在线时间
31 小时
发表于 2018-8-30 16:52:55 | 显示全部楼层
路过路过,,,
回复 支持 反对

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2018-8-30 18:12:21 | 显示全部楼层
不要纠结,根据不同的单片机,你可以在头文件重新定义这些。这个iic时序不是单单针对stm,也可以给其它单片机用,有的单片机没有输入,输出配置的,例如stc,就是自己在头文件里面去修改。这里就是释放sda总线,等待应答的意思,标准的iic就是这样子写
回复 支持 反对

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2018-8-30 20:12:27 | 显示全部楼层
8楼的图片已经很清楚了。输入分上拉输入、下拉输入……。ODR寄存器为1的时候是上拉输入。你需要先看看ODR寄存器是什么意思,IIC_SDA=1控制的是哪个寄存器。用库就这点不好处,底层寄存器你根本就不知道
我有故事,你有酒吗
回复 支持 反对

使用道具 举报

8

主题

571

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2922
金钱
2922
注册时间
2016-5-13
在线时间
185 小时
发表于 2018-8-31 09:10:49 | 显示全部楼层
读之前不是都要设置上拉的么。
回复 支持 反对

使用道具 举报

25

主题

82

帖子

0

精华

高级会员

Rank: 4

积分
520
金钱
520
注册时间
2018-8-15
在线时间
85 小时
 楼主| 发表于 2018-8-31 16:25:21 | 显示全部楼层
hgr211 发表于 2018-8-30 18:12
不要纠结,根据不同的单片机,你可以在头文件重新定义这些。这个iic时序不是单单针对stm,也可以给其它单片 ...

就比如说51的单片机,你将IO置1也只能表示该口输出高啊,将其当做输入时也是需要检测该口的电平啊
回复 支持 反对

使用道具 举报

25

主题

82

帖子

0

精华

高级会员

Rank: 4

积分
520
金钱
520
注册时间
2018-8-15
在线时间
85 小时
 楼主| 发表于 2018-8-31 16:27:08 | 显示全部楼层
来俩不甜的 发表于 2018-8-30 20:12
8楼的图片已经很清楚了。输入分上拉输入、下拉输入……。ODR寄存器为1的时候是上拉输入。你需要先看看ODR寄 ...

你说的对,ODR寄存器为1表示上拉输入啊,表示为输入了怎么还能将电平置高呢
回复 支持 反对

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2018-9-1 17:02:44 | 显示全部楼层
莫默 发表于 2018-8-31 16:27
你说的对,ODR寄存器为1表示上拉输入啊,表示为输入了怎么还能将电平置高呢

上拉输入,外围电路什么都不接,可不就是高电平吗。再说输入引脚,ODR已经不是控制引脚输出了,它用来控制输入是上拉,还是下拉
我有故事,你有酒吗
回复 支持 反对

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2018-9-3 10:32:50 | 显示全部楼层
真是个杠精啊,一个io的状态,你可以看着芯片内部输出与芯片外部输入的&关系。内部配置了高,io的状态就是外部输入电平的来决定了了。人家程序这么写,就是这个意思,不同的单片机表达方式,配置有一些差别。你以为mcu配置了输出,io状态就一定不能读了,配置了输入就一定不能写了?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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