Концепция пакетирования: высокоуровневая синхронизация для каналов данных
Рассмотрим (из-за отсутствия лучшего термина) пакетирование – технологию, которая обеспечивает надежную передачу данных в оптических, радиочастотных и дальних цифровых системах связи.
Битовый уровень против высокого уровня
Для успешной передачи двоичных данных требуется какой-либо метод синхронизации между передатчиком и приемником. Возможно, более знакомый тип синхронизации – это то, что я буду называть синхронизацией на уровне битов. Это относится к тому факту, что приемник не может правильно интерпретировать цифровые данные, если он не знает, когда делать выборку входящего сигнала.
Синхронизация битового уровня часто достигается посредством общего внешнего тактового сигнала. В случае интерфейса UART для достижения синхронизации на уровне бит используются два отдельных внутренних тактовых сигнала.
Тем не менее, существует еще один тип синхронизации, который не менее критичен, но не всегда очевиден. Я буду рассматривать его как высокоуровневую синхронизацию – это термин, который достаточно расплывчат, чтобы охватить различные конкретные ситуации передачи данных, которые я имею в виду.
Единицы и нули против данных
Синхронизация на уровне битов гарантирует, что приемник надежно интерпретирует каждый переданный ноль или единицу как отдельный ноль или единицу. Но мы редко (если вообще) имеем дело с цифровым интерфейсом связи, в котором приемник принимает последовательность «потока сознания» из единиц и нулей, которые могут начинаться и заканчиваться в любое время без ущерба для работоспособности системы.
Скорее двоичные данные организованы в последовательные группы, и для успешной передачи данных требуется, чтобы приемник определял как отдельные двоичные значения, так и исходную организацию этих двоичных данных. Стандартный способ облегчить эту организованную передачу данных (другими словами, стандартный способ достижения высокоуровневой синхронизации) – это использование пакетов.
Пакеты, пакеты везде
Не верьте мне на слово; пусть устройства и профессиональные протоколы интерфейсов говорят сами за себя. USB, TCP/IP, встроенные радиочастотные приемопередатчики, шина CAN, Wi-Fi... Все они используют пакетную передачу данных.
Концепция пакетирования представляет собой простой и интуитивно понятный подход к достижению высокоуровневой синхронизации, но она не всегда необходима. Я думаю, что общая идея здесь становится более ясной, если мы сначала обсудим ситуации, когда высокоуровневая синхронизация достигается без пакетирования.
Альтернатива
Если вы использовали SPI, вы знаете, как передавать организованные данные без использования пакетов. SPI имеет дополнительный сигнал, известный как выбор ведомого или выбор чипа. Приемное устройство знает, что первый бит, следующий за активным фронтом сигнала выбора чипа, является первым битом последовательной группы единиц и нулей. Все следующие биты организованы в отдельные байты, поля, биты состояния и так далее на основе установленного протокола.
Я хочу сказать, что дополнительный сигнал высокоуровневой синхронизации может устранить необходимость в полноценном пакетировании. Но дополнительный сигнал часто является необязательным: как правило, радиочастотные, оптические системы и проводные системы дальней связи включают всю необходимую синхронизацию в один передаваемый сигнал.
Анатомия пакета
Я не решаюсь делать конкретные заявления о технологии, которая может быть адаптирована к такому большому разнообразию приложений; тем не менее, я считаю справедливым сказать, что основными компонентами пакета являются преамбула (также известная как тренировочная/синхронизирующая последовательность), полезная нагрузка и контрольная сумма.
Преамбула
Допустим, у вас есть 100-байтовый пакет. Каждый байт интерпретируется предопределенным способом (например, байт состояния, байт выбора режима, первый байт в 32-битовом значении показания датчика и т.д.). Теперь представьте, что приемник не распознает наличие переданных данных до второго бита; другими словами, первый бит будет пропущен. Что будет в результате? Будут потеряны все 100 байтов, потому что каждый полученный байт будет состоять из последних 7 битов одного байта и первого бита следующего байта. Этот пример демонстрирует важность эффективной преамбулы.
Преамбула дает приемнику время и информацию, необходимые для подготовки всех мер, необходимых для правильной интерпретации входящих данных.
- Во время преамбулы должна выполняться синхронизация битового уровня. В качестве примера, радиочастотный канал данных может использовать в качестве преамбулы двоичную последовательность 10101010, поскольку повторяющиеся переходы помогают приемнику определить начало модулированного бита.
- Если приемник полагается на автоматическую регулировку усиления (АРУ, AGC, automatic gain control), начало пакета может оказаться непригодным, поскольку для схемы АРУ требуется найти подходящий коэффициент усиления. Преамбула гарантирует, что АРУ может выставиться до прибытия полезной нагрузки.
- Мы должны иметь в виду, что приемнику не всегда легко узнать, принимает ли он сигнал или шум. Радиочастотная связь, работающая вблизи своей максимальной дальности, может дать в результате довольно плохой (и/или зашумленный) демодулированный сигнал, а приемник затем должен как-то понять, что шум (который он, возможно, продолжал обрабатывать вместе с действительным сигналом) должен быть заменен действительной передачей. Когда каждый отдельный пакет начинается с одинаковой последовательности битов, приемник может безопасно игнорировать все шумовые биты, которые обычно будут случайными, и поэтому маловероятно будут совпадать с преамбулой.
Полезная нагрузка
Полезная нагрузка – это действительные данные, которые передатчик хочет отправить приемнику. Это последовательности битов, которая должна интерпретироваться приемником в соответствии с установленной структурой пакета.
Связанная с этим проблема, о которой я расскажу здесь, – это длина пакета. Сколько байтов полезной нагрузки должно быть включено в один пакет? Оптимальное число зависит от характеристик системы. Вот несколько факторов, которые следует учитывать:
- Вы ожидаете частых битовых ошибок? Если это так, то более короткая длина пакета является предпочтительной, поскольку один перевернутый бит вызовет сбой контрольной суммы, а сбой контрольной суммы означает, что весь пакет будет отброшен.
- Вы пытаетесь максимизировать скорость передачи данных? Если это так, то вам нужны более длинные пакеты, потому что каждый пакет вводит служебные биты, которые уменьшают среднюю скорость передачи значимых (т.е. полезных) данных.
- У вашего приемного устройства ограниченная память? Мне кажется, что вы, как правило, хотите, чтобы приемник мог хранить весь пакет. Кроме того, если вы работаете с программным радиоприемником, вы можете предпочесть пакеты, которые достаточно коротки, чтобы допустить хранение в памяти оцифрованного сигнала основной полосы для всего пакета; это позволит вам использовать процессор, недостаточно мощный для декодирования сигнала основной полосы частот в реальном времени.
Контрольная сумма
Очевидно, что мы не создаем канал передачи данных для передачи ошибочных данных. Но ошибки – это неизбежная реальность цифровой связи, поэтому нам нужно что-то, что поможет нам отбрасывать данные, которые были повреждены во время передачи. Контрольная сумма представляет собой байт (для более коротких пакетов) или последовательность байтов (для более длинных пакетов), которые позволяют приемнику обнаруживать ошибки в полученных данных.
Широко используемым и высокоэффективным механизмом обнаружения ошибок является циклический избыточный код CRC.
Заключение
Даже базовый интерфейс UART может воспользоваться технологиями, связанными с пакетированной передачей данных, и вам определенно нужно подумать о пакетировании для таких амбициозных проектов, как специализированный радиочастотный канал передачи данных. Просто помните, что пакетирование – это не технология для авторитетов, разрабатывающих такие протоколы, как USB и IEEE 802.11, а скорее это простая и универсальная концепция, которая станет ценным дополнением ко многим цифровым системам связи.