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

2019-08-23 15:25发布

问题:
     对于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;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
26条回答
lqz9057
1楼-- · 2019-08-24 11:55
 精彩回答 2  元偷偷看……
lqz9057
2楼-- · 2019-08-24 14:08
回复【7楼】shihantu:
---------------------------------
“竞争”懂得。但是细节不太清楚,需要验证和实践。
lqz9057
3楼-- · 2019-08-24 19:14
从MDK软件仿真来看:

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

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

“输出推挽模式”中,均不许“人为”的改变引脚的高低电平。
luofeng
4楼-- · 2019-08-24 19:26
回复【10楼】lqz9057:
---------------------------------
开漏输出模式中,当没有输出时,禁止N-MOS导通?只有在有输出的时候才选择N-MOS导通?
lqz9057
5楼-- · 2019-08-24 23:49
回复【11楼】 luofeng :
回复【10楼】 lqz9057 : --------------------------------- 开漏输出模式中,当没有输出时,禁止N-MOS导通?只有在有输出的时候才选择N-MOS导通?
---------------------------------
请看下图中的各颜 {MOD}注释


aleda303
6楼-- · 2019-08-25 03:05
 精彩回答 2  元偷偷看……

一周热门 更多>