最近在做AM2302温湿度模块实验,希望把温湿度数据读出来显示在串口调试助手中。在调试过程中首先根据时序向传感器发送激活信号,传感器能够产生应答,但此应答信号一直停留在高电平,导致死循环。出问题的代码如下:
[mw_shl_code=c,true]AM2302_IO_OUT(); //将PA5设置为推挽输出
AM2302_DQ_OUT=0; //输出0
delay_ms(1); //延时1ms
AM2302_DQ_OUT=1; //释放总线
delay_us(30); //延时30us
AM2302_IO_IN(); //将PA5设置为输入状态
Sensor_AnswerFlag=0; //将传感器是否联通位设置为0
if(AM2302_DQ_IN==0) //判断传感器是否发出响应信号
{
Sensor_AnswerFlag=1; //传感器已经联通
Sys_CNT = 0;
while(!AM2302_DQ_IN) //判断从传感器发出的80us低电平信号是否结束
{
delay_us(1);
if(++Sys_CNT>300) //防止死循环
{
Sensor_ErrorFlag = 1;
return 0;
}
}
printf("%d 80us的低电平已经结束
",Sys_CNT);
Sys_CNT = 0;
while(AM2302_DQ_IN) //判断主机是否发出80us的高电平信号,若发出则进入数据接收状态
{
delay_us(1);
if(++Sys_CNT>300) //防止进入死循环!!!!!!!!!!!!!程序在这里进入死循环!!
{
Sensor_ErrorFlag = 1;
printf("死循环
");
return 0;
}
}[/mw_shl_code]
以上就是出问题的地方,处理器已经能收到传感器发来的80us低电平信号,说明传感器能够响应激活信号,但是接下来的80us高电平信号无法结束,不知道问题出在哪里。
这是该传感器模块的通信时序:
新手求指导,谢谢
一周热门 更多>