Пакеты запросов и ответов асинхронных передач для различных транзакций имеют форматы. Пакет состоит из заголовка и необя зательно блока данных. Ниже перечислено назначение полей, используемых в заголовках пакетов различных типов:
Блок данных data_block, следующий за заголовком, и его проверочный код data_CRC присутствуют в пакетах с tcode = 1, 7, 9, A. Блок содержит целое число квадлетов; при необходимости остаток последнего квадлета заполняется нулями. Максимальный размер блока определяется скоростью передачи.
tcode | Транзакция (субакция) |
0 | Запрос записи квадлета данных (Write Request) |
1 | Запрос записи блока данных (Write Request) |
2 | Ответ записи (Write Response) |
3, C, D, F | Резерв |
4 | Запрос чтения квадлета данных (Read Request) |
5 | Запрос чтения блока данных (Read Request) |
6 | Ответ чтения квадлета данных (Read Response) |
7 | Ответ чтения блока данных (Read Response) |
8 | Начало цикла (Cycle Start) |
9 | Запрос блокированной транзакции (Lock Request) |
A | Пакет асинхронного потока (Asynchronous Streaming Packet) |
B | Ответ блокированной транзакции (Lock Response) |
E | Не стандартизован |
Допустимый размер блока данных, передаваемых в одном пакете, зависит от скорости (см. следующую таблицу).
Скорость | Максимальный размер для асинхронных передач, байт | Максимальный размер для изохронных передач, байт |
S100 | 512 | 1024 |
S200 | 1024 | 2048 |
S400 | 2048 | 4096 |
S800 | 4096 | 8192 |
S1600 | 4096 | 16384 |
S3200 | 4096 | 32768 |
rcode | Результат |
0 | resp_comlete, успешное выполнение запроса |
1-3 | резерв |
4 | resp_conflict_error, отвечающий агент обнаружил конфликт ресурсов (запрос можно повторить позже) |
5 | resp_data_error, аппаратная ошибка, данные недоступны |
6 | resp_type_error, недопустимое значение полей в пакете запроса |
7 | resp_address_error, указанные адрес недоступен |
8...Fh | резерв |
Пакет квитирования имеет длину всего 1 байт (cм. следующий рисунок), в нем содержится 4-битный код квитирования ack_code (см. следующую таблицу), достоверность которого проверяется по его двоичному дополнению ack_parity.
ack_code | Имя | Значение |
0 | Резерв | Резерв |
1 | ack_complete | Пакет успешно принят. Если это квитанция пакета запроса, то пакет ответа не предполагается |
2 | ack_pending | Пакет запроса успешно принят, пакет ответа будет послан (для пакетов ответа не используется) |
3 | Резерв | Резерв |
4 | ack_busy_x | Пакет не принят из-за занятости узла (возможен успех при повторной попытке) |
5 | ack_busy_A | Пакет не принят из-за занятости узла. Данные будут приняты при следующем повторе (фаза A), когда узел освободится |
6 | ack_busy_B | Пакет не принят из-за занятости узла. Данные будут приняты при следующем повторе (фаза В), когда узел освободится |
7-Ah | Резерв | Резерв |
Bh | ack_tardy | Пакет не принят из-за неготовности узла, находящегося в состоянии standby; попытку можно повторить через некоторое время (1394a) |
Ch | ack_conflict_error | Пакет не принят из-за конфликта ресурсов (1394a) |
Dh | ack_data_error | Пакет не принят из-за ошибки данных (CRC или несоответствие длины пакета заявленной) |
Eh | ack_type_error | Пакет не принят из-за недопустимого типа (неверные параметры, неподдерживаемый тип транзакции) |
Fh | ack_address_error | Пакет не принят из-за недоступности указанного адреса (Dest_Offset) в целевом узле(1394a) |
Успешному выполнению асинхронных транзакций может помешать ряд причин:
Уровень транзакций предоставляет драйверам надежные сервисы, уведомляющие драйвер об успехе или неуспехе транзакции. Однако средства IEEE 1394 (уровень транзакций) обеспечивают автоматические повторы только для случая занятости целевого узла.
ПОСТОВОЙ: Советую обратить внимание на бесплатный видеокурс по Windows 7. Всё по делу и ничего лишнего.