用STM32F407采集AM2302数据,如何正确的编写主机起始信号程序,和传感器响应信号的程序。

2019-07-20 07:43发布


这是需要的IO设置,程序后面有我的疑问
//IO方向设置
#define DHT22_IO_IN()  {GPIOG->MODER&=~(3<<(9*2));GPIOG->MODER|=0<<9*2;}        //PG9输入模式
#define DHT22_IO_OUT() {GPIOG->MODER&=~(3<<(9*2));GPIOG->MODER|=1<<9*2;}         //PG9输出模式
////IO操作函数                                                                                          
#define        DHT22_DQ_OUT PGout(9) //数据端口        PG9
#define        DHT22_DQ_IN  PGin(9)  //数据端口        PG9

//复位DHT22,2S的启动延时
void DHT22_Rst(void)          
{
        DHT22_IO_IN() ;//设置为输入模式,这样上拉电阻拉高一直保持高电平,在2秒期间,不进行任何操作。
        delay_ms(2000);       
}

void Read_DHT22(void)//这一部分仅写出主机起始信号和传感器响应信号部分
{
        u8 t = 0;
        DHT22_IO_OUT();         //设置为输出模式
        DHT22_DQ_OUT=0;         //输出低电平
         delay_ms(1);                //拉低至少1ms(典型值)
       
        DHT22_IO_IN();//设置为输入状态,此时,由于上拉电阻的作用,会自动把电平拉高,这么说不是说的对不对????       
        delay_us(30);             //延时20~40us,等待从机发送响应信号
                while (DHT22_DQ_IN == 0)//轮询为80us的低电平后跳出循环,时序图上说明会输出80us的低电平作为应答信号。
                {
                        t++;
                        delay_us(1);
               
                }//响应80us的低电平
                t = 0;
                while (DHT22_DQ_IN == 1)//轮询80us后跳出来,输出80us的高电平通知外设准备接受数据。
                {
                        t++;
                        delay_us(1);
               
                }//响应80us的高电平,,,这段程序遇到的主要问题是,我的程序直接死在了while (DHT22_DQ_IN == 1);这个循环里面。
       
        //响应结束,开始读取数据。


       在拉低1MS后,“微处理器的I/O 设置为输入状态,释放总线,由于上拉电阻,微处理器的I/O 即AM2302的SDA 数据线也随之变高,等主机释放总线后,AM2302 发送响应信号”,在AM2302发送响应信号之前,
前面的表述是不是用一个程序代码可以实现,即:DHT22_IO_IN();//设置为输入状态,这样就实现了总线的释放和上拉电阻的拉高吗???而不需要人为的去设定为高电平,我见在学习板上DHT11程序中,是人为拉高的。
这是我的一个疑问。
       另外一个疑问是,在附着的两张图中,图6 和图7中,粗线都是表示的主机信号,细线都是表示的传感器信号。这种细节需要我们在写程序的时候注意吗???
       请大家提出自己的见解和帮助。谢谢了!!!


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。