Загальні положення

Сімейство пристроїв з однопровідним інтерфейсом фірми Dallas Semiconductor відрізняє та особливість, що звязок з ними здійснюється через єдиний провід допомогою спеціальної системи команд, званої однопровідним протоколом Відмінною рисою кожного з цих пристроїв є вбудоване 8-байтное ПЗУ, що містить унікальний ідентифікаційний код пристрою Вміст цього 8-байтного коду показано на рис 26

Рис 26 Зміст 8-байтного ПЗУ (ЗЗР старший значущий розряд МЗР молодший значущий розряд)

Молодший байт містить код, який свідчить про приналежність до сімейства пристроїв з однопровідним інтерфейсом, визначаючи одночасно функціональне призначення приладу Наприклад, DS1820 має код 10h, DS1990A код 01h, DS1991 код 02h і тд. Оскільки до одного комунікаційному проводу може бути підключено відразу кілька пристроїв різного функціонального призначення, процесор повинен мати можливість безпомилково розібратися, які саме пристрої підключені Код приналежності допомагає вирішити цю задачу Наступні 6 байт ПЗУ містять унікальний серійний номер конкретного екземпляра, що дозволяє відрізнити його від інших пристроїв даного сімейства Цей 48-бітовий код можна розглядати як індивідуальний адресу пристрою Старший байт ПЗУ містить результат перевірки істинності даних циклічним надлишковим кодом ЦВК (cyclic redundancy check CRC) Цей код обчислюється на основі вмісту попередніх

семи байтів Коли процесор починає сеанс звязку з влаштуванням, він першим ділом читає 8 байт ПЗУ цього пристрою, причому молодший значущий біт читається першим Якщо ЦВК, розрахований процесором на основі прийнятих даних (семи молодших байтів), збігається з вмістом 8-го байта ПЗУ, то вважається, що дані прийняті вірно Якщо ці значення не збігаються, то процес читання ПЗУ повторюється

Деякі з пристроїв, на додаток до восьми байтам ПЗУ, мають до 64Кбайт оперативного памяті (ОЗУ), доступ до якого здійснюється за допомогою спеціальних команд Дані в цю память записуються процесором звичайним чином, потім до них додається розрахований процесором ЦВК і також записується в ПЗУ пристрою При отриманні (читанні) даних з пристрою процес зворотний Процесор, прийнявши дані від пристрою, розраховує на їх основі ЦВК і порівнює його зі значенням, збереженим в памяті пристрою як ЦВК даних Якщо значення ЦВК однакові, то дані прийняті вірно Щоб повною мірою скористатися перевагами, що даються даною системою перевірки істинності, потрібно зрозуміти, що вона собою представляє і як працює Крім того, необхідно освоїти практичний метод розрахунку значень ЦВК процесором як у програмній, так і в апаратній реалізації

Перевірка на істинність послідовних даних може здійснюватися різними способами Поширеним способом є включення в кожен перевірявся пакет даних додаткового біта, що вказує на наявність або відсутність помилки Наприклад, при передачі 8-бітових пакетів ASCII символів до кожного 8-бітовому пакету додається один біт (біт паритету), який вказує, є чи немає помилки при передачі цього пакета Припустимо, що пакет даних складається з бітової рядки 11010001 Девятий біт додається з таким розрахунком, щоб сумарна кількість бітів, що містять одиницю, було непарним Таким чином, в наведений вище бітовий пакет повинна бути додана одиниця Тепер він буде виглядати як 111010001 Підкреслений символ являє собою додатковий біт, так званий біт паритету, що вводиться для того, щоб зробити сумарна кількість одиничних бітів в 9-бітовому пакеті непарних Якщо приймач прийняв пакет 111010001, то дані передані і прийняті вірно Якщо ж приймач прийняв, наприклад, 111010101, де сьомий зліва біт прийнятий невірно, то загальна кількість одиниць в пакеті вже не буде непарних, що свідчить про наявність помилки Виявивши помилку, приймач зробить відповідні дії Така схема називається перевіркою на непарність Можна домовитися про те, щоб загальна кількість одиниць в пакеті було парним Ця схема називається перевіркою на парність Обидві схеми, на жаль, можуть виявити тільки непарна кількість бітових помилок Якщо в розглянутому щойно прикладі пакет буде пошкоджений відразу в 6-м і 7-м бітах, тобто буде прийнята послідовність 111011101, то контроль паритету по непарності не виявить помилки, так як загальна кількість одиничних бітів буде непарним Зазначена помилка не буде виявлена ​​і у випадку контролю на парність

Однопровідна ЦВК фірми Dallas Semiconductor

Схема перевірки істинності потоку даних, заснована на обчисленні циклічного надмірного коду, є найбільш ефективною при локалізації помилок і вимагає мінімальних апаратних витрат Опишемо застосовувану Dallas Semiconductor схему визначення помилок, не наводячи складних математичних обгрунтувань методу Роботу схеми найпростіше пояснити на прикладі її апаратної реалізації Апаратно схема являє собою зсувний регістр зі зворотним звязком (рис 27)

Рис 27 Апаратна реалізація 8-бітового алгоритму перевірки істинності даних циклічним надлишковим кодом,

відповідна поліноміальної функції X + X + X +1

Процедуру виділення помилки часто описують у вигляді поліноміальної функції формальної змінної X Показники ступеня ненульових членів цього полінома показують, на які розряди зсувного регістру замикаються петлі зворотного звязку Число розрядів зсувного регістру (в апаратній реалізації) або ступінь полінома (при математичному описі) визначають розрядність обчислюваного ЦВК Зазвичай при цифровому обміні даними використовують 16разрядние ЦВК Dallas Semiconductor при читанні 64-бітових ПЗУ своїх пристроїв використовує 8-розрядні ЦВК 64-бітовий код ПЗУ складається з 8-бітового коду приналежності до сімейства пристроїв, підтримуючих Однопровідна інтерфейс, 48-бітового серійного номера пристрою і 8бітового ЦВК, розрахованого на основі перших 56 бітів вмісту ПЗУ ЦВК міститься в старшому байті ПЗУ Розташування точок входу петель зворотного звязку, позначених на рис 27 логічними елементами виключає АБО (або, що те ж саме, ступеня ненульових членів полінома), визначає властивості ЦВК і здатність алгоритму виявити певні класи помилок при передачі даних Алгоритм, наведений на рис 27, здатний розпізнати наступні класи помилок:

• Будь-яке непарне число помилок у будь-якому місці 64-бітової остан едовател ьности

• Всі подвійні помилки (помилки в двох суміжних бітах) в будь-якому місці 64-бітової послідовності

• Будь-які кластери помилок в межах 8-бітового вікна, тобто кластери, що містять від 1 до 8 неправильних бітів

• Більшість кластерних помилок з розмірами кластера, що перевищують 8 біт

Вхідні дані подаються на один з входів двухвходового логічного елемента виключає АБО (XOR) До другого входу цього елемента підключається вихід старшого розряду 8-розрядного зсувного регістру (Рис 27) Математично зсувний регістр може розглядатися як схема поділу Вхідні дані це ділене, а зсувний регістр з ланцюгами зворотного звязку служить дільником Ціла частина отриманого приватного відкидається, а залишок являє собою шуканий ЦВК, який опиниться в сдвиговом регістрі, як тільки останній біт даних пройде на вхід З такого апаратного опису алгоритму видно, що результат (Значення ЦВК) дуже складним чином залежить від передісторії контрольованої послідовності бітів Тому комбінації помилок, здатні пройти непоміченими через такий контроль, дуже рідкісні

У табл 21 показаний покроковий розрахунок ЦВК вихідної 64бітовой послідовності Кожен рядок лівого стовпця відображає вміст зсувного регістру після подачі на вхід чергового біта з 64-бітової послідовності пересилаються Першим на вхід подається молодший біт молодшого байта На початку процедури всі біти зсувного регістру скинуті (тобто являють собою нулі) Розрахунок починається подачею молодшого біта 64-бітової послідовності У цьому прикладі молодший байт дорівнює 02h і являє собою код приналежності до сімейства пристроїв з однопровідним інтерфейсом Після того як останній, 56-й біт (код приналежності + Серійний номер) буде введений в зсувний регістр, в ньому виявиться число 10100010 (або A2h в 16-ричном вираженні) Це і буде ЦВК для введеної послідовності з 56 бітів Якщо це число використовувати в якості вхідної послідовності для наступних восьми кроків, то в результаті в сдвиговом регістрі залишаться одні нулі Іншими словами, якщо ви перевіряєте повне 64-бітове ПЗУ, що зберігає у своєму старшому байті ЦВК перших 56 біт, то, не обмежуючись при введенні 56-у бітами, а вводячи всі 64, отримаєте очищений зсувний регістр (всі нулі) Зазначений факт є властивістю описуваного алгоритму Його можна сформулювати і в більш загальній формі Якщо будь-яке 8-бітове число, що знаходиться в даний момент в сдвиговом регістрі, використовувати як вхідної послідовності для наступних 8 кроків зсуву, то результатом буде очищений регістр, всі розряди якого містять нуль Це можна пояснити наступним чином При описаному вище умови (рівність вмісту регістра і вхідної послідовності) вихід старшого розряду регістра (8-й крок) завжди буде дорівнювати вхідному биту даних, а на виході логічного елемента виключає АБО завжди буде нуль Цей нуль по ланцюгу зворотного звязку надходить в молодший розряд зсувного регістру (1-й крок) При надходженні на вхід наступного біта нульовий біт молодшого розряду регістра зрушиться в наступний розряд, а на його місце надійде нульової ж біт з виходу елемента Виключає АБО. Після восьми таких кроків у всіх розрядах зсувного регістру виявляться нулі Структура 64-бітового ПЗУ в однопровідна пристроях Dallas Semiconductor використовує вказане властивість для спрощення апаратного забезпечення пристроїв, що застосовуються для читання ПЗУ Зсувними регістр читає пристрої очищається, а потім читаються 64 біта данни1х з ПЗУ контрольованого пристрою, включаючи і байт ЦВК Якщо дані прочитані вірно, то регістр читає

пристрою буде знову містити нулі, що легко

фіксується Якщо ж у сдвиговом регістрі виявиться

ненульове значення, операцію читання потрібно повторити

Таблиця 21 Приклад розрахунку ЦВК 64-бітової послідовності

Зміст 64-бітового ПЗУ: А200000001В81С02 Hex Код сімейства:

О 2 Шестнадцітірічний (Hex)

0000 0010 Двійковий (Bin)

Серійний номер:

00000001В81С Hex

0            0000 0000 0000 0000 0000 0000 0001 1011 1000 0001 1100 Bin

ЗНАЧЕННЯ ЦВК

ВХІДНА

ЗНАЧЕННЯ

00000000

0

00000000

1

10001100

0

2

01000110

0

00100011

0

10011101

0

11000010

0

0

01100001

0

10111100

0

01011110

0

00101111

1

з

00010111

1

00001011

1

00000101

0

10001110

0

1

01000111

0

10101111

0

11011011

0

11100001

0

8

11111100

1

11110010

1

11110101

1

01111010

0

в

00111101

1

00011110

1

10000011

0

11001101

0

1

11101010

0

01110101

0

10110110

0

01011011

0

0

10100001

0

11011100

0

01101110

0

00110111

0

0

10010111

0

11000111

0

11101111

0

11111011

0

0

11110001

0

11110100

0

01111010

0

00111101

0

0

10010010

0

01001001

0

10101000

0

01010100

0

0

00101010

0

00010101

0

10000110

0

01000111

0

0

10101101

0

11011010

0

01101101

0

10111010

0

0

01011101

0

10100010 = А2Н = ЦВК для [00000001 В81С (Серійний номер) + 02 (Код сімейства)]

10100010

0

01010001

1

00101000

0

2

00010100

0

00001010

0

00000101

1

00000010

0

А

00000001

1

00000000 = ООН = ЦВК для [А2 (ЦВК) + 00000001 В81С (Серійний номер) + 02 (Код сімейства)]

До цих пір ми обговорювали апаратну реалізацію процесу обчислення ЦВК Але можна обчислити ЦВК і програмним способом У табл 22 наведено асемблерний код такої процедури Операція XRL над вмістом регістра А і константою 18h відповідає в апаратній реалізації наявності логічних елементів виключає АБО на входах четвертого і пятого розрядів зсувного регістру (див рис 27)

DOCRC:

PUSH

ACC

Зберігаємо акумулятор

PUSH

У

Зберігаємо регістр В

PUSH

ACC

Зберігаємо біти, підлягають зрушенню

MOV

В, # 8

встановлюємо зсув = 8 біт

CRCLOOP:

XRL

RRC

A,CRC

A

підраховуємо ЦВК

MOV

A,CRC

Отримуємо останнім значення ЦВК

JNC

ZERO

Пропускаємо, якщо дані = 0

XRL

A,#18H

Оновлюємо значення ЦВК

ZERO:

RRC

A

Позиціонуємо новийЦІК

MOV

CRC,A

Запамятовуємо новий ЦВК

POP

ACC

Отримуємо залишилися біти

RR

A

Позиціонуємо наступний біт

PUSH

ACC

Зберігаємо залишилися біти

DJNZ

B,CRC LOOP

Повторюємо для 8-ми бітів

POP

ACC

Очищаємо стек

POP

У

відновлюємо регістр В

POP

RET

ACC

Відновлюємо

Акумулятор

Іншим програмним рішенням є створення таблиці перетворення, визначальною звязок між будь-яким поточним 8-бітовим значенням регістра ЦВК і будь-яким 8бітовим відрізком вхідних даних У простому випадку, коли поточне значення регістра ЦВК одно 00h, можна розрахувати 256 можливих бітових комбінацій вхідного байта і розмістити їх в матриці, де індекс матриці дорівнюватиме значенню вхідного байта (тобто індекс пробігатиме значення від 0 до 255, і число, розміщене в i-й позиції, дорівнюватиме i) Можна показати, що якщо поточне значення регістра ЦВК відмінно від нуля, то для будь-якого заданого значення ЦВК і будь-якого вхідного байта таблиця перетворення складатиметься з тих же 255 значень, але розставлених в таблиці відповідно до формули:

Нове значення ЦВК = Таблиця (i),

де i = (Поточне значення ЦВК) XOR (Вхідний байт)

Коли поточне значення ЦВК одно 00h, дана формула призводить до описаного вище найпростішого нагоди Друге програмне рішення скорочує час розрахунку, так як операції проводяться не над бітами, як в першому варіанті, а над байтами Однак у цьому випадку потрібно 256 байт додаткової памяті для розміщення таблиці перетворення Для першого варіанту програмного рішення память потрібна тільки для розміщення програмного коду Приклад програмного коду для другого варіанту наведено в табл 23 Табл 24 ілюструє використання методу таблиці перетворення на вже наводив раніше прикладі Два властивості алгоритму обчислення ЦВК можуть допомогти в налагодженні програмного коду Перше з них вже згадувалося при описі апаратної реалізації алгоритму, а саме: якщо поточне значення регістра ЦВК використовувати в якості наступного вхідного байта, то в результаті в регістрі ЦВК виявляться одні нулі Друга властивість полягає в тому, що якщо в якості вхідної послідовності використовувати байт, інверсний байту, що міститься в даний момент в регістрі ЦВК, то через вісім кроків у регістрі ЦВК виявиться число 35h (53 в десятковому вираженні) Ця процедура показана в табл 25

Var

CRC : Byte Procedure Do^CRC(X: Byte)

{

Ця процедура обчислює ЦВК для всіх байтів, що проходять через однопровідну шину Результат накопичується в глобальній змінній CRC

}

Const

Table : Array[0..255] of Byte = (

0,                              94,       188,       226,       97,       63,       221,       131,      194,      156,      126,       32,       163,      253,                                31,       65,

157,                         195,      33,        127,      252,      162,       64,        30,       95,         1,       227,       189,       62,       96,                                130,      220,

35,                           125,      159,       193,       66,       28,       254,       160,      225,      191,      93,         3,        128,      222,                                60,       98,

190,                         224,       2,         92,       223,      129,       99        61,       124,       34,       192,       158,       29,       67,                                161,      255,

70,                            24,       250,       164,       39,       121,      155,       197,      132,      218,      56,        102,      229,      187,                                89,        7,

219,                         133,      103,       57,       186,      228,        6,         88,       25,        71,       165,       251,      120,      38,                                196,      154,

101,                          59,       217,       135,        4,        90,       184,       230,      167,      249,      27,        69,       198,      152,                                122,      36,

248,                         166,      68,        26,       153,      199,       37,        123,      58,       100,      134,       216,       91,        5,                                231,      185,

140,                         210,      48,        110,      237,      179,       81,        15,       78,        16,       242,       172,       47,       113,                                147,      205,

17,                            79,       173,       243,      112,      46,       204,       146,      211,      141,      111,       49,       178,      236,                                14,       80,

175,                         241,      19,        77,       206,      144,      114,       44,       109,       51,       209,       143,       12,       82,                                176,      238,

50,                           108,      142,       208,       83,       13,       239,       177,      240,      174,      76,        18,       145,      207,                                45,       115,

202,                         148,      118,       40,       171,      245,       23,        73,        8,        86,       180,       234,      105,      55,                                213,      139,

87,                             9,       235,       181,       54,       104,      138,       212,      149,      203,      41,        119,      244,      170,                                72,       22,

233,                         183,      85,        11,       136,      214,       52,        106,      43,       117,      151,       201,       74,       20,                                246,      168,

116,                          42,       200,       150,       21,       75,       169,       247,      182,      232,      10,        84,       215,      137,                                107,      53)

Begin

CRC : = Table[CRC xor X]

End

Таблиця 24 Використання методу таблиці перетворення для обчислення ЦВК (у прикладі наведені ті ж вихідні дані, що і в табл 21)

Поточне значення ЦВК (= поточним табличному індексом)

Вхідні

дані

Новий індекс (= результату операції Поточний ЦВК XOR Вхідні дані)

Нова позиція (індекс) в таблиці (= новому значенню ЦВК)

00000000 = ООН

00000010 = 02н

(ООН XOR 02н) = 02н = 2Dec

ТаИе [2] = 10111100 = ВСН = 188Dec

10111100 = вен

00011100 = 1СН

(BCHXOR 1СН) = A0H = 160Dec

Table[160] = 10101111 = AFH = 175Dec

10101111 = AFH

10111000 = В8Н

(AFH XOR В8Н) = 17Н = 23Dec

Table [23] = 00011110 = 1 ЄП = 30Dec

00011110 = 1 ЄП

00000001 = 01Н

(1 EH XOR 01H) = 1FH = 31 Dec

Table[31] = 11011100 = DCH = 220Dec

11011100 = DCH

00000000 = ООН

(DCH XOR 00H) = DCH = 220Dec

Table[220] = 11110100 = F4H = 244Dec

11110100 = F4H

00000000 = ООН

(F4H XOR 00H) = F4H = 244Dec

Table [244] = 00010101 = 15Н = 21 Dec

00010101 = 15Н

00000000 = ООН

(15H XOR ООН) = 15H = 21 Dec

Table [21] = 10100010 = А2Н = 162Dec

10100010 = А2Н

10100010 = А2Н

(A2H XOR A2H) = 00H = ODec

Table [0] = 00000000 = ООН = 0 Dec

У таблиці: Н шестнадцатиричное число: Dec десяткове число

Таблиця 25 Зміна вмісту зсувного регістру генератора ЦВК при подачі на його вхід байти, комплементарного байту, що міститься в ньому в даний момент

Значення

регістра ЦВК

Вхід

Х0

х

Х2

Х

Х

Х

Х

Х

*■

Х

1

Х0

х

Х

Х

Х

Х

Х

Х

1

1

Х0

Х

Х

Х

Х

Х

Х

1

1

1

Х

Х

Х

Х

Х

Х

Про

1

1

1

Х

Х

Х

Х

Х

1

Про

1

1

Про

Х

Х

Х

Х

1

1

Про

1

Про

1

Х

Х

Х

Про

1

1

Про

1

Про

1

Х

Х

Про

Про

1

1

Про

1

Про

1

Z

Значення регістра ЦВК Вхід

Z = 35Н = 53Dec (кінцеве значення ЦВК) значення, комплементарное

Джерело: карнач АС, Белошенко ВА, Тітієвський ВІ, Мікролокальние мережі: інтелектуальні датчики, Однопровідна інтерфейс, системи збору інформації Донецьк: ДонФТІ НАНУ України, 2000 199с з іл