В статье рассмотрены основные методы защиты данных от ошибок при передаче по каналу с сильным шумом. Приведены примеры использования.
При передаче данных в условиях высокого внешнего шума возникают ошибки, даже если используются качественные компоненты и датчики. Источники шума разнообразны. Это может быть электромагнитное излучение от оборудования и двигателей, помехи от передачи по радиоканалу или электросети 50–60 Гц и т.д. В статье рассмотрено влияние шума на цифровые данные при передаче сигнала от датчика или АЦП в микроконтроллер (МК).
Для обнаружения ошибок, вызванных шумом, используются четыре основных метода:
– добавление бита четности;
– вычисление контрольной суммы;
– многократная передача;
– циклический контроль избыточности (CRC).
Рассмотрим достоинства и недостатки каждого подхода на примере интерфейсной схемы AFE LMP90100, в которой корректность принимаемых данных оценивается по CRC.
Микросхема LMP90100, разработанная Texas Instruments, обеспечивает высокоточный интерфейс для датчика с 24-разрядным АЦП. При использовании в промышленной среде, где помехи очень сильные, рекомендуется располагать LMP90100 близко к датчику, чтобы обеспечить целостность поступающего с него аналогового сигнала. Между LMP90100 и МК могут создаваться длинные линии связи. В этом случае вероятность того, что внешний шум исказит исходные данные, увеличивается.
Внешние помехи могут провоцировать появление ошибок в любой части передаваемых данных. Например, при передаче 10000000b (0x80) по зашумленному каналу МК может принять значение 00000000b (0x00), либо 100000001b (0x81). Второй случай не так опасен, как первый, когда данные значительно отличаются от истинных.
Предположим, что микросхема LMP90100 считывает данные с термопары и пересылает их в МК. Изменение в любом из разрядов МК интерпретирует как изменение температуры и предпринимает ответные действия. Однако необходимо проверить, не вызвано ли изменение данных помехами.
Перед передачей данных подсчитывается количество единиц в байте, затем добавляется девятый разряд, называемый битом четности. Существует два типа битов четности: четный и нечетный. Если используется четный бит, то дополнительный девятый бит подбирается так, чтобы общее количество единиц в байте было четным. В таблице 1 приведены примеры использования двух типов битов четности. В первой строке в байте данных содержатся 4 единицы, поэтому четный бит четности принимает значение 0, нечетный — 1.
Исходные данные |
Четный бит |
Нечетный бит |
10010101 |
0 10010101 |
1 10010101 |
11100000 |
1 11100000 |
0 11100000 |
10101101 |
1 10101101 |
0 10101101 |
Использование битов четности является самым простым методом защиты от шума. Он добавляет мало служебной информации, всего один бит на байт данных. В то же время по биту четности можно выявить только единичные ошибки. Случаи, когда сразу два разряда меняют свои значения, будут пропущены.
Метод контрольной суммы применяется к большому объему данных (больше 1 байта). Для вычисления контрольной суммы (КС) необходимо сложить данные и отбросить разряды переполнения. Далее к полученной сумме причисляется дополнение, которое передается вместо исходных данных. Получив данные, приемник складывает их с КС и отбрасывает бит переполнения.
Если в результате получается нулевой байт, принятые данные верны. В противном случае они содержат ошибку, тогда приемник выставляет запрос на повторную передачу. Этот метод также просто реализовать, хотя он характеризуется большей избыточностью, чем добавление бита четности.
КС не позволяет выявить случаи, когда биты данных меняются местами, или если добавляются или теряются нулевые байты. В таблице 2 показан принцип вычисления контрольной суммы. Видно, что при появлении ошибки сложение принятых данных с контрольной суммой не дает в результате ноль.
|
Корректные данные |
Данные с ошибками |
Перестановка байтов |
Удаление нулевого бита |
Данные |
10101010 |
10101010 |
10101010 |
10101010 |
|
00000000 |
00000000 |
00000000 |
10001000 |
|
10001000 |
00001000 |
10001001 |
10001001 |
|
10001001 |
10001001 |
10001000 |
|
Сумма |
10111011 |
00111011 |
10111011 |
10111011 |
Контрольная сумма |
01000101 |
01000101 |
01000101 |
01000101 |
Итог |
00000000 |
10000000 |
00000000 |
00000000 |
Наиболее надежный способ избежать ошибок — сравнивать все переданные данные. Это можно сделать двумя способами: либо приемник возвращает полученные данные в передатчик, либо передатчик пересылает данные несколько раз.
В первом случае переданные и принятые данные сравниваются в передатчике. Если они не совпадают, констатируется возникновение ошибки, и передача повторяется. Во втором случае данные сравниваются в приемнике. Если они не совпадают, запрашивается повторная передача.
Многократная передача — самый надежный способ предотвращения приема ошибочных данных, однако он слишком нерационален при обмене большим объемом данных.
Данный метод (CRC) похож на предыдущий. Сначала вычисляется контрольная сумма, которая передается вместе с информационными данными. Приемник проводит те же вычисления с принятыми данными и сравнивает свой результат с принятой КС. Если они совпадают, данные с высокой степенью вероятности приняты корректно. Данный метод имеет простую схемотехническую реализацию, поэтому широко применяется. При необходимости можно отключить передачу CRC.
Рассмотрим пример. Пусть данные каждой выборки LMP90100 передаются по последовательной шине в условиях сильного шума кусками по 24 бита. Контрольная сумма должна содержать 8-разрядов. Для вычисления CRC используется генератор полиномов. Полином должен быть на один бит длиннее, чем CRC. Для LMP90100 используется многочлен восьмого
порядка: x8 + x5 + x4 + 1. Использование многочлена первого порядка (x + 1) эквивалентно добавлению бита четности. Порядок многочлена обычно не превышает 64. Для USB используется полином пятого порядка: x5 + x2 + 1. Для Bluetooth многочлен еще большего порядка: x16 + x12 + x5 + 1, для Ethernet — 32-го порядка.
Для вычисления СRC полином представляется в двоичной форме. В нашем случае полином выглядит следующим образом: 100110001 (коэффициент при x8 равен 1, при x7 равен 0 и т.д.). Передаваемые данные сдвигаются влево на столько разрядов, сколько их в CRC, освободившиеся разряды справа заполняются нулями. Пусть исходные данные имеют вид: 0101 0101 1000 1001 0100 1011. Сдвигаем их на 8 бит, получаем 0101 0101 1000 1001 0100 1011 0000 0000. Для наглядности принцип формирования CRC показан на рисунке 1. Под измененными данными пишется полином в двоичной форме. Старшая единица полинома помещается под первой слева единицей данных. Выполняется сложение по модулю 2. Нули слева отбрасываются. Затем снова под первой единицей остатка располагается полином и выполняется сложение по модулю 2. Процедура повторяется до тех пор, пока левая единица остатка не займет восьмой или младше разряд.
32 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
↓ Добавленные нули |
|||||||||||||||||||||||||||||||
0 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
← Полином |
||||||||||||||||||||||
0 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
|||||||||||||||||||||||
0 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|||
1 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
|||||||||||||||||||||||
0 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
||||
1 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
|||||||||||||||||||||||
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
||||||
1 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
|||||||||||||||||||||||
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|||||||
1 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
|||||||||||||||||||||||
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
||||||||||||||
1 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
0 |
||||||||||||||||||||||
0 |
0 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
||||||||||||||||||
1 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
|||||||||||||||||||||||
0 |
1 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
||||||||||||||||||||
1 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
|||||||||||||||||||||||
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
|||||||||||||||||||||
1 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
|||||||||||||||||||||||
CRC → |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
|||||||||||||||||||||||
Полученная контрольная сумма СRC передается вместе с данными. Здесь есть тонкость. Для нулевых данных 0x000000 CRC равна 0x00, т.е. передатчик будет передавать нулевой сигнал 0x00000000 (три байта данных и CRC). Чтобы избежать недоразумений, особенно в случае многократной передачи, вместо CRC передается дополнение к ней. Тогда передаваемое значение будет равно 0x000000FF.
Данные АЦП в LMP90100 хранятся в регистрах 0x1A, 0x1B и 0x1C. Дополнение CRC сохраняется в регистрах 0x1D, чтобы МК считал полное значение. В МК выполняются те же операции с данными, что и в LMP90100. Контрольные суммы сравниваются. При несовпадении запрашивается повторная передача.
Целостность передаваемых данных имеет большое значение. В условиях высокого шума она может быть нарушена, поэтому необходимо применять противодействующие меры. Мы рассмотрели, как проводится циклический контроль избыточности в интерфейсе датчика LMP90100.