Например TDA7294

РадиоКот > Схемы > Цифровые устройства > Измерительная техника

О USB–Serial конвертере на CY7C65211 и сенсоре давления LPS25H

Автор: Сергей Безруков (aka Ser60), sergeilb60@mail.ru
Опубликовано 15.08.2014.
Создано при помощи КотоРед.

В статье речь пойдет о двух относительно новых микросхемах – комбинириванном преобразователе интерфейсов CY7C65211 фирмы Cypress и MEMS датчике абсолютного давления LPS25H фирмы ST Microelectronics. Статью можно рассматривать как продолжение тематики в [1].

Обратимся сначала к датчику - он самый левый на фото ниже, где для сравнения показаны также и другие популярные датчики давления. Слева направо: LPS25H (ST), BMP180, BMP085 (Bosch), MPL115A1 (Freescale), HP03S (Hope Micro), MPXH6115A6T1 (Freescale). Разумеется, список этот далеко не исчерпывающий. Первые 5 датчиков цифровые, самый правый аналоговый - на фото он показан вместе с маштабирующим усилителем на ОУ. Все картинки в статье увеличиваются при кликании.

Первое отличие LPS25H от остальных сразу бросается в глаза - это малые размеры, всего 2.5×2.5 мм при высоте корпуса 1 мм. Однако, отличие это далеко не последнее. Следующий сюрприз ожидает пользователей при сравнении цен датчиков: LPS25H самый дешевый в этом ряду и доступен по розничной цене около 5 USD. По цене и размерам он может конкурировать, пожалуй, лишь с MPL115A1/2.

Но пусть вас не вводит в заблуждение низкая цена датчика. Те, кто работал с цифровыми датчиками давления (а далее речь пойдет только о таких датчиках), наверняка помнят, что алгоритм преобразования их показаний в общепринятые единицы давления гораздо более сложный, чем, скажем, у цифровых датчиков температуры и влажности. Каждый датчик давления оснащен датчиком температуры, используемым для его термокомпенсации. Кроме того, у каждого датчика имеются индивидуальные калибровочные константы, которые фирма-изготовитель записывает в их память в процессе производства. Эти константы у четырех датчиков в центре следует сначала считать и потом каждый раз использовать в вычислениях давления. В формулах также участвует показания датчика температуры в настоящий момент. У LPS25H также имеются калибровочные константы и датчик температуры, однако считывать их не нужно, и все вычисления производятся встроенным процессором автоматически. Для получения значения давления в гектопаскалях как целое число, следует всего лишь отбросить 12 младших бит 24-битного результата измерения. Для последующего перевода в миллиметры ртутного столба полученное число следует просто умножить на 3 и отбросить младшие 2 бита. Проще не бывает.

Но и это еще не все. У датчика имеется FIFO на 32 измерения, работающая в одном из четырех режимов и позволяющая, в частности, просто реализовать усреднение выбранного пользователем числа показаний или цифровой фильтр на основе скользящего среднего. Для компенсации раскалибровки сенсора в процессе монтажа на плату в нем предусмотрен регистр, записываемый пользователем при калибровке. Значение, хранящееся в этом регистре, потом автоматически вычитается сенсором из каждого измерения. Этот регистр также полезен для компенсации показаний давления в зависимости от высоты места установки барометра.

Помимо всего прочего, у сенсора рекордные показания по разрешению и микропотреблению, реализованы 2 интерфейса связи с внешним миром – I2C и (3-х и 4-проводной) SPI, выбираемые пользователем, имеется гибкая система конфигурации прерываний, и т.д и т.п. Выпуском этого сенсора фирма словно решила положить конкурентов на обе лопатки.

Опробовать сенсор я решил на этот раз без программирования микроконтроллеров, и заодно испробовать микросхему для соединения последовательных интерфейсов с USB. Многим читателям известны классические микросхемы USB – UART конвертеров типа FT232х, TUSB3410, MCP2200, CP210х и подобные [2]. Я уже рассказывал в [1] о микросхеме CP2112 преобразователя HID USB – I2C. Помимо нее фирма Silicon Labs выпускает также USB – I2S и USB – SPI конвертеры, соответственно CP2114 и CP2130. Такого типа конвертеры, конечно, не единственные на рынке, и имеются даже такие, которые совмещают в себе несколько интерфейсов. Именно о таком USB – UART/I2C/SPI конвертере CY7C65211 и пойдет речь. Кроме преобразования интерфейсов у таких конвертеров имеется модуль GPIO и даже CapSense, но их мы сегодня оставим в стороне. Не снимке ниже показаны (слева направо) модули на основе CY7C65211, CP2130, и CP2104.

В отличии от его собратьев, LDO в составе CY7C65211 не предназначен для питания чего-либо помимо самого конвертера. Поэтому я установил на плате отдельный LDO на 3.3В и заодно джампер, позволяющий выбирать амплитуду входных/выходных сигналов на уровне 3.3В или 5В. Подобное переключение питания возможно и в конвертерах серии CP21xx. Отмечу попутно, что фирмой Cypress выпускаются даже 2-канальные USB – UART/I2C/SPI конвертеры CY7C65215. Все они основаны на микроконтроллерах семейства ARM Cortex-M0.

Несмотря на возможность CY7C65211 конвертировать USB в 3 других интерфейса, в каждый момент времени использовать можно лишь один из них, поскольку этот конвертер одноканальный. Однако, его SCB (Serial Communication Block) можно многократно переконфигурировать на работу в одном из семи режимов: 6/4/2-проводной UART, или SPI Master/Slave, или I2C Master/Slave. Конфигурация производится специальной утилитой, доступной с вебсайта фирмы (www.cypress.com). Утилита снабжена на редкость подробной документацией, где на 54 страницах доходчиво и с многочисленными картинками описаны все возможности конфигуратора. Переводить весь этот документ здесь нет смысла, покажу лишь одну картинку, иллюстрирующую простоту и гибкость настроек. Она относится к конфигурированию SCB для работы в режиме SPI/Master. Именно с такой конфигурации мы и начнем работу с нашим сенсором давления. В графе Protocol можно выбрать специфический протокол фирмы (Vendor) или протокол стандартных USB классов CDC или PHDC. Важно отметить, что каждый раз после конфигурирования конвертера на новый режим работы его необходимо перестыковать в гнезде USB компьютера.

Помимо конфигуратора в сопутствующий ему пакет также входит утилита проверки настроек. Она мне понравилась меньше, т.к. заточена только под связь конвертера с EEPROM и позволяет лишь сгенерировать страницу нередактируемых случайных данных для записи/чтения во внешнюю память. Мне это пока не требуется, но польза от утилиты все-же имеется – она наглядно показывает, что подключенное устройство правильно распознается компьютером как USB – SPI конвертер.

Для работы с конвертером из программы пользователя фирма предлагает драйверы для Windows и библиотеку API функций в форматах .lib и .dll. В пакете программ/документации имеются несколько примеров работы с библиотекой, которые я и взял за основу для своих программ. Программы написаны на языке C++ и отлажены в среде Microsoft Visual Studio 2012.

Работа с сенсором по интерфейсу SPI

Рассмотрим сначала связь конвертера с сенсором по интерфейсу SPI, предполагая, что CY7C65211 сконфигурирована как показано выше. Для этого на монтажке была собрана следующая схема.

 

Вычисление и отображение в окне консоли компьютера значений давления производится за 5 следующих шагов. Первые 3 из них и последний, пятый, относятся к настройкам CY7C65211, и лишь четвертый шаг специфичен для сенсора давления.

Шаг 1: обнаружение USB – SPI конвертера компьютером. Целью этого шага является проверка подсоединения конвертера и настройки его блока SCB на работу в режиме SPI. Если подходящее под описание USB устройство найдено, переменная deviceIndexAtSCB0 получает неотрицательное значение, используемое на следующем шаге. В противном случае работа программы заканчивается. Мы используем стандартные и выбранные по умолчанию параметры VID/PID для USB устройств фирмы Cypress, определенные в начале программы (см. прилагаемые исходники), и не показанные здесь.

Шаг 2: после обнаружения подходящего USB устройства происходит открытие связи с ним. В случае успеха производится установка параметра cyHandle, используемого всеми другими API на последующих шагах.

Шаг 3: конфигурация параметров модуля SPI конвертера в структуре CY_SPI_CONFIG. Эта процедура не обязательна, если используются значения, установленные утилитой конфигуратора. Как видно из кода, мы будем тактировать сенсор на частоте 1 мгц. В конце этого шага производится обязательное создание структур CY_DATA_BUFFER и буферов ввода/вывода для связи с сенсором. Нам достаточно передавать в сенсор и принимать из него не более 4 байтов за сеанс. Отсюда и соответствующий выбор длины буферов.

Шаг 4: наконец-то USB устройство обнаружено и подготовлено для работы. Следующий этап – собственно работа с сенсором, перед которой полезно ознакомиться с его ДШ. Прежде всего, сенсор необходимо вывести из режима power down и активировать его интерфейс SPI. Это достигается посылкой байта 0х88 в его регистр конфигурации CTRL_REG1. Далее, в регистрoвую пару RPDS_L/RPDS_H заносится значение поправки давления на высоту места, полученное после сравнения показаний датчика с образцовым барометром. Показания сенсора привязаны к высоте на уровне моря, а нам интересно знать давление в нашем месте. В моем случае поправка оказалась равной -13 hPa, которая, будучи умноженной на 4096 и представленной в дополнительном двоичном коде и записывается в сенсор. После этих манипуляций сенсор готов к работе. В следующем параграфе кода производится запрос на единичное измерение давления, для чего следует установить бит 0 в регистре CTRL_REG2. Измерение давления по времени не превышает пару десятков миллисекунд. Тут следовало-бы установить задержку в программе или сконфигурировать вывод прерывания на окончание измерения, но из-за задержек на линии USB в моем компе и так все стабильно работает. Следующий параграф посвящен чтению данных из сенсора, а последний - вычислению давления в гектопаскалях и мм.рт.ст и выводу их в окно консоли.

Хотя нам нужно получить только 3 байта данных из сенсора, API CySpiReadWrite выдает столько, сколько посылается в сенсор, в данном случае 4. Первый байт, имеющий индекс 0 в буфере, при этом не используется. На осциллограмме ниже показан прием данных из сенсора. Согласно логическому анализатору, частота тактирования сенсора в точности равна 1 мгц, как и заказывали. Первый передаваемый байт – это начальный адрес регистра чтения 0х28 с установленными битами 6 и 7 для операции чтения и автоинкрементации адреса.

Шаг 5: Работа с USB устройством закончена, следует разорвать соединение с ним.

В окне консоли можно полюбоваться на работу программы.

Работа с сенсором по интерфейсу I2C

Прежде всего конвертер следует перепрограммировать для работы с I2C/Master. Для этого используем ту-же утилиту, что и выше. Выберем тактирование на частоте 100 кгц. В качестве протокола у нас для этого интерфейса нет выбора, кроме как использовать “vendor specific”.

Скорректируем схему соединения сенсора с конвертером и добавим в нее 2 подтягивающих резистора. Обратите внимание, что теперь вывод 5 сенсора используется для задания младшего бита его I2C адреса, а вывод 6 должен быть подключен к шине питания для деактивации интерфейса SPI сенсора.

 

Поддерживающая программа также во многом сходна с предыдущей. Шаги 1, 2, и 5 в ней практически такие-же как и выше и поэтому они опущены. Рассмотрим подробнее остальные 2 шага.

Шаг 3: как и раньше, здесь мы конфигурируем конвертер для работы с интерфейсом I2C. Первый параграф кода не обязателен, если используется в точности такая-же конфигурация, которая задана выше утилитой. Но все время помнить об этом я не хочу, поэтому и оставил эту часть кода. Во втором параграфе мы заполняем в структуре CY_I2C_DATA_CONFIG адрес сенсора на шине I2C, заказываем автоматическую генерацию сигнала STOP по окончании сеанса связи и автоматическую генерацию бита NACK после приема конвертером последнего байта данных от сенсора. Наконец, в последнем параграфе производится создание структуры CY_DATA_BUFFER для ввода/вывода информации. В данном случае нам достаточно одного буфера ввода/вывода на 4 байта.

 

Шаг 4: работа с сенсором в режиме I2C лишь слегка отличается от SPI. Прежде всего, используется другая API для коммуникации. Далее, автоматическая инкрементация адреса регистра определяется битом 7 адреса, а не 6 как ранее (специфика сенсора). Наконец, в предпоследнем параграфе, в соответствии с интерфейсом I2C, сначала мы запрещаем формирование сигнала STOP после отсылки первого бита (0хА8), а затем разрешаем его. Дело в том, что при каждом вызове функции CyI2cRead автоматически генерируется сигнал START на линии I2C. В результате вторая генерация START без предшествующего STOP рассматривается как повторный START, что нам и нужно. Можно и просто опустить запрещение формирования STOP после первой посылки. На результате измерений в данном случае это никак не отразится.

Отмечу, что несмотря на отсутствие явных задержек в коде, между первой и второй посылками CY7C65211 формирует задержку примерно на 10 мс.

Первая посылка увеличенно выглядит при этом как показано ниже,

... а вторая так.

В общем, все красиво, но отмечу еще 3 момента. Первый - частота тактирования линии SCL получилась несколько ниже 100 кгц, хотя это не очень принципиально. В этом смысле наблюдается отличие от CP2112, которая частоту выдерживает четко. Второй – несмотря на заказ прочитать 3 байта, конвертер читает из сенсора 4, как это видно из осциллограммы выше. Однако, как показал отладчик в Studio, четвертый прочитанный байт не переносится в буфер ввода/вывода. И третий – формирование сигнала STOP при записи данных в сенсор происходит с задержкой около 0.1 мс. При чтении из сенсора подобной задержки не наблюдается. Опять-же, это не столь принципиально для отладки.

В остальном работа конвертера и сенсора идентична таковой в режиме SPI.

Я опускаю описание работы CY7C65211 в остальных режимах и для других интерфейсов, т.к. они не поддерживаются сенсором. Однако, после изучения вышеизложенного заставить конвертер работать в этих режимах не составит труда.

Литература

  1. Метеостанция... без микроконтроллера
  2. USB - RS-232 преобразователи

 

 


Файлы:
Архив ZIP


Все вопросы в Форум.


ID: 1940

Как вам эта статья?

 Нравится
 Так себе
 Не нравится

Заработало ли это устройство у вас?

 Заработало сразу
 Заработало после плясок с бубном
 Не заработало совсем

23 2 2