Потеря бита данных при чтении из gpio с помощью libgpiod в Linux

Я использую Debian (8.3.0-6) на встроенной специальной плате и работаю над датчиком dht11. Вкратце, мне нужно прочитать 40 бит с вывода gpio, и каждый бит может занять максимум 70 микросекунд. Когда битовый уровень высокий для макс. 28 мксек или 70 мксек, это означает, что это логический 0 или 1 соответственно. (Итак, у меня есть контроллер тайм-аута для каждого бита, и если бит занимает более 80 мкс, мне нужно остановить процесс.) В моей ситуации иногда я могу правильно прочитать все 40 бит, но иногда я не могу этого сделать, и функция libgpiod gpiod_line_get_value(line);отсутствует бит (мой код ниже). Я пытаюсь понять, почему я не умею читать и немного теряю, в чем причина. Но толкового ответа пока не нашел. Поэтому мне было интересно , что я упускаю? Как правильно программировать gpio?

Вот что я хотел вам показать. Как мне понять, чего мне немного не хватает? Всякий раз, когда я ловлю бит, я устанавливаю и сбрасываю другой вывод gpio по нарастающему и спадающему фронту бита (чтобы я мог видеть, какой бит отсутствует). Более того, насколько я понимаю, мне всегда не хватает двух ребер на одном бите или одного ребра на двух битах подряд (возрастание и падение или падение и рост). На первом изображении вы можете увидеть, какой бит я пропустил, на втором - когда я правильно прочитал все биты.

Вот мой код:

      //********************************************************* Start reading data bit by low level (50us) ***************************
    for (int i = 0; i < DHT_DATA_BYTE_COUNT ; i++) //DHT_DATA_BYTE_COUNT = 5
    {
        for (int J = 7; J > -1; J--)
        {
             GPIO_SetOutPutPin(testPin); //gpiod_line_set_value(testPin, 1);
             int ret;
             start = micros();
             do
             {
                 ret = GPIO_IsInputPinSet(dht11pin);//gpiod_line_get_value(dht11pin);
                 delta = micros() - start;
                 if(ret == -1)
                 {
                     err_step.step = 9;
                    err_step.ret_val = -1;
                    return -1;
                 }
                if(delta > DHT_START_BIT_TIMEOUT_US) //80us
                {
                    err_step.step = 10;
                    err_step.ret_val = -2;
                    err_step.timestamp[is] = delta;
                    err_step.indx[is].i = i;
                    err_step.indx[is++].j = J;
                    GPIO_ResetOutPutPin(testPin);
                    return -2;
                }
             }while(ret == 0);


                GPIO_ResetOutPutPin(testPin);
                err_step.ret_val = 10;


                GPIO_SetOutPutPin(testPin);

            start = micros();
            do
             {
                 ret = GPIO_IsInputPinSet(dht11pin);
                 delta = micros() - start;
                 if(ret == -1)
                 {
                     err_step.step = 11;
                    err_step.ret_val = -1;
                    return -1;
                 }
                 if(delta > DHT_BEGIN_RESPONSE_TIMEOUT_US) //80us
                {
                    err_step.step = 12;
                    err_step.ret_val = -2;
                    err_step.timestamp[is] = delta;
                    err_step.indx[is].i = i;
                    err_step.indx[is++].j = J;
                    return -2;
                }
             }while(ret == 1);

                    err_step.timestamp[is] = delta;
                    err_step.indx[is].i = i;
                    err_step.indx[is++].j = J;
                GPIO_ResetOutPutPin(testPin);
                err_step.ret_val = 10;

            (delta > DHT_BIT_SET_DATA_DETECT_TIME_US) ? bitWrite(dht11_byte[i],J,1) : bitWrite(dht11_byte[i],J,0);
        }
    }

0 ответов

Другие вопросы по тегам