Передача длинных кадров в сетях стандарта nanoNET (IEEE 802.15.4a)

№ 3’2007
PDF версия
Часто для передачи потокового видео или звука по радиоинтерфейсу с целью уменьшения накладных расходов стараются увеличить длину поля данных. Для того чтобы реализовать это в рамках технологии nanoNET, необходимо изменить схему работы модуля, управляя им программно. Но поможет ли это реально увеличить скорость передачи в сети?

Введение

Чаще всего разработчики различных решений на базе трансиверов nanoNET конфигурируют их для работы в режиме Auto, что означает, что аппаратный модуль приемо-передатчика самостоятельно проводит сборку кадра при отправке, считывая необходимые структуры данных (адреса источника и приемника, длину кадра, управляющую информацию) из специальных регистров модуля. На приемной стороне трансивер также заполняет эти структуры, используя заголовки полученного кадра.

Передача-прием информации реализованы аппаратно только для коротких кадров (до 128 байтов длины) из-за небольшого размера оперативной памяти, отведенной в режиме Auto под данные. Однако поле «длина кадра» содержит 13 бит, а, следовательно, максимально возможная длина будет 8192 байта или 8 кбайт.

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

 

Описание радиомодуля

Используемый для экспериментов радиомодуль состоит из двух плат: трансивера на основе nanoPAN 5361, произведенного Nanotron Technologies (на рис. 1), и управляющий модуль на основе микроконтроллера ATmega32L производства VTT Technical Research Centre of Finland.

Радиомодуль на основе nanoPAN 5361 и ATmega32L

Регистровая и общая память

Модуль nanoPAN 5361 имеет 128 байт регистровой памяти и 512 байт общей памяти (baseband memory), предназначенной для временного хранения кадров (кадры загружаются в общую память перед отправкой в эфир или после получения из эфира). Общая память — это память SRAM c двумя портами, один из которых управляется по шине SPI внешним микроконтроллером ATmega32L, а второй — встроенным в трансивер цифровым baseband-контроллером. Общая память разбита на 4 сегмента по 128 байт.

Регистровая и общая память адресуются в единое окно (device window). Адрес, который передается контроллеру по интерфейсу SPI, имеет размер один байт. Соответственно, device window имеет размер 256 байт. В нижние 128 байт device window (рис. 2) всегда адресована регистровая память. В верхней части отображается какой-либо из 4 сегментов общей памяти.

Адресация памяти в nanoNET-чипах. Device window

Для выбора того или иного сегмента памяти предназначен регистр SIndex_O, размещенный по адресу 0x7F и содержащий двухбитовое поле index. Записывая в это поле различные значения (0, 1, 2 или 3), можно выбирать сегмент памяти, который будет отображен в device window.

Таким образом, линейный адрес для доступа к ячейкам памяти в модулях nanoPAN имеет разрядность 10 бит (рис. 3):

  • 2 бита — индекс сегмента;
  • 8 бит — адрес внутри device window.
Адресация памяти в nanoPAN 5361

Для выбора того или иного сегмента (задания значения индекса) в демонстрационной версии программного обеспечения TRXdd 2.01, поставляемого вместе с трансиверами, предназначена функция NTRXSetIndexReg().

В baseband memory находятся буферы трансмиттера и ресивера. В режиме Auto/duplex буферы имеют следующую конфигурацию:

  • Буфер трансмиттера. Имеет адрес 0x380 (располагается в третьем сегменте памяти, содержит поле данных кадра для передачи), размер буфера — 128 байт. Доступен для записи и чтения.
  • Буфер ресивера. Имеет адрес — 0x280 (располагается во втором сегменте памяти, содержит поле данных принятого кадра), размер буфера — 128 байт. Доступен для записи и чтения.

В нулевом и первом сегментах содержатся либо структуры данных, связанные с заголовками кадров, либо другая информация, необходимая для функционирования трансиверов (например, таймер времени RTC).

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

Регистры, отвечающие за работу трансмиттера

  • Регистр статуса прерываний трансмиттера. Имеет адрес 0x11, оригинальное название — Transmitter Interrupt Status. Используется для чтения захваченных прерываний трансмиттера. Имеет 6 разрядов, каждый из которых отвечает за конкретное прерывание, доступен только для чтения.

Бит TxEnd может использоваться для определения момента окончания передачи кадра.

Два младших разряда: TxBufferRdy0 и TxBufferRdy1 отвечают за готовность нижней (lower part) или верхней (upper part) частей буфера к заполнению данными (данные могут быть записаны в соответствующую часть буфера для передачи). Эти биты, как показано ниже, анализируются в цикле ожидания для определения готовности части буфера.

  • Регистр сброса прерываний трансмиттера. Имеет адрес 0x70, оригинальное название — Transmitter Interrupt Reset. Используется для сброса битов прерываний в регистре 0x11, доступен только для записи. Разряды регистра сброса прерываний полностью соответствуют регистру статуса прерываний. Когда в регистре статуса прерываний было получено какоелибо событие, необходимо сбросить этот бит, записав в регистр сброса прерываний (в соответствующий разряд) единицу.
  • Регистр маскирования прерываний трансмиттера. Имеет адрес 0x60, оригинальное назва ние Enable Transmitter Interrupt. Используется для разрешения специфических прерываний. Разряды регистра соответствуют двум вышеописанным регистрам. Доступен только для записи.

Регистр управления трансмиттером. Имеет адрес 0x69, оригинальное название — Transmit Start, Stop and Buffer Commands. Доступен только для записи.

Регистр имеет 4 значащих разпряда:

  • Третий разряд (TxCmdStop) — при записи в этот разряд единицы трансмиттер останавливается.
  • Второй разряд (TxCmdStart) — при записи в этот разряд единицы начинается передача данных.
  • Младшие два разряда отвечают за маркировку соответствующих частей буфера как готовых к отправке в эфир.

Регистры, отвечающие за работу ресивера

  • Регистр статуса прерываний ресивера. Имеет адрес 0x12, оригинальное название — Receiver Interrupt Status. Доступен только для чтения.

Бит RxHeaderEnd устанавливается в значение «1» в момент окончания приема заголовков кадра (если включена проверка контрольной суммы заголовка CRC1, то RxHeaderEnd=1 только в случае корректного приема). Выставленный бит RxEnd указывает на окончание приема всего кадра (если включена проверка контрольной суммы всего кадра CRC2, то RxEnd=1 только в случае безошибочной передачи).

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

  • Регистр сброса прерываний ресивера. Имеет адрес 0x50, оригинальное название — Receiver Interrupt Reset. Доступен только для записи.

Этот регистр отвечает за сброс прерываний в регистре статуса прерываний ресивера. Разряды регистра полностью соответствуют разрядам предыдущего регистра.

  • Регистр маскирования прерываний ресивера. Имеет адрес 0x40, оригинальное название — Receiver Interrupt Enable. Доступен только для записи. Используется для разрешения генерации специфических прерываний ресивера.
  • Регистр управления ресивером. Имеет адрес 0x5A, оригинальное название — Receiver Mode Controls.

Доступен для записи и чтения. При записи (верхний ряд) он определяет команды ресивера. При чтении (нижний ряд) позволяет получить информацию о полученном кадре (корректность контрольных сумм CRC2 и CRC1, соответствие адреса в полученном кадре адресу станции, тип кадра).

Команды ресивера (при записи единицы в соответствующий бит):

  • Нулевой бит — отметить нижнюю часть буфера как готовую к приему.
  • Первый бит — отметить верхнюю часть буфера как готовую к приему.
  • Второй бит — запустить ресивер.
  • Третий бит — остановить ресивер.

 

Процедуры отправки и приема данных для кадров с полем данных, не превышающим 128 байтов

Как уже было сказано, процедуры отправки и приема коротких кадров реализованы в трансиверах nanoNET аппаратно. В библиотеках демонстрационного программного обеспечения TRXdd 2.01, которое портируется для исполнения в микроконтроллере ATmega32L с таковой частотой 8 МГц, доступен ряд функций, обеспечивающих чтение полученного кадра из трансивера в микроконтроллер по шине SPI или запись новых данных в трансивер для их передачи.

Передача

Передача данных в трансивер, а затем в эфир организована с помощью функции NTRXSendMessage(). Она принимает в качестве параметров указатель на передаваемые данные и их длину. Внутренняя логика функции NTRXSendMessage() описана следующим алгоритмом.

  1. В цикле проверять состояние трансмиттера до тех пор, пока не закончится предыдущая передача (например, контроль состояния бита TxEnd).
  2. Сформировать заголовки кадра (заполнить соответствующие структуры в сегментах 0 и 1 памяти baseband memory).
  3. Записать данные для передачи в сегмент 3.
  4. Начать передачу (выставить бит начала передачи и промаркировать верхнюю и нижнюю половины буфера, как доступные для передачи).

Прием

Прием данных может быть организован либо программным опросом состояния флага RxEnd, либо с помощью прерываний. Авторы используют программный опрос, вызывая функцию чтения и анализа содержимого регистра 0x12 (SRxIntsRawStat). В этом случае алгоритм выглядит следующим образом.

  1. В цикле проверять состояние ресивера до тех пор, пока не закончится успешный прием кадра (контроль состояния бита RxEnd).
  2. Прочитать адреса назначения и отправителя, длину кадра, другую управляющую информацию из регистров в сегменте 0.
  3. Зная длину поля данных, считать их из сегмента 2 и записать их в память микроконтроллера.
  4. Передать функции более высокого уровня (обработчику кадра), указать на полученные данные и их количество.
  5. Включить ресивер на прослушивание.

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

 

Процедуры передачи и приема данных для длинных кадров

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

Основная идея заключается в чтении и записи данных попеременно в обе половины буфера. Например, при передаче, пока в эфир передаются байты из нижней половины буфера трансмиттера (нижняя половина сегмента 3), внешний микроконтроллер может писать их в верхнюю и наоборот. Аналогична ситуация и при приеме данных. После получения заголовков кадра микроконтроллер следит за заполнением половин буфера сегмента 2 и, как только одна из них заполнится поступающими данными, считывает ее содержимое себе в оперативную память и выставляет пометку в регистрах nanoPAN, что данная половина может использоваться для поступления новых байтов из эфира.

Алгоритм передачи длинных кадров

Для добавления возможности передачи длинных кадров достаточно лишь модифицировать функцию NTRXSendMessage().

  1. В цикле проверять состояние трансмиттера до тех пор, пока не закончится предыдущая передача (например, контроль состояния бита TxEnd).
  2. Сформировать заголовки кадра (заполнить соответствующие структуры в сегментах 0 и 1 памяти baseband memory).
  3. Подсчитать количество блоков по 64 байта, разделив общее количество данных на 64 нацело с округлением вверх.
  4. Для каждого блока:
    • если это не первый и не второй по счету блок, то ожидать флага освобождения для записи соответствующей половины буфера (читать регистр статуса прерываний трансмиттера, анализируя значение битов TxBufferRdy), обнулить этот флаг, выставив «1» в регистре сброса прерываний трансмиттера;
    • записать в текущую половину буфера очередные 64 байта (или меньше для последнего блока), внести пометку в регистр управления трансмиттером (биты TxBufferCmd0 или TxBufferCmd1);
    • если это был первый блок, то в регистре управления трансмиттером также выставить бит TxCmdStart (начать передачу);
    • сменить текущую половину буфера (поменять нижнюю на верхнюю, и наоборот).

Таким образом, в работе функции используется обращение к трем регистрам (статуса прерываний трансмиттера, сброса прерываний трансмиттера, управления трансмиттером), а также к двум частям буфера трансмиттера (сегмент 3 для режима Auto/duplex).

Алгоритм приема длинных кадров

Упрощенно алгоритм приема длинных кадров может выглядеть следующим образом.

  1. В цикле проверять состояние ресивера (регистр статуса прерываний ресивера) до тех пор, пока не закончится успешный прием заголовков кадра (контроль состояния бита RxHeaderEnd). Если CRC1 некорректный, то очистить все возникшие прерывания, перейти на пункт 8.
  2. Прочитать адреса назначения и отправителя, длину кадра, другую управляющую информацию из регистров в сегменте 0.
  3. Зная длину поля данных, подсчитать количество блоков по 64 байта, разделив общее количество данных на 64 нацело с округлением вверх.
  4. Для каждого блока:
    • ожидать флага освобождения для чтения (читая регистр статуса прерываний ресивера и анализируя состояние битов RxBufferRdy), обнулить этот флаг, выставив «1» в регистре сброса прерываний ресивера;
    • если возникло событие RxOverfl ow (получали данные из эфира в не свободную для приема половину буфера), то выйти из цикла;
    • читать очередной блок из текущей половины буфера, пометить текущую половину как свободную для дальнейшей записи данных из эфира (регистр управления ресивером, биты RxBufferCmd);
    • сменить текущую половину буфера (поменять нижнюю на верхнюю, и наоборот).
    • Очистить все выставленные прерывания (регистр сброса прерываний ресивера).
    • Если произошло событие RxOverfl ow, то реинициализировать ресивер и выйти из функции.
    • Если выставлен бит RxEnd (регистр статуса прерываний ресивера) и передача была успешной (бит CRC2 выставлен), то передать значение количества полученных данных и указатель на них функции более высокого уровня (обработчику кадра).
    • Снова включить ресивер на прослушивание.

В работе процедуры используется обращение к трем регистрам (статуса прерываний трансмиттера, сброса прерываний трансмиттера, управления трансмиттером), а также к двум частям буфера трансмиттера. Реализация этих пунктов потребует от разработчика модифицировать процедуры NTRXUpdate() и NTRXRxReceive() и добавить еще несколько определений.

При создании модифицированного кода очень рекомендуется пользоваться массивом теневых регистров aShadowReg[], в котором хранятся текущие значения регистров nanoPAN, или функцией NTRXSetRegister(), автоматически обновляющей aShadowReg[]. Это следует делать из следующих соображений. Если, скажем, необходимо выставить только нулевой бит регистра nanoPAN в единицу, а остальные не трогать, то сначала нужно выполнить операцию логического ИЛИ с текущим значением этого регистра aShadowReg[…] | 0x01, и лишь затем осуществлять запись по шине SPI. Также необходимо отметить, что данные алгоритмы приема и передачи длинных пакетов будут работать в случае, если скорость обмена по шине SPI превышает битовую скорость передачи данных в эфире в два или более раз. Иначе будут происходить события TxUnderrun и RxOverflow.

 

Описание экспериментов по передаче и приему длинных кадров

Для тестирования предложенных изменений в функциях приема и передачи кадров и для определения качества связи было создано специальное встроенное программное обеспечение, загружаемое и исполняемое в ATmega32L. Вывод результатов измерений осуществлялся через USART микроконтроллера и COM-порт персонального компьютера.

В микроконтроллере Atmega32L размер оперативной памяти составляет 2 Кбайт, поэтому реализовывать передачу пакетов длиной более 1 Кбайт с проверкой принятых байтов было нецелесообразно. Эксперименты по оценке качества связи проходили следующим образом.

Один из радиомодулей («мастер») периодически генерировал блоки из 1024 кадров; каждый кадр на 1 байт длиннее предыдущего. В первом байте каждого кадра содержался номер текущего блока. Для набора статистики в ходе одного эксперимента «Мастер» посылал 250 блоков.

Второй радиомодуль («слейв») регистрировал успешное получение кадров, обновляя данные в массиве из 1024 байт; номер байта соответствовал размеру полученного кадра. При полу чении очередного кадра значение в соответствующем байте инкрементировалось на 1. Длительность одного эксперимента была в пределах одного часа. По завершении эксперимента модуль «слейв» отсылал значения всех ячеек в массиве в компьютер.

Для передачи пакетов использовался режим без подтверждения приема (без формирования кадра Ack) и без ретрансмиссий.

Результат набора данных в нескольких экспериментах (разные ряды) отображен на рис. 4.

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

По горизонтальной оси отложена длина кадров, по вертикальной — количество безошибочно принятых кадров в пределах одного эксперимента (максимум 250). Качество радиосвязи (стабильность, примерный процент безошибочно принятых кадров) в каждом эксперименте устанавливалось вручную подбором внешних условий, расстояний между радиомодулями, наличием или отсутствием антенн. Скажем, ряд 7 был получен, когда трансиверы находились вблизи друг друга, и оба были оснащены антеннами. А фотография на рис. 5 соответствует условиям плохой связи (например, ряд 1 или ряд 6 на рис. 4): к устройству «мастер» антенна не подключена.

Моделирование различных условий радиосвязи

Возвращаясь к данным, представленным на рис. 4, можно отметить подтверждение ожидавшегося факта: вероятность ошибочной передачи кадра зависит от его длины. Чем длиннее последовательность передаваемых битов, тем выше вероятность ошибки приема всего блока информации. Причем даже вид зависимости различен для разных условий по взаимным уровням помех и сигнала. Для сильного сигнала (например, ряд 5) разница в процентах потерь коротких и длинных кадров составляет 15%, тогда как для сильно зашумленной радиообстановки (ряды 1 и 6) — несколько раз.

Кроме варьирования расстояний между радиомодулями и изменения антенных трактов авторы пытались смоделировать условия небольших кратковременных электромагнитных помех в диапазоне ISM 2,4 ГГц. В момент работы пары «мастер-слейв» на протяжении всего цикла измерений были включены микроволновая бытовая печь (в режиме разморозки продуктов) в соседнем помещении, а также КПК в режиме поиска устройств Bluetooth и установлен канал связи между КПК и ноутбуком по радиоинтерфейсу WiFi. Все эти три «источника помех» являются импульсными, работают в данном радиочастотном интервале и по уровню сигнала должны мешать передаче в стандарте nanoNET.

Необходимо отметить, в эксперименте, когда nanoNET-трансиверы с подключенными антеннами находились вблизи друг друга, процент потерь составил примерно 2 и 5% для коротких и длинных кадров размером 1 кбайт соответственно. Это примерно соответствует наклону для ряда 5 (на рис. 4), чуть приподнятого по вертикальной оси, причем на графиках не было замечено никаких характеристических провалов и всплесков.

К сожалению, не удалось зарегистрировать подобные кривые в условиях электромагнитного «смога», существующего вблизи развернутых беспроводных инфраструктур IT-центров или технопарков. Есть лишь предварительные данные, свидетельствующие о резком уменьшении дальности устойчивой связи со 100 до 10–20 метров для nanoNET в таких зонах. Опять же полагаем, что даже в условиях таких серьезных помех (высокого уровня шума) эта технология по устойчивости связи должна заметно превосходить конкурентов вследствие уникального линейного частотного кодирования, применяющегося для передачи каждого бита.

Диаграмма на рис. 6 демонстрирует нестабильность качества радиосвязи во времени. Диаметр цветной окружности для каждой серии измерений показывает примерную величину разброса точек внутри серии. Центр окружности соответствует значению ординаты кривой для кадров длиной 0,5 кбайт. Верхнее и нижнее плечи погрешности характеризуют величину экспоненциального прогиба зависимости (например, сравните ряды 1 и 2 на рис. 4).

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

Данные во всех восьми временных отрезках продолжительностью примерно в 1 час были получены последовательно друг за другом при неизменном взаимном положении трансиверов и локального окружения. Период измерений — вечер и ночь.

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

 

Выводы

  1. При разработке приложений, использующих цифровую радиопередачу, следует всегда принимать во внимание возможность как кратковременного ухудшения связи (до нескольких секунд), так и возникновение достаточно длительного повышенного шумового фона.
  2. Учитывая условия плохой связи (а они в дальнейшем постоянно будут ухудшаться в связи с технологическим прогрессом), во многих случаях следует передавать информацию маленькими порциями, поскольку это увеличит общую пропускную способность благодаря уменьшению количества ретрансмиссий.
  3. При передаче длинных кадров не имеет смысла использовать автоматическую функцию ретрансмиссии кадров (в случае неполучения кадра подтверждения Ack). Связано это с тем, что формированием потока битов, отправляемых в эфир, занимается внешний микроконтроллер, которому сложно (или в принципе невозможно) наверняка определить, был отослан предыдущий кадр с ошибкой или без. Если все-таки возникает необходимость контроля подтверждения переданных кадров, его необходимо реализовывать программно, используя для этого несколько байтов поля данных очередного пакета.

Авторы благодарят Е. Д. Жиганова (Петрозаводский государственный университет) за высказанные критические замечания.

Данное исследование проведено в рамках проекта «Научно-образовательный центр по фундаментальным проблемам приложений физики низкотемпературной плазмы» (RUX0-013-PZ-06), поддерживаемого Министерством образования и науки РФ, Американским фондом гражданских исследований и развития (CRDF) и Правительством Республики Карелия, а также частично финансировалось Техническим Научно-исследовательским Центром Финляндии (VTT) в рамках договорных работ.

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

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