本帖最后由 oolong 于 2020-1-22 11:53 编辑
正常写的程序一直不能读取到DHT11的时序,所以弄了个单元测试,主机起始信号发送后每1us读取一次总线的电平(GPIO浮空输入),但是读取500次读到的全是1,用逻辑分析仪和示波器看到的都是有波形的,找了好久不知道问题在哪,求大佬们指点迷津。
测试代码逻辑:
逻辑分析仪波形:
示波器部分波形:
串口输出
void dht11_test14(void){
uint32_t cnt = 0;
uint8_t bit_num;
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 配置串口
USART_Config();
printf("hello stm32\n");
//打开IO口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
while(1){
cnt = 1;
//推挽输出
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
//延时2s,等待DHT11就绪
GPIO_SetBits(GPIOB, GPIO_Pin_14);
SysTick_Delay_ms(1000);
SysTick_Delay_ms(1000);
//18ms起始信号
GPIO_ResetBits(GPIOB, GPIO_Pin_14);
SysTick_Delay_ms(18);
//输入模式,拉高等待
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStruct);
//每1us采样一次
while(cnt){
bit_num = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14);
printf("read:%d\t%d\n",cnt,bit_num);
SysTick_Delay_us(1);
if(cnt > 500){
cnt = 1;
break;
}
cnt++;
}
SysTick_Delay_ms(1000);
SysTick_Delay_ms(1000);
}
}
|