ESP32. Урок 37. RMT. 1-Wire. Инициализация. Часть 2



В предыдущей части урока мы подготовили несколько служебных функций и начали писать функцию инициализации устройства, в которой написали инициализацию приёмника и передатчика RMT.

 

Выйдем из условия установки флагов канала передатчика и в противном случае выведем соответствующее сообщение в терминал

 

 

Затем выйдем из тела условия применения конфигурации передатчика и также в противном случае выведем соответствующее сообщение в терминал

 

 

Включим соответствующий бит в регистре порта для ножки GPIO

 

 

Включим режимы RMT приёмника и передатчика для ножек (вернее для одной ножки)

 

 

Включим направление на вход

 

 

Включим режим открытого коллектора

 

 

Ещё раз прошьём и запустим наш проект, а затем посмотрим результат в терминале

 

 

Теперь у нас нет никаких ошибок.

Добавим функцию, которая будет проверять, инициализирована ли у нас шина. Проверять она будет это по состоянию поля

 

 

А ниже добавим функцию, которая будет включать или выключать режим проверки контрольной суммы в зависимости от значения второго параметра. Также будет инициализироваться соответствующее поле переменной структуры, но только уже здесь будет проверяться, инициализирована ли у нас шина

 

 

Создадим прототип для данной функции в заголовочном файле и вызовем её в функции app_main файла main.c

 

 

В файле owb.h объявим тип структуры для структурированного хранения ROM-кода устройства

 

 

Вернёмся в файл main.c и объявим макрос со значением максимального количества устройств на одной шине

 

 

В функции app_main объявим массив с ROM-кодами, забьём его нулями, а также объявим переменную, которая будет хранить в себе затем реальное количество обнаруженных устройств на шине

 

 

В файле owb.h объявим тип структуры, которая будет хранить некоторые параметры найденного устройства, включая и его ROM-код

 

 

В функции app_main файла main.c мы объявим переменную созданного нами типа, инициализируем её нулями, а также объявим переменную булевого типа

 

 

В файле owb.c выше функции _uninitialize добавим функцию, которая будет искать первое устройство на шине (или единственное, если оно будет одно)

 

 

К данной функции мы вернёмся позже.

 

 

А сейчас создадим на неё прототип в заголовочном файле и вызовем её в функции app_main файла main.c

 

 

Вернёмся в файл owb.c и выше функции owb_search_first добавим функцию поиска устройства на шине

 

 

В файле owb.h объявим макрос функции создания контейнера с информацией об устройстве

 

 

Вернёмся в файл owb.c и объявим подобный макрос для информации об устройстве

 

 

Теперь поработаем с функцией перезагрузки _reset, в теле которой вызовем нашу функцию и результат запишем в переменную, указатель которой объявим

 

 

Выше объявим массив ячеек памяти RMT из одного элемента для передачи

 

 

Объявим макрос для значения времени перезагрузки

 

 

Вернёмся в функцию _reset и присвоим полям данных ячейки памяти необходимые значения

 

 

Получим пороговые значения

 

 

Выше функции _search добавим функцию освобождению буфера

 

 

Вернёмся в функцию _reset и вызовем нашу функцию

 

 

Запустим канал приёмника

 

 

Используя данные из ячейки памяти отправим импульс в канал

 

 

Вернёмся пока в функцию _search и вызовем функцию _reset, а также заполним параметры состояния

 

 

В функции owb_search_first при условии наличия параметров, а также инициализации шины, сохраним также состояние в поля и вызовем функцию _search

 

 

Это пока не всё. Соберём код, прошьём контроллер, посмотрим, что у нас в терминале

 

 

Здесь вроде никаких плохих сообщений нет.

Также посмотрим, что у нас в анализе

 

 

Мы видим, что команда RESET у нас ушла, и также датчик тоже на неё ответил.

Значит идём в функцию _reset и будем ловить ответ от датчика.

 

 

Определим количество записанных ячеек памяти и выведем в терминал содержимое их полей

 

 

Соберём код, прошьём контроллер и посмотрим результат в терминале

 

 

Всё в пределах таймингов. Ответ от датчика получен.

Объявим локальную переменную булевого типа присутствия устройства на шине

 

 

Определим, соответствуют ли тайминги своим пределам и на основе этого присвоим переменной значение

 

 

Выйдем из четырёх условий и после синтаксического анализа данных возвратим пробелы в кольцевой буфер

 

 

Выйдем ещё из одного условия и в противном случае выведем в терминал соответствующее сообщение об ошибке и установим соответствующий статус

 

 

Выйдем ещё из двух условий и также в противном установим соответствующий статус

 

 

Остановим приёмник, установим порог тишины и выведем сообщение в терминал о присутствии устройства в случае отладки

 

 

Для порядка ещё заполним тело функции _uninitialize

 

 

Соберём код, прошьём контроллер и посмотрим результат в терминале

 

 

Всё нормально, ошибок нет.

Вешать ещё один датчик на шину смысла нет, так как результат будет тот же самый. Смысл будет, когда начнём читать ROM-код.

Итак, на данном уроке мы, используя модуль RMT, начали работу с шиной 1-Wire. Нам удалось передать команду RESET и дождаться ответа датчика.

 

Всем спасибо за внимание!

 

 

Предыдущая часть Программирование МК ESP32 Следующий урок

 

Исходный код

 

 

Недорогие отладочные платы ESP32 можно купить здесь Недорогие отладочные платы ESP32

Недорогие отладочные платы ESP32/ESP32-C3/ESP32-S3 можно купить здесь Недорогие отладочные платы ESP32

Датчик температуры DS18B20 в экране с проводом можно приобрести здесь DS18B20

Логический анализатор 16 каналов можно приобрести здесь

 

 

Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)

ESP32 1-Wire. Инициализация

 

Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)

ESP32 1-Wire. Инициализация

 

Смотреть ВИДЕОУРОК в Дзен (нажмите на картинку)

ESP32 1-Wire. Инициализация

3 комментария на “ESP32. Урок 37. RMT. 1-Wire. Инициализация. Часть 2
  1. Виктор:

    Добрый день! Спасибо за огромную работу!
    Возникли сложности с компиляцией кода, выложенного в 41 уроке.
    Строка 768 owb.c Не объявлена GPIO! наверное должна использоваться переменная из info->gpio? GPIO упоминается в этой строке первый раз.
    И поскольку у меня esp-idf v5.1 получаю сообщение, что driver/rmt.h считается устаревшим с рекомендацией использовать на driver/rmt_rx.h и driver/rmt_tx.h.
    Попробую довести довести до компиляции.

  2. VVK:

    Добрый день! Спасибо за проделанную просветительскую работу!

    При попытке компиляции проекта (исходный код урока 41) появляется сообщение о том, что в owb.c GPIO не объявлена.
    Есть ещё вопрос по более свежей версии esp-idf. Cообщение driver/rmt.h устарела, рекомендуют использовать driver/rmt_rx.h и driver/rmt_tx.h. Но простой замены недостаточно, поскольку в новых заголовочных файлах отсутствует тип RingbufHandle_t.

    Спасибо ещё раз!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*