我这边在做DHT11数据接受,中间有很多微秒级别延时,数据接受错误很多。ai说可能是中断影响。

Viewed 2

一、描述你遇到的问题

关键代码如下int DHT11_Read(float *RH, float *temperature) {
uint8_t data[5] = {0};
int timeout;
// 发送起始信号
uapi_gpio_set_dir(15, GPIO_DIRECTION_OUTPUT);
uapi_gpio_set_val(15, GPIO_LEVEL_LOW);
uapi_systick_delay_ms(19); // 至少18ms
uapi_gpio_set_val(15, GPIO_LEVEL_HIGH);
uapi_systick_delay_us(20); // 20-40us

// 切换为输入
uapi_gpio_set_dir(15, GPIO_DIRECTION_INPUT);

// 等待从机响应:先等待低电平变高(80us低电平结束)
timeout = 20000; // 10ms超时
while (uapi_gpio_get_val(15) == 0 && timeout > 0) {
    uapi_systick_delay_us(1);
    timeout--;
}
if (timeout == 0) return -1;

// 等待高电平变低(80us高电平结束)
timeout = 20000;
while (uapi_gpio_get_val(15) == 1 && timeout > 0) {
    uapi_systick_delay_us(1);
    timeout--;
}
if (timeout == 0) return -1;

// 读取40位数据
for (int i = 0; i < 40; i++) {
    // 等待低电平变高(位起始)
    timeout = 20000;
    while (uapi_gpio_get_val(15) == 0 && timeout > 0) {
        uapi_tcxo_delay_us(1);
        timeout--;
    }
    if (timeout == 0) return -3;

    // 延时约30us,判断电平
    uapi_systick_delay_us(28);
    if (uapi_gpio_get_val(15) == 1) {
        data[i/8] |= (1 << (7 - i%8));
    }

    // 等待高电平变低
    timeout = 10000;
    while (uapi_gpio_get_val(15) == 1 && timeout > 0) {
        uapi_systick_delay_us(1);
        timeout--;
    }
    if (timeout == 0) return -3;
}

*RH = data[0] + data[1] * 0.1f;
*temperature = data[2] + data[3] * 0.1f;
return 0;

}
请详细描述问题

二、你具体做的所有步骤结果截图

请插入图片

三、当前开发板状态全景照片

请插入图片

四、开发板串口所有日志

DHT11 timeout
RH=213.5 Tmp=27.5
RH=213.5 Tmp=27.5
RH=79.1 Tmp=27.4
RH=207.1 Tmp=27.7
RH=212.5 Tmp=27.6
RH=95.9 Tmp=30.4
RH=79.9 Tmp=31.7
RH=79.1 Tmp=31.4
RH=92.8 Tmp=97.2
RH=95.8 Tmp=32.8
RH=203.1 Tmp=27.6
RH=75.9 Tmp=30.7
RH=77.5 Tmp=30.5
RH=75.1 Tmp=27.5
RH=203.1 Tmp=27.4
RH=90.8 Tmp=97.5
RH=203.1 Tmp=27.4
RH=201.1 Tmp=27.7
RH=89.8 Tmp=99.7
RH=201.1 Tmp=27.6
RH=75.1 Tmp=31.4
RH=88.8 Tmp=129.3
DHT11 timeout
RH=203.1 Tmp=31.5
RH=205.5 Tmp=27.5
RH=87.8 Tmp=30.4
RH=199.1 Tmp=27.4
RH=71.1 Tmp=29.7
RH=94.8 Tmp=97.4
RH=71.1 Tmp=27.4
DHT11 timeout
DHT11 timeout
RH=199.1 Tmp=27.4
RH=85.9 Tmp=30.4
RH=71.1 Tmp=26.2
RH=71.9 Tmp=31.4
RH=85.8 Tmp=29.5
DHT11 timeout
RH=71.9 Tmp=29.7
RH=69.9 Tmp=29.5
RH=199.1 Tmp=29.6
RH=69.5 Tmp=26.3
RH=67.9 Tmp=25.7
RH=83.8 Tmp=96.6
RH=195.1 Tmp=26.2
RH=67.1 Tmp=29.7
RH=67.9 Tmp=25.6
RH=195.1 Tmp=26.3
RH=83.8 Tmp=29.7
RH=69.5 Tmp=25.7
DHT11 timeout
RH=67.1 Tmp=30.2
RH=201.5 Tmp=25.7
RH=67.9 Tmp=25.7
RH=67.9 Tmp=29.5
RH=201.5 Tmp=25.7
RH=81.8 Tmp=99.5
RH=81.8 Tmp=99.5
RH=195.1 Tmp=29.6
DHT11 timeout
RH=195.1 Tmp=26.3

请在此处粘贴串口日志

1 Answers

已解决,微秒延时要用tcxo,systick精度太差了