Современная электроника №7/2022
ИНЖЕНЕРНЫЕ РЕШЕНИЯ 51 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 7 2022 то это означает, что всё в порядке, что микросхема именно BME280, и что её связь с МК по SPI работает верно. Далее читаются и запоминаются в оператив- ной памяти МК (data) калибровочные коэффициенты. После этого происхо- дит инициализация BME280, т.е. в неё загружается требуемый режим работы (в начале – normal-mode), количество осреднений (sampling) по каждому из измерений (давления – P, температуры– Т и влажности –H), фильтр выключает- ся, а время работы в нормальномрежи- ме (standby_time) устанавливается на максимум (1 секунду). Далее включается режим force-mode, и на этоминициали- зация заканчивается. В этомместе про- граммы устанавливается метка “start”, на которуюпрограмма возвращается после всех измерений, индикации показаний на ЖКИ и окончания режима сна МК (sleep-mode), т.е. примерно через каждые 5 минут. Значения АЦП, отражающие значения измеренных величин, считы- ваются подряд, по 3 байта для P, Т и H (т.е. всего 9 байт, при этом старший байт Hне используется), начиная со старше- го байта (Most Significant Byte – MSB) P, т.е. с адреса 0xf7 (BME280_REG_PRESS_ MSB). После этого производится расчёт T, P и H именно в такой последователь- ности, поскольку значение Т использу- ется для расчёта P иH. Далее рассчитан- ные значения P, Hи Т выводятся наЖКИ, и МК переводится в режим сна (sleep- режим), выход из которого осуществля- ется по тревожному сигналу (alarm) от специального таймера (Real Time Clock – RTC). Это событие, как уже указывалось, происходит каждые 5 минут. После это- го программа возвращается на метку “start”, о которой говорилось выше, т.е. всё повторяется в бесконечном цикле. Вот и вся суть программы. Здесь необходимо добавить, что после входа в sleep-режим все устрой- ства МК, включая его процессор, отклю- чены, кроме специального устройства управления потреблением энергии (Power Monitor Unit – PMU) и специаль- ного таймера (Real Time Clock – RTC) со встроенным в него микропотребляю- щим НЧ генератором (LFOSC0), работа- ющим на частоте 16,4 кГц, поэтому МК в sleep-режиме и потребляет ток 0,5 мкА. Один из ключевыхмоментов програм- мы– входМК в режим сна (sleep-режим) и выход из него. Ниже этот момент про- граммы рассмотрен более подробно. Для переключения МК в sleep-режим в PMU предусмотрен специальный бит, который можно изменять программно. Но поскольку процессор в sleep-режиме выключен, он не может выполнять ника- кие команды (инструкции) программы. Поэтому выход из sleep-режима органи- зуется аппаратно по нескольким причи- нам, а точнее, событиям. Одной из причин (или событий) выхода из sleep-режима является собы- тие достижения счётчика в RTC своего максимального значения (в програм- ме используется именно оно). Это зна- чение (эквивалентное времени около 5 минут) записывается в RTC ещё на этапе инициализации устройств МК (см. далее). RTC, досчитав до этого максимума, автоматически сбрасыва- ется (авторесет) и начинает счёт сна- чала. При этом RTC генерирует специ- альный «тревожный» сигнал (alarm). Это событие (alarm от RTC – источник выхода из sleep-режима) кодируется в регистре PMU0CF (PMU) специальным битом. Кроме того, при наступлении этого события в регистре PMU0CF авто- матически устанавливается специаль- ный флаг, для которого предусмотрен свой бит. При выходе из sleep-режима этот флаг необходимо сбросить про- граммно. В активном режиме систем- ная тактовая частота работы процес- сора МК (SYSCLK) устанавливается равной частоте специального мало- потребляющего ВЧ генератора LPOSC0 (20 МГц). Это происходит ещё на этапе инициализации устройств (см. далее). Теперь, после этих предваритель- ных замечаний, несложно уже понять рекомендуемую производителем МК EFM8SB10 последовательность входа/ выхода в/из sleep-режима. Как следует из справочного руководства (Reference Manual – RM), она состоит в следующем. 1. Вначале необходимо отключить все аналоговые периферийные устройства (АЦП, компараторы и т.п.). Но посколь- ку в данном случае они не используют- ся, их можно отключить ещё на этапе инициализации устройств (см. далее), поэтому этот пункт выполнять не тре- буется. А вот интерфейс SPI, скорость работы которого определяется систем- ной тактовой частотой (SYSCLK), а она, в свою очередь, определяется часто- той работы маломощного генерато- ра LPOSC0 (20 МГц), следует отклю- чить, поскольку следующим пунктом будет отключение генератора LPOSC0 и переключение SYSCLK на частоту рабо- ты RTC, а она, в свою очередь, опреде- ляется частотой работымикромощно- го низкочастотного генератора LFOSC0 (16,4 кГц). Поэтому, во избежание неа- декватной работы SPI при смене частот SYSCLK, и требуется отключение SPI. 2. Переключить SYSCLK на работу от RTC (16,4 кГц). 3. Войти в sleep-режим, установив в регистре PMU0CF SLEEP-бит ибит выхода из sleep-режима по alarm’у от RTC. Здесь следует добавить, что никакие логиче- ские операции (логического умноже- ния “&” или логического сложения “|”) с регистромPMU0CFне допускаются, или, другими словами, в PMU0CF должнобыть записано строго определённое число. 4. Выйтииз sleep-режима, предваритель- но выполнив 4 командыNOP (NoOpera- tion–нетоперации, т.е. пустаякоманда), чтобыобеспечитьповторнуюсинхрони- зацию НЧ-генератора LFOSC0 с процес- сором. Послеэтогопереключить SYSCLK наработуотмаломощногоВЧ-генератора LPOSC0 (20 МГц) и дождаться установки бита адекватнойработыSYSCLK. Здесь следует добавить, что после того как произойдёт событие, по кото- рому осуществляется выход из sleep- режима, в данном случае – по alarm’у от RTC, в PMU автоматически устано- вится бит (флаг) этого события. Поэто- му для повторного входа в sleep-режим (через время, определяемое RTC, в дан- ном случае – 5 минут) этот флаг необ- ходимо сбросить программно. Для это- го в регистр PMU (PMU0CF) необходимо также записать определённое число, обнуляющее этот флаг и бит переклю- чения в sleep-режим, а также сохраня- ющее бит выхода из sleep-режима по alarm’у от RTC. В конце выхода из sleep- режима необходимо включить SPI. Несмотря на такое «пространное» объяснение, по фрагменту основной программы (на C51), связанному с входом и выходом в/из sleep-режима, приведённому ниже, можно убедить- ся, что это достаточно простая проце- дура. Здесь необходимо разъяснить, что после входа в sleep-режим (т.е. после выполнения команды PMU0CF=0x84;) сразу следуют 4 пустые команды (nop_ ();), и на первый взгляд кажется, что выполнение этих команд начинает- ся сразу же после выполнения пре- дыдущей команды (по крайней мере, так написано в программе). Однако, поскольку в sleep-режиме процессорМК остановлен, а эти команды (инструк- ции) выполняются именно им, то они не будут выполняться до тех пор, пока не произойдёт событие выхода из sleep- режима, а этот выход, в свою очередь, наступит только тогда, когда поступит тревожный сигнал (alarm) от RTC, счёт-
RkJQdWJsaXNoZXIy MTQ4NjUy