OpenEdv-开源电子网

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

单个I/O既做输入口又做输出口使用问题的请教

[复制链接]

8

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2012-12-4
在线时间
0 小时
发表于 2014-3-1 00:36:45 | 显示全部楼层 |阅读模式
问题:
     对于I2C的SDA和DS18B20的数据线
来讲,有时候是输出信号,有时候是输入信号。
疑惑:
     51单片机的IO口是通用输入输出,随时可输入或输出,不用设置。

     而STM32单片机IO口模式分成了输入模式和输出模式。
     难道必须每次操作IO口前都设置下它的工作模式?当设置为输出模式时不能自动的识别输入?
     必须执行“IO方向设置”?请高手指导下呗。
     泪奔中。。。。
原子哥程序代码:
//IO方向设置

#define DS18B20_IO_IN()  {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=8<<12;}
#define DS18B20_IO_OUT() {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=3<<12;}
////IO操作函数             
#define DS18B20_DQ_OUT PGout(11) //数据端口 A0
#define DS18B20_DQ_IN  PGin(11)  //数据端口 A0

u8 DS18B20_Read_Bit(void)     // read one bit
{
    u8 data;
 DS18B20_IO_OUT();//SET PA0 OUTPUT
    DS18B20_DQ_OUT=0;
 delay_us(2);
    DS18B20_DQ_OUT=1;
 DS18B20_IO_IN();//SET PA0 INPUT
 delay_us(12);
 if(DS18B20_DQ_IN)data=1;
    else data=0; 
    delay_us(50);          
    return data;
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

50

主题

243

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2014-2-26
在线时间
1 小时
发表于 2014-3-1 02:19:28 | 显示全部楼层
回复 支持 反对

使用道具 举报

2

主题

1447

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2258
金钱
2258
注册时间
2010-12-16
在线时间
206 小时
发表于 2014-3-1 03:00:22 | 显示全部楼层
设置成输出时,输入也是有效的,但要在输出高电平时将引脚可靠拉低,引脚电流会超出使用范围.

51的只是准输出输入引脚,和真正的通用输出输出还有差距.

这个用例,你可以考虑使用OD模式.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

56

主题

289

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2012-11-16
在线时间
65 小时
发表于 2014-3-1 09:23:43 | 显示全部楼层
还是不太明白
回复 支持 反对

使用道具 举报

8

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2012-12-4
在线时间
0 小时
 楼主| 发表于 2014-3-1 10:14:12 | 显示全部楼层
 再仔细看了《STM32中文参考手册_V10》.pdf之后,得出如下结论,请各位同仁斟酌。
设置GPIO为输出时,电路图如下:


                             图1 中文参考手册原图


                  图2 中文参考手册原说明
 
从图1红色指示(输出走向)、紫色指示(输入走向)来看,结合图2中文字解释,可得到如下的结论:

1 设置为输出模式后,输出通道有效。

  
   如果是开漏模式,就是将“红色圈”中的两个MOS管中的P-MOS去掉。(此时,如果
输出高电平,外部应接上拉电阻到VCC)
   如果是推挽模式,就是“红色圈”中的两个MOS管均起作用。(此时,如果输出高电平,外部引脚由于输入控制接地了,那就有可能烧引脚)

2
设置为输出模式后,输入通道有效。
   
   设置为输出模式,从图1和图2描述来看,图1中的“紫色圈”施密特触发器决定是否允许输入。而图2的描述说“施密特触发输入被激活”,

因此可以认为“输入通道”有效。
   同时,图2的描述“开漏模式时,对输入数据寄存器的读访问可得到I/O状态”更加说明了输入模式的打开。

但是有个问题需要思考和实验。
条件:
      开漏模式,既做输出又做输入,分时进行

问题:
    假如前一时刻t0,从输出通道输出了0。此时,红圈N-MOS导通接地,外部引脚输出0。

    假如此状态未变,下一时刻t1需要从外部引脚读入IO状态。
    外部引脚为0无所谓,正常
    但是如果外部引脚为1,是否会因为STM32内部输出通道的N-MOS接地而把外部的1给拉为了0呢?



回复 支持 反对

使用道具 举报

13

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2013-12-12
在线时间
13 小时
发表于 2014-3-1 11:52:17 | 显示全部楼层
回复【5楼】lqz9057:
---------------------------------
个人看法:
     
 设置为输出模式,从图1和图2描述来看,图1中的“紫色圈”施密特触发器决定是否允许输入。而图2的描述说“施密特触发输入被激活”,
因此可以认为“输入通道”有效。
   同时,图2的描述“开漏模式时,对输入数据寄存器的读访问可得到I/O状态”更加说明了输入模式的打开。


这段话是不是应该理解为,读I/O的状态就是读的输出呢?
回复 支持 反对

使用道具 举报

2

主题

1447

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2258
金钱
2258
注册时间
2010-12-16
在线时间
206 小时
发表于 2014-3-1 13:53:25 | 显示全部楼层
回复【5楼】lqz9057:
---------------------------------
在数字电路里这叫做竞争.会,但不一定,原因要涉及半导体制作和封装工艺.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

8

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2012-12-4
在线时间
0 小时
 楼主| 发表于 2014-3-1 23:22:41 | 显示全部楼层
回复【6楼】luofeng:
---------------------------------
可以这么认为。但是理论上应该可以读到输入信息。
以“输出开漏模式”举例:
1 从输出通道输出“低电平”,此时N-MOS导通接地,外部引脚显示低电平。程序设置输出低电平=引脚输出低电平。(正确)
2 从输出通道输出“高电平”,此时N-MOS截至,由于外部引脚接有上拉电阻,因此外部引脚显示高电平。程序设置输出高电平=引脚输出高电平。(正确)

对于情况1、2,如果外部引脚无任何输入,自然读入的信息就是刚才的输出信息。
    但是,既然做输入用,必然外部引脚还接有“其他器件”,而且该器件此时此刻将控制引脚电平。
    “其他器件”的I/O可以输出“高”或“低”电平,这个“高”或“低”将影响STM32的引脚电平,从而使得输入通道读到相应的外部引脚电平。

当然,以上仅是我根据PDF文档资料的个人推断,现实是否如此,还有待于实验证明。刚弄好电路板,准备验证此事。
回复 支持 反对

使用道具 举报

8

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2012-12-4
在线时间
0 小时
 楼主| 发表于 2014-3-1 23:23:25 | 显示全部楼层
回复【7楼】shihantu:
---------------------------------
“竞争”懂得。但是细节不太清楚,需要验证和实践。
回复 支持 反对

使用道具 举报

8

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2012-12-4
在线时间
0 小时
 楼主| 发表于 2014-3-2 10:11:12 | 显示全部楼层
从MDK软件仿真来看:

“输出开漏模式”中:
 
1 从“输出通道”输出“低电平”,此时N-MOS导通接地。 (此时,仿真时不允许修改引脚电平,因为如果外部引脚为高电平,将和输出通道的低电平短接,会出错。)
2 从“输出通道”输出“高电平”,此时N-MOS截至。 (此时,仿真时允许修改引脚电平,因为此时输出通道中N-MOS截至,与地隔离,外部引脚的高低电平直接反馈到输入触发器,正确。)

总体来讲,个人感觉:
STM32的GPIO口,当设置为“开漏输出模式”时,使用方法和单片机的准双向IO口类似。
输入前必须保证该IO口的“输出锁存器”为1。

“输出推挽模式”中,均不许“人为”的改变引脚的高低电平。
回复 支持 反对

使用道具 举报

13

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2013-12-12
在线时间
13 小时
发表于 2014-3-2 14:54:35 | 显示全部楼层
回复【10楼】lqz9057:
---------------------------------
开漏输出模式中,当没有输出时,禁止N-MOS导通?只有在有输出的时候才选择N-MOS导通?
回复 支持 反对

使用道具 举报

8

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2012-12-4
在线时间
0 小时
 楼主| 发表于 2014-3-2 16:03:07 | 显示全部楼层
回复【11楼】 luofeng :
回复【10楼】 lqz9057 : --------------------------------- 开漏输出模式中,当没有输出时,禁止N-MOS导通?只有在有输出的时候才选择N-MOS导通?
---------------------------------
请看下图中的各颜色注释


回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2014-3-3 10:49:02 | 显示全部楼层
“51单片机的IO口是通用输入输出,随时可输入或输出,不用设置”

就是相当于 STM32 的IO 配置为 开漏+上拉电阻 方式

所以 STM32 的 IO要灵活多了!
回复 支持 反对

使用道具 举报

8

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2012-12-4
在线时间
0 小时
 楼主| 发表于 2014-3-6 11:37:21 | 显示全部楼层
回复【13楼】aleda303:
---------------------------------
我已经实际测试了,“STM32 的IO 配置为 开漏+上拉电阻 方式”进行输入输出可行。
但是就是不知道假如STM32在IO口上输出了低电平,此时N-MOS导通了,那么下一时刻从外部引脚给了个高电平。

这是,内部的N-MOS就承担了“高”“低”电平的电压差,会过流烧坏么?

不敢实验。

我测试时是在输入前程序输出高,把N-MOS截止了。
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2014-3-6 12:00:16 | 显示全部楼层
很有可能。 

开漏输出 一般用于总线, 输入输出都有上拉驱动, 多个并联在一起。  其它输出为高的时候, 其中一个为低 总线即为低, 而由于有上拉电阻的限流作用,不会烧毁。
回复 支持 反对

使用道具 举报

8

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2012-12-4
在线时间
0 小时
 楼主| 发表于 2014-3-7 07:50:10 | 显示全部楼层
回复【15楼】aleda303:
---------------------------------
嗯 有道理。

使用的地方不同,效果不同。
通用输入输出时,还是小心为妙。
回复 支持 反对

使用道具 举报

16

主题

253

帖子

0

精华

高级会员

Rank: 4

积分
565
金钱
565
注册时间
2013-10-16
在线时间
52 小时
发表于 2014-12-26 09:30:44 | 显示全部楼层
我也在找这个问题的答案,谢谢楼主分享。
回复 支持 反对

使用道具 举报

16

主题

253

帖子

0

精华

高级会员

Rank: 4

积分
565
金钱
565
注册时间
2013-10-16
在线时间
52 小时
发表于 2014-12-26 21:00:34 | 显示全部楼层
回复【13楼】aleda303:
---------------------------------
请问下,这里具体是怎么设置的,
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD | GPIO_Mode_IPU;  //开漏输出和上拉输入
出现警告:
..\HARDWARE\SHUMAGUAN\shumaguan.c(24): warning:  #188-D: enumerated type mixed with another type
回复 支持 反对

使用道具 举报

0

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2014-11-13
在线时间
28 小时
发表于 2014-12-26 22:02:36 | 显示全部楼层
回复【18楼】wyudcl:
---------------------------------
设开漏输出即可,外部接上拉电阻。
回复 支持 反对

使用道具 举报

16

主题

253

帖子

0

精华

高级会员

Rank: 4

积分
565
金钱
565
注册时间
2013-10-16
在线时间
52 小时
发表于 2014-12-27 08:44:29 | 显示全部楼层
回复【19楼】youhm:
---------------------------------
谢谢楼主,楼主辛苦了。
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2015-2-27
在线时间
2 小时
发表于 2015-2-27 11:32:00 | 显示全部楼层
嗯,新人,长知识了
回复 支持 反对

使用道具 举报

33

主题

253

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
412
金钱
412
注册时间
2012-8-16
在线时间
0 小时
发表于 2015-6-8 16:06:17 | 显示全部楼层
楼主间接很是犀利啊 ..... 佩服!!
开源的世界,你可以做主!!
回复 支持 反对

使用道具 举报

11

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2015-11-2
在线时间
17 小时
发表于 2015-12-22 10:33:23 | 显示全部楼层
OUT_OD+上拉 可输出 可输入
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2014-12-16
在线时间
0 小时
发表于 2016-4-19 11:30:17 | 显示全部楼层
外部上拉接多少欧姆
回复 支持 反对

使用道具 举报

34

主题

283

帖子

0

精华

高级会员

Rank: 4

积分
739
金钱
739
注册时间
2015-11-15
在线时间
226 小时
发表于 2016-4-19 11:43:11 | 显示全部楼层
xupt_ln 发表于 2015-12-22 10:33
OUT_OD+上拉&nbsp;可输出&nbsp;可输入

这个 确实是可行,单总线的输入输出,就可以采用开漏在外接上拉电阻,可以避免切换输入输出模式
与其感慨路难行,不如马上出发
回复 支持 反对

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2016-3-15
在线时间
61 小时
发表于 2017-1-9 16:42:44 | 显示全部楼层
赞一个
回复 支持 反对

使用道具 举报

3

主题

7

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2017-3-26
在线时间
6 小时
发表于 2017-3-30 17:36:59 | 显示全部楼层
lqz9057 发表于 2014-3-6 11:37
回复【13楼】aleda303:
---------------------------------
我已经实际测试了,“STM32&nbsp;的IO&nbsp;配 ...

如果设为开漏输出,并外接上接电阻不就形成“线与”了吗,那如果使它输出低电平的话,就算给引脚一个高电平它怎么读也是0。
另外问一下,开漏+上拉电阻实现的输入,是直接用GPIO_ReadInputDataBit函数读取引脚就行了吗?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-22 15:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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