ESP32 Урок 50. ULP. Датчик DS18B20. Проверяем контрольную сумму



Продолжаем работу с сопроцессором ULP и также мы продолжаем работу с датчиком температуры DS18B20, взаимодействующим с контроллером по шине 1-Wire. На данном уроке мы сравним контрольную сумму, принятую из шины с рассчитанной. Тем самым мы убедимся в целостности принятых данных из скратчпада датчика.

Схема наша осталась та же, что и в прошлом уроке — отладочная плата с контроллером esp32, подключенный к ней датчик температуры DS18B20, а также логический анализатор, подключенный к сигнальной ножке датчика для анализа обмена данными по шине

 

 

Проект за основу был взят из прошлого урока с именем ULP_FSM_ONEWIRE_READ и получил новое имя ULP_FSM_DS18B20_CRC.

Откроем проект в Espressif IDE и в функции app_main файл main.c добавим приведение типа вот здесь

 

printf("Data R0: 0x%04x\n", (unsigned int) ulp_dataR0 & UINT16_MAX);

 

Дело в том, что тем, кто обновил до последней версии Espressif IDE и комплект IDF, придётся встретиться с ругательством на несоответствие типов.

Далее идём в файл ulp_assembly_source_file.S и ниже процедуры send_bit добавим процедуру, которая будет заниматься контрольной суммой

 

 

Отталкиваться будем от примерного алгоритм расчета контрольной суммы, код которой запишем в закомментированном виде в нашей процедуре

 

 

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

 

 

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

 

 

Далее нам нужна будет процедура для операции исключающего ИЛИ, так как в ассемблере нашем нет такой инструкции. Добавим для этого макрос

 

 

 

Вернёмся в нашу процедуру checkCRC8_bytes, сохраним теперь в стек значение регистра R1 и далее по алгоритму

 

 

Ниже добавим ещё одну процедуру, которая будет заниматься одним байтом и в которой мы пока что организуем цикл следования по битам байта

 

 

В секции bss объявим мароподстановку для полинома

 

 

Также объявим ещё две переменные

 

 

Вернёмся в процедуру checkCRC8_oneByte и пройдёмся по нашему исследуемому байту согласно алгоритма

 

 

Теперь перейдём в процедуру checkCRC8_bytes и вызовем нашу процедуру просчета байта

 

 

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

 

 

В процедуре get_temp вызовем нашу процедуру

 

 

Запишем в переменную значение рассчитанной контрольной суммы

 

 

 

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

 

 

В функции app_main файла main.c удалим данную строку с кодом

 

printf("Data R0: 0x%04x\n", (unsigned int) ulp_dataR0 & UINT16_MAX);

 

Вместо этого отобразим обе контрольные суммы

 

 

Мы видим, что сборка у нас теперь происходит с ошибкой

 

 

Это означает нехватку памяти. Сейчас мы это подправим и выделим побольше. Откроем файл sdkconfig.defaults.esp32 и удвоим здесь выделение памяти

 

CONFIG_ESP32_ULP_COPROC_RESERVE_MEM=2048

 

Соответственно, файл sdkconfig необходимо будет удалить, иначе ничего это не применится.

Пересоберём проект, обязательно перед этим сделав Clean. Теперь всё нормально.

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

 

 

Рассчитанная сумма сходится с принятой.

Отлично, теперь давайте немного разобьём на модули файл ulp_assembly_source_file.S, а то очень уж много там всего нагромождено.

Создадим файл macro.S в каталоге ulp и перенесём туда все макросы из файла ulp_assembly_source_file.S (именно перенесём — с удалением из файла-источника)

 

 

В файле ulp_assembly_source_file.S подключим наш новый файл

 

 

Создадим также файл crc8.S также в каталоге ulp. В данном файле будет всё то, что связано с контрольной суммой. Подключим там для начала файл с макросами и создадим две секции

 

 

В секцию bss перенесём макроподстановку и две переменные из файла ulp_assembly_source_file.S

 

 

А в секцию text перенесём из файла ulp_assembly_source_file.S две процедуры, добавив к их заголовкам метки global

 

 

Проект наш, конечно же, не соберётся.

Нужно подключить новый файл в файле CMakeLists.txt, находящийся в каталоге main

 

set(ulp_s_sources "ulp/ulp_assembly_source_file.S" "ulp/wake_up.S" "ulp/crc8.S")

 

Теперь можно будет пересобрать наш проект, предварительно его очистив, и у нас по-прежнему будет всё работать, но код будет уже немного компактнее.

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

 

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

 

 

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

 

Исходный код

 

 

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

На AliExpress Недорогие отладочные платы ESP32

На Яндекс.Маркет Недорогие отладочные платы ESP32

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

На AliExpress DS18B20 в экране с проводом

На Яндекс.Маркет DS18B20 в экране с проводом

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

 

 

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

ESP32 ULP. Датчик DS18B20. Проверяем контрольную сумму

 

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

ESP32 ULP. Датчик DS18B20. Проверяем контрольную сумму

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

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

*