单个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
2019-08-24 06:15
 再仔细看了《STM32中文参考手册_V10》.pdf之后,得出如下结论,请各位同仁斟酌。
设置GPIO为输出时,电路图如下:


                             图1 中文参考手册原图


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

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

2 设置为输出模式后,输入通道有效。
   
   设置为输出模式,从图1和图2描述来看,图1中的“紫 {MOD}圈”施密特触发器决定是否允许输入。而图2的描述说“施密特触发输入被激活”,
因此可以认为“输入通道”有效。
   同时,图2的描述“开漏模式时,对输入数据寄存器的读访问可得到I/O状态”更加说明了输入模式的打开。

但是有个问题需要思考和实验。
条件:
      开漏模式,既做输出又做输入,分时进行。
问题:
    假如前一时刻t0,从输出通道输出了0。此时,红圈N-MOS导通接地,外部引脚输出0。
    假如此状态未变,下一时刻t1需要从外部引脚读入IO状态。
    外部引脚为0无所谓,正常。
    但是如果外部引脚为1,是否会因为STM32内部输出通道的N-MOS接地而把外部的1给拉为了0呢?



一周热门 更多>