Spetspribor wake protocol

Специфікація протоколу WAKE

Таблиця 1. Керуючі коди протоколу WAKE.

Transposed Frame End

Transposed Frame Escape

Таблиця 2. Підміна байт даних ESC-послідовностями.

Таблиця 3. Структура пакета WAKE.


FEND: Керуючий код FEND (C0h) є ознакою початку пакета. Завдяки Стаффінг, цей код більше ніде в потоці даних не зустрічається, що дозволяє в будь-якій ситуації однозначно визначати початок пакета.

CMD: Байт команди завжди повинен мати нульовий старший біт:


Таким чином, код команди займає 7 біт, що дозволяє передавати до 128 різних команд. Коди команд вибираються довільно в залежності від потреб додатка. Рекомендується використовувати кілька стандартних кодів команд:

Таблиця 4. Стандартні коди команд протоколу WAKE.

Передача коду помилки

Запит повернення переданого пакета

Запит інформації про пристрій

Коди інших команд вибираються в залежності від потреб додатка. Команди зазвичай мають кілька параметрів, які передаються далі у вигляді пакету даних.
Оскільки код команди завжди має нульовий старший біт, цей код ніколи не збігається з керуючими кодами. Тому при передачі команди стаффінг ніколи не проводиться.

N: Байт кількості даних має значення, що дорівнює кількості переданих байт даних:


Таким чином, код кількості даних займає 8 біт, в результаті один пакет може містити до 255 байт даних. Значення N не враховує службові байти пакета FEND, ADDR, CMD, N і CRC. В результаті стаффинга фактична довжина пакета може зрости. Значення N не враховує цей факт і відображає кількість корисних байт даних (тобто значення N завжди таке, наче стаффінг не провадиться). Якщо передана команда не має параметрів, то передається N = 00h і байти даних опускаються.

Якщо виникає необхідність передати значення N, рівне C0h або DBh, то проводиться стаффінг, тобто передача ESC-послідовності (див. таблицю 2). Однак при таких великих значеннях N довжина пакета настільки велика, що його подовження ще на один байт практично непомітно.

Data1. DataN: Байти даних, кількість яких визначається значенням N. При N = 00h байти даних відсутні. Байти даних можуть мати будь-яке значення, крім FEND (C0h) і FESC (DBh). Якщо виникає необхідність передати одне з цих значень, то проводиться стаффінг, тобто передача ESC-послідовності (див. таблицю 2), що складається з керуючого коду FESC і коду TFEND (TFESC).

Таблиця 5. Величина надмірності протоколу WAKE.

FEND, CMD, 00h, CRC

FEND, ADDR, CMD, 00h, CRC

FEND, ADDR, CMD, 00h

FEND, ADDR, CMD, 0Ah, <10 bytes of data>, CRC

FEND, ADDR, CMD, 32h, <50 bytes of data>, CRC

FEND, ADDR, CMD, 7Fh, <127 bytes of data>, CRC

FEND, CMD, 7Fh, <127 bytes of data>, CRC

FEND, ADDR, CMD, 7Fh, <127 bytes of data>

FEND, CMD, 7Fh, <127 bytes of data>


З боку PC протокол реалізований в динамічній бібліотеці wsp32.dll (варіант для RS-232) і wusb32.dll (варіант USB з використанням драйвера від FTDI). Бібліотеки можуть використовуватися при розробці комунікаційних програм на будь-якій мові. Подальший опис припускає, що бібліотека використовується додатком, написаним на мові C ++. Заголовки бібліотеки wsp32.dll для роботи через RS-232 наведено нижче:
bool AccessCOM (char * P) - функція перевіряє доступність порту. Як параметр передається ім'я порту (наприклад, "COM1"). Повертає true у випадку доступності порту.

bool OpenCOM (char * P, DWORD baud) - функція відкриває порт. Як параметри передаються ім'я порту (наприклад, "COM1") і швидкість в бодах, яка може приймати одне зі стандартних значень (наприклад, 115200). Повертає true у випадку успішного виконання. Функція встановлює на лінії DTR рівень 12В, а на лінії RTS рівень +12.

bool CloseCOM (void) - функція закриває порт. Повертає true у випадку успішного виконання.

bool SetModLns (DWORD F) - функція здійснює управління лініями RTS і DTR. Повертає true у випадку успішного виконання. Параметр такий же, як у функції API EscapeCommFunction.

bool GetModLns (LPDWORD lpD) - функція зчитує лінії управління модему CTS і DSR. Повертає true у випадку успішного виконання. Параметр такий же, як у функції API GetCommModemStatus.

bool PurgeCOM (void) - функція очищає буфер COM-порту і перериває поточні операції прийому / передачі. Повертає true у випадку успішного виконання.

bool FlushCOM (void) - функція очищає буфер COM-порту, дочекавшись завершення передачі. Повертає true у випадку успішного виконання.

bool GetMaskCOM (LPDWORD lpEvtMask) - функція зчитує маску подій COM-порту. Повертає true у випадку успішного виконання. Параметр такий же, як у функції API GetCommMask.

bool SetMaskCOM (DWORD EvtMask) - функція встановлює маску Повертає true у разі успішного виконання. Параметр такий же, як у функції API SetCommMask.

bool WaitEventCOM (LPDWORD lpEvtMask) - функція служить для очікування події COM-порту. Повертає true у випадку успішного виконання.

bool RxFrame (DWORD To, unsigned char ADD, unsigned char CMD, unsigned char N, unsigned char * Data) - функція здійснює прийом WAKE-пакета. Повертає true у випадку успішного виконання.

bool TxFrame (unsigned char ADDR, unsigned char CMD, unsigned char N, unsigned char * Data) - функція здійснює передачу WAKE-пакета. Повертає true у випадку успішного виконання.

Бібліотека wusb32.dll містить менший набір функцій. Імена функцій двох dll не збігаються, що дозволяє підключати до одного проекту відразу обидві бібліотеці, забезпечуючи при цьому роботу як через RS-232, так і через USB. Бібліотека wusb32.dll вимагає для своєї роботи встановленого direct-драйвера від FTDI (тестувалася з версією драйвера 1.06.20) та наявності бібліотеки FTD2XX.dll (тестувалася з версією бібліотеки 2.01.04). Заголовки бібліотеки wusb32.dll для роботи через USB наведено нижче: bool AccessUSB (int DevNum) - функція перевіряє доступність USB порту. Як параметр передається номер порту (для одного пристрою зазвичай DevNum = 0). Повертає true у випадку доступності порту.

bool OpenUSB (int DevNum, DWORD baud) - функція відкриває порт. Як параметри передаються номер порту і швидкість в бодах. Швидкість має значення тільки при роботі з FT232BM.

bool CloseUSB (void) - функція закриває порт. Повертає true у випадку успішного виконання.

bool PurgeUSB (void) - функція очищає буфер порту і перериває поточні операції прийому / передачі. Повертає true у випадку успішного виконання.

bool RxFrameUSB (DWORD To, unsigned char ADD, unsigned char CMD, unsigned char N, unsigned char * Data) - функція здійснює прийом WAKE-пакета. Повертає true у випадку успішного виконання.

bool TxFrameUSB (unsigned char ADDR, unsigned char CMD, unsigned char N, unsigned char * Data) - функція здійснює передачу WAKE-пакета. Повертає true у випадку успішного виконання.

Для тестування додатків із застосуванням протоколу WAKE служить додаток WakeUp. за допомогою якого можна передавати сформовані вручну фрейми і отримувати відповідь пристрою. Вікно програми WakeUp! показано на рис. 1.

Мал. 1. Вікно програми WakeUp!

Таблиця 6. Стандартні коди помилок протоколу WAKE.

Пристрій не відповідає

Призначення кодів стандартних помилок:
  • Err_No - немає помилки, команда виконана правильно
  • Err_Tx - помилка обміну. Код цієї помилки може передаватися підлеглим пристроєм в пакеті з кодом команди C_Err. Фактично цей пакет означає "помилка прийому пакета майстра". Інша ситуація, коли може передаватися цей код помилки, це помилка обміну підлеглого пристрою з іншими підлеглими микроконтроллерами.
  • Err_Bu - пристрій зайнятий. Ця помилка виникає в тому випадку, коли майстер робить спробу запустити в підпорядкованому пристрої якийсь процес, який ще не завершився після попереднього запуску. Приклад - "АЦП зайнятий".
  • Err_Re - пристрій не готовий. Цей код помилки може бути використаний в групі команд, за допомогою яких майстер опитує готовність підлеглого пристрою. Такі команди повертають код Err_Re, поки пристрій (наприклад, АЦП) не готове, а потім повертають Err_No. Цей код можна повертати і на команду запиту даних, якщо вони ще не готові. Тоді можна обійтися без спеціальних команд опитування готовності.
  • Err_Pa - неправильні команди. Ця помилка виникає в тому випадку, якщо майстер намагається виконати в підпорядкованому пристрої якусь функцію з невірним параметрами. У такому випадку замість пакета з даними підлеглий пристрій повертає пакет з цим кодом помилки.
  • Err_Nr - пристрій не відповідає. Ця помилка може виникати в тому випадку, якщо підлеглий пристрій має "в підпорядкуванні" інші пристрої, які не відповідають (наприклад, відключені).
Цей набір помилок може бути змінений в залежності від потреб конкретного додатка. Як приклад застосування протоколу WAKE в конкретному пристрої приведено опис системи команд блоку управління криостате CTC-25N.

wake.pdf (225 Kb) - специфікація протоколу WAKE в форматі pdf.

wakeup.zip (271 Kb) - архів з програмою WakeUp! (V1.00) і бібліотекою wsp32.dll.

wusource.zip (35 Kb) - архів з вихідним текстом програми WakeUp! (V1.00, C ++ Builder 5).

w51.zip (3 Kb) - архів з вихідним текстом прикладу реалізації протоколу WAKE на MCS-51 (ASM).

wavr.zip (3 Kb) - архів з вихідним текстом прикладу реалізації протоколу WAKE на AVR (ASM).

wake_c.zip (4 Kb) - архів з вихідним текстом прикладу реалізації протоколу WAKE на AVR (IAR C).

ctc-25n.pdf (126 Kb) - приклад застосування протоколу WAKE в блоці управління криостате.

wakeusb.zip (302 Kb) - архів з програмою WakeUSB (V1.00) і бібліотекою wusb32.dll.

wusb.zip (342 Kb) - бібліотека wusb32.dll і драйвер FTD2XX від FTDI.