Подключаем GNSS-модуль TESEO-LIV3F с помощью интерфейса I2C
26 ноября 2019
Александр Калачев (г. Барнаул)
Навигационные модули Teseo-LIV3F производства STMicroelectronics, в отличие от конкурентов, поддерживают сразу два коммуникационных интерфейса: UART и I²C. При ряде задач удобнее осуществлять обмен навигационными данными именно по I²C. В статье описана работа модуля в режиме I2C-датчика местоположения.
GNSS-модуль TESEO-LIV3F как основа автомобильных трекеров. Технические параметры и области применения
Навигационные модули позволяют ощутимо уменьшить время разработки оборудования, поскольку в их состав, помимо самой микросхемы приемника, включены и другие элементы, такие как системы питания и тактирования, память, ВЧ-тракт, внешние пассивные компоненты. Пример такого модуля — Teseo-LIV3F (рисунок 1) – первый навигационный модуль производства компании STMicroelectronics, построенный на базе микросхемы приемника Teseo III [1, 2].

Рис. 1. Навигационный модуль Teseo-LIV3F
Teseo-LIV3F имеет высокопроизводительное процессорное ядро ARM9, 32 кбайт ОЗУ, 16 Мбит Flash, систему питания (SMPS и Backup LDO), систему тактирования (термокомпенсированный кварцевый генератор TCXO, часы реального времени RTC), коммуникационные интерфейсы UART и I2C, ВЧ-тракт.
Модуль Teseo-LIV3F способен работать практически со всеми популярными спутниковыми системами позиционирования – ГЛОНАСС, GPS, Galileo, BeiDou, QZSS. Для систем ГЛОНАСС и GPS поддерживается режим дифференциального позиционирования – DGPS (Differential Global Positioning System).
Среди дополнительных опций:
- встроенная Flash-память объемом 16 Мбит, которую можно применять для ведения лога или хранения данных: координат, скорости, настроек приложения и прочего;
- встроенные функции: одометр, измерение скорости, уведомление при пересечении заданных геозон (Geofencing).
В ряде случаев полезна такая возможность как расчет координат при комбинированном использовании нескольких глобальных навигационных спутниковых систем (ГНСС), например, ГЛОНАСС и GPS или GPS и Beidou.
Все это позволяет использовать модули Teseo для решения широкого спектра задач, требующих навигационных данных, среди которых:
- навигация для авто-, мото- и велотранспорта;
- навигация для дронов и беспилотных летательных аппаратов;
- отслеживание грузов и отправлений;
- тахография и мониторинг перемещения транспорта;
- отслеживание положения детей и животных.
Почему использование I2C может быть удобнее, чем традиционный UART
В отличие от конкурентов, модули Teseo-LIV3F поддерживают сразу два коммуникационных интерфейса: UART и I²C. Оба интерфейса работают с привычным для навигационных приемников протоколом NMEA.
Универсальный асинхронный приемопередатчик UART уже считается стандартным для применения в навигационных приемниках. В Teseo-LIV3F для UART выделены две линии: RX0 и TX0. Для хранения передаваемых и принимаемых данных используются два 64-байтных FIFO-буфера.
Дополнительно Teseo-LIV3F способен осуществлять обмен данными по I²C со скоростями 100 и 400 кГц. Для I²C выделены выводы SDA и SCL. Teseo-LIV3F всегда выступает в качестве ведомого, а его адрес задается в конфигурационной прошивке.
Поддержка I²C весьма ценна для систем с многочисленными датчиками, поскольку они все могут быть подключены к одной шине.
Стандартный интерфейс NMEA через I2C является зеркалом интерфейса NMEA через UART – GNSS постоянно заполняет буфер I2C данными о спутниках и местоположении, а внешний микропроцессор должен непрерывно извлекать их для очистки буфера I2C. В Teseo-LIV3F его I2C-интерфейс в режиме по умолчанию также поддерживает типовой поток данных NMEA 0183-Rev.3.1, и хост-контроллер может отслеживать его аналогично работе с UART.
Однако возможны случаи, когда постоянное периодическое получение (и разбор) NMEA-строк не требуется, и с точки зрения логики выполнения прикладной задачи удобнее запрашивать навигационные данные в произвольные моменты времени или же получать их по заранее определенным событиям. Модуль Teseo-LIV3F такую возможность предоставляет – это так называемый режим I2C-датчика местоположения (I2C Positioning Sensor).
В этом случае хост-контроллер взаимодействует с навигационным модулем так же, как и с любым другим I2C-датчиком: акселерометром, датчиком температуры, давления и прочими.
Аппаратная и программная реализация I2C в TESEO-LIV3F. Как работать с этим интерфейсом
Для работы в режиме I2C-датчика местоположения встроенное программное обеспечение (прошивка) Teseo-LIV3F нуждается в конфигурировании.
I2C-интерфейс Teseo-LIV3F имеет собственное 64-битовое поле настройки сообщений – I2C-message-list (CDB-ID 231 и CDB-ID 232), в котором прописывается, какие из сообщений NMEA будут периодически (и постоянно) записываться во внутренний буфер интерфейса или будут посылаться при I2C-запросе со стороны хост-контроллера.
Установка I2C-message-list в нулевые значения останавливает заполнение буфера интерфейса навигационными сообщениями.
I2C-датчик местоположения в Teseo-LIV3F основывается на команде $PSTMNMEAREQUEST, заставляющей его выдать NMEA сообщения в соответствии с I2C-message-list (CDB-ID 231 и CDB-ID 232).
Синтаксис команды, запрашивающей у модуля задаваемые хост-контроллером сообщения, следующий:
$PSTMNMEAREQUEST,<msglist_l>,<msglist_h>*<checksum><cr><lf>
Наглядно и доступно процесс настройки Teseo-LIV3F в режим I2C-датчика местоположения показан в документе «AN5203 Application note Teseo-LIV3F – I2C Positioning Sensor» [3, 4].
В примере задействуется микроконтроллер серии STM32 в составе отладочной платы NUCLEO-F401RE, навигационный модуль Teseo-LIV3F в составе оценочной платы X-NUCLEO-GNSS1A1, показан процесс настройки и выдачи навигационного сообщения $GPGLL по внешнему событию – нажатию кнопки (голубая) на плате NUCLEO-F401RE.
Задействованные аппаратные ресурсы:
- плата X-NUCLEO-GNSS1A1;
- плата NUCLEO-F401RE;
- USB-кабель для подключения NUCLEO-F401RE к ПК;
- кабель FTDI-UART2USB.
С сайта www.st.com необходимо загрузить и установить:
- программу для просмотра и анализа накопленных данных ST TESEO-SUITE;
- визуальный графический редактор для конфигурирования микроконтроллеров семейства STM32 – STM32cubeMX;
- среду разработки Atollic TRUEStudio.
Желательно также иметь на ПК любую из программ для работы с терминалом (СОМ-портом), например, TerminalConsole или HyperTerminal, он понадобится для вывода сообщений, генерируемых контроллером STM32.
Конфигурация прошивки Teseo-LIV3F платы X-NUCLEO-GNSS1A1 может быть изменена при помощи приложения TESEO-SUITE. Для этого необходимо при помощи кабеля FTDI-UART2USB подключить X-NUCLEO-GNSS1A1 к ПК (рисунок 2).

Рис. 2. Подключение X-NUCLEO-GNSS1A1 к ПК для конфигурирования прошивки
Затем на ПК:
- открыть приложение TESEO-SUITE;
- разрешить соединение UART/COM с X-NUCLEO-GNSS1A1;
- используя панель NMEA DecodingPanel в приложении, послать модулю следующую последовательность команд:
- $PSTMCFGMSGL,3,1,0,0;
- $PSTMSETPAR,1227,1,2;
- $PSTMSAVEPAR.
Указанные команды:
- сбрасывают список сообщений I2C;
- отключают дублирование сообщений (eco-ingmessage);
- сохраняют конфигурацию в энергонезависимой памяти.
Теперь модуль Teseo-LIV3F настроен как I2C-датчик местоположения.
Далее необходимо установить X-NUCLEO-GNSS1A1 в разъем платы NUCLEO-F401RE (рисунок 3) и при помощи USB-кабеля подключить плату контроллера к ПК.

Рис. 3. Отладочная плата NUCLEO-F401RE с подключенной X-NUCLEO-GNSS1A1
При помощи STM32Cube-MX создается конфигурация выводов и настройка прерываний:
- создается новый проект для STM32 на NUCLEO-F401RE;
- в конфигурации выводов разрешается работа интерфейса I2C-1, его выводы отображаются как SDA, SCL на пины PB9, PB8 (рисунок 4);

Рис. 4. Конфигурирование I2C и привязка внешних выводов
- в качестве входного вывода конфигурируется GPIO_EXTI13 – к нему подключена голубая кнопка отладочной платы (рисунок 5);

Рис. 5. Настройка внешнего вывода для голубой кнопки
- во вкладке «Configuration» настраивается прерывание по изменению уровня на выводе GPIO_EXTI13 (кнопка NVIC), как показано на рисунке 6;

Рис. 6. Настройка прерывания для реакции на нажатие голубой кнопки
- во вкладке «Pinout» разрешается работа последовательного порта USART2 в качестве асинхронного последовательного порта (рисунок 7);

Рис. 7. Настройка USART2
- задается конфигурация USART на скорость 115200 бит/с с одним стоп-битом и без проверки четности и управления потоком (рисунок 8).

Рис. 8. Конфигурирование USART2
На этом конфигурация выводов и периферии для примера закончена.
Через пункт «GenerateCode» меню «Project» генерируется шаблон (так называемый «скелет») кода приложения. Полученный код далее открывается в проекте в Atollic TrueSTUDIO.
«Скелетный» код содержит процедуры инициализации и настройки:
- шины I2C;
- UART-а для вывода сообщений на терминальную консоль ПК;
- обработку прерывания по нажатию синей кнопки.
Для получения приложения с минимальной функциональностью требуется добавить еще несколько строчек.
Добавляется функция для вывода строки через UART:
voidConsole_Write(uint8_t *string){
HAL_UART_Transmit(&huart2, string, strlen((char *)string), 1000);
}
Добавляется call-back-функция для обработки прерывания от кнопки (просто изменяется значение переменной):
static volatile _read = 0;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
_read = 1; }
Для получения $GPGLL-сообщений формируется строка команды: данное сообщение имеет номер-код 0x100000 ( или 20-й бит в младшем слове битового поля CDB-ID 231-232). Задание строки выглядит так:
static const char *gpgll_msg = "$PSTMNMEAREQUEST,100000,0\n\r";
Финальный код основной функции (main) выглядит следующим образом:
1 while (1) {
2 HAL_I2C_DeInit(&hi2c1);
3 HAL_I2C_Init(&hi2c1);
4 if (_read == 1) {
5 _read = 0;
6 Console_Write("Sending commands...");
7 HAL_I2C_Master_Transmit(&hi2c1, 0x3A << 1, (uint8_t *)gpgll_msg, strlen(gpgll_msg), 2000);
8 Console_Write(" got:... \r\n");
9 for (read_buf[180-1] = 0; read_buf[180-1] != 0xff;) {
10 HAL_I2C_Master_Receive(&hi2c1, 0x3A << 1, read_buf, 180, 2000);
11 for (i = 0; i< 180; ++i)
12 if (read_buf[i] != 0xff)
13 HAL_UART_Transmit(&huart2, &read_buf[i], 1, 1000);
14 }
15 Console_Write("\r\n");
16 }
17 }
В бесконечном цикле ожидается обнаружение нажатия кнопки. Когда данное событие обнаруживается (условие в строке 4), по I2C-модулю Teseo-LIV3F посылается команда $PSTMNMEAREQUEST с запросом сообщения $GPGLL (строка 7).
После отправки команды считываются запрошенные данные (строка 10), которые затем транслируются в UART (строки 11…13) и отображаются в терминальном приложении на ПК (рисунок 9).

Рис. 9. Отображение считанных с навигационного модуля сообщений на ПК в терминальной программе
Примечание. Помещение строк 2 и 3 в тело цикла While(1) сделано намеренно, чтобы гарантировать корректную работу I2C на любых микроконтроллерах семейства STM32.
Заключение
Настройка модуля Teseo-LIV3F в режим I2C-датчика местоположения (I2C Positioning Sensor) достаточно проста и может быть выполнена как до установки модуля в целевое устройство, так и в качестве прикладной задачи однократно при запуске приложения.
Режим I2C-датчика местоположения освобождает хост-контроллер от необходимости постоянной обработки NMEA-сообщений, поскольку необходимую информацию он может запросить тогда, когда это необходимо по логике работы прикладной задачи.
Литература
- В. Гавриков. TESEO-LIV3F – первый навигационный модуль STMicroelectronics
- Серия навигационных приемников GPS ГЛОНАСС TESEO-LIV3F
- AN5203 Application note Teseo-LIV3F – I2C Positioning Sensor
- Using the Teseo-LIV3F as an I2C Positioning Sensor
Наши информационные каналы