«Бог не меняет того, что (происходит) с людьми, пока они сами не изменят своих помыслов.» Коран, Сура 12:13

OS-VVM (Диплом)/Спецификация микросхемы Mifare Ultralight

Материал из Wiki
Перейти к: навигация, поиск
Проект Диплом

Литература

Coverage Cookbook (en)

OVM методология

* OS-VVM *

Содержание

Описание микросхемы

Список вопросов

Описание входных/выходных протоколов

Требования, предъявляемые к временным ограничениям сигналов

  • частота (fc) 13,56 МГц ± 7 кГц
  • длительность паузы 27/fc - 41/fc (2-3 мкс)
  • защитный интервал блока 1172/fc - 1236/fc (86,43 - 91,15 мкс)
  • длительность передачи одного бита 128/fc (9,44 мкс)

Представление и кодирование бит при передаче от ридера к карте

Определены следующие последовательности:

  • X: после времени 64/fc (4,72 мкс) должна быть "пауза"
  • Y: для всей длительности бита 128/fc (9,44 мкс) модуляции не должно быть
  • Z: в начале длительности бита должна быть "пауза".
              Z    Y    X
           –|_–––|––––|––_–|–

Данные последовательности используются для кодирования следующей информации:

  • логическая "1" последовательность Х
  • логический "0" последовательность Y со следующими двумя исключениями:
    • а) если два или более смежных (граничащих) "0", то последовательность Z должна быть использована для следующего "0"
    • б) если первым битом после старта кадра является "0", последовательность Z должна быть использована для представления этого и любых "0"-ей, которые следуют прямо после этого.
  • старт передачи: последовательность Z
  • конец передачи: логический "0" следует с последовательностью Y
  • нет информации: по крайней мере две последовательности Y.

Представление и кодирование бит при передаче от карты к ридеру

Биты кодируются Манчестерским кодом со следующими определениями:

последовательность D: несущая модулируется поднесущей для первой половины (50%) длительности бита
последовательность E: несущая модулируется поднесущей для второй половины (50%) длительности бита
последовательность F: несущая не модулируется поднесущей для длительности одного бита

логическая "1" последовательность D
логический "0" последовательность E
старт передачи: последовательность D
конец передачи: последовательность F
нет информации: нет поднесущей.

Анализ команд и ответов ИМС

Команда Ответ
Код Аргумент Формат Размер Описание Код Формат Размер Описание
0х26 - s7ee 7+3 REQA (запрос карты) 0х0044 s8p8pe 16+4 ATQA
0х52 - s7ee 7+3 WUPA (запрос всех карт) 0х0044 s8p8pe 16+4 ATQA
0х93 0х20-0х67 s8p8pee 16+5 Антиколлизия каскадного уровня 1 UID + BCC1 s8p..8pBCC1e 0..47 Часть UID + BCC1
0х95 0х20-0х67 s8p8pee 16+5 Антиколлизия каскадного уровня 2 UID + BCC2 s8p...8pBCC2e 0..47 Часть UID + BCC2
0х30 Адрес s8p8pC0pC1pee 32+7 READ (чтение) 16 байт данных + CRC s8p..8pC0pC1pe 144+20 16 байт данных + CRC
0х50 0х00 s8p8pC0pC1pee 32+7 HALT (остановка) (N)AK s7e 7+2 Пассивный AK или NAK
0хA2 Адрес+данные s8p8p8p8p8p8pC0pC1pee 64+11 WRITE (запись) (N)AK s7e 7+2 AK или NAK
0хA0 Адрес+данные s8p8p8p8pC0pC1pee 48+9 COMPATIBILITY WRITE (совместимая запись) (N)AK s7e 7+2 AK или NAK
- - s8p..8pC0pC1pee 144+20 COMPATIBILITY WRITE (совместимая запись) (N)AK s7e 7+2 AK или NAK
0х93 0х70 + UID cl1 s8p..8pBCC1ee 0..75 Выбор каскадного уровня 1 SAK ('04') s8pC0pC1pe 24+5 SAK ('04') + CRC
0х95 0х70 + UID cl2 s8p..8pBCC2ee 0..75 Выбор каскадного уровня 2 SAK ('00') s8pC0pC1pe 24+5 SAK ('00') + CRC

Принятые обозначения:

  • s — SOF (1 бит)
  • e — EOF (2 бит для команды, 1 бит для ответа)
  • p — четность (1 бит)
  • C0, С1 — CRC (8ст+8мл бит)
  • BCC — контрольная сумма (8 бит)

Расчёт контрольных сумм

Контроль четности

Р = 0, при нечетном количестве единиц

Р = 1, при четном количестве единиц

BCC

Вычисляется как "исключающее или" по 4 предыдущим байтам

CRC16

B.3 Code sample written in C language for CRC calculation

#include
#include
#include
#include
<stdio.h>
<stdlib.h>
<string.h>
<ctype.h>
#define CRC_A 1
#define CRC_B 2
#define BYTE unsigned char
unsigned short UpdateCrc(unsigned char ch, unsigned short *lpwCrc)
{
  ch = (ch^(unsigned char)((*lpwCrc) & 0x00FF));
  ch = (ch^(ch<<4));
  *lpwCrc = (*lpwCrc >> 8)^((unsigned short)ch << 8)^((unsigned
						       short)ch<<3)^((unsigned short)ch>>4);
}
return(*lpwCrc);
void ComputeCrc(int CRCType, char *Data, int Length,
		BYTE *TransmitFirst, BYTE *TransmitSecond)
{
  unsigned char chBlock;
  unsigned short wCrc;
  switch(CRCType) {
  case CRC_A:
    wCrc = 0x6363;
    // ITU-V.41
    break;
  case CRC_B:
    wCrc = 0xFFFF;
    // ISO 3309
    break;
  default:
    return;
  }
  do {
    chBlock = *Data++;
    UpdateCrc(chBlock, &wCrc);
  } while (--Length);
  if (CRCType == CRC_B)
    wCrc = ~wCrc; // ISO 3309
  *TransmitFirst = (BYTE) (wCrc & 0xFF);
  *TransmitSecond = (BYTE) ((wCrc >> 8) & 0xFF);
}
return;
BYTE BuffCRC_A[10] = {0x12, 0x34};
BYTE BuffCRC_B[10] = {0x0A, 0x12, 0x34, 0x56};
unsigned short Crc;
BYTE First, Second;
FILE *OutFd;
int i;
int main(void)
{
  printf("CRC-16 reference results 3-Jun-1999\n");
  printf("by Mickey Cohen - mickey@softchip.com\n\n");
  printf("Crc-16 G(x) = x^16 + x^12 + x^5 + 1\n\n");
  printf("CRC_A of [ ");
  for(i=0; i<2; i++) printf("%02X ",BuffCRC_A[i]);
  ComputeCrc(CRC_A, BuffCRC_A, 2, &First, &Second);
  printf("] Transmitted: %02X then %02X.\n", First, Second);
  printf("CRC_B of [ ");
  for(i=0; i<4; i++) printf("%02X ",BuffCRC_B[i]);
  ComputeCrc(CRC_B, BuffCRC_B, 4, &First, &Second);
  printf("] Transmitted: %02X then %02X.\n", First, Second);
}
return(0);

Диаграмма состояний микросхемы

[svg]

Таблица переходов

Состояние POR

Состояние IDLE

IDLE state-transition table
Command Condition Action Next State
REQA Чтение (инициализация) LockBits READY1
HALT IDLE
WUPA Чтение (инициализация) LockBits READY1
ANTICOLISION L1 IDLE
SELECT L1 IDLE
ANTICOLISION L1 IDLE
SELECT L2 IDLE
READ IDLE
WRITE IDLE
CWRITE IDLE

Состояние READY1

READY1 state-transition table
Command Condition Action Next State
REQA IDLE
HALT IDLE
WUPA IDLE
ANTICOLISION L1 Выбор части первой половины UID READY1
SELECT L1 Выбор первой половины UID READY2
ANTICOLISION L2 IDLE
SELECT L2 IDLE
READ Адрес = 0 ACTIVE
READ Адрес ≠ 0 IDLE
WRITE IDLE
CWRITE IDLE

Состояние READY2

READY2 state-transition table
Command Condition Action Next State
REQA IDLE
HALT IDLE
WUPA IDLE
ANTICOLLISION L1 IDLE
SELECT L1 IDLE
ANTICOLLISION L2 Выбор части второй половины UID READY2
SELECT L2 Выбор второй половины UID ACTIVE
READ Адрес = 0 ACTIVE
READ Адрес ≠ 0 IDLE
WRITE IDLE
CWRITE IDLE

Состояние ACTIVE

ACTIVE state-transition table
Command Condition Action Next State
REQA IDLE
HALT
WUPA IDLE
SELECT L1 IDLE
SELECT L2 IDLE
READ
WRITE
CWRITE

Состояние HALT

HALT state-transition table
Command Condition Action Next State
REQA
HALT
WUPA
SELECT L1
SELECT L2
READ
WRITE
CWRITE

Таблица ответов

Команда REAQ

Starting State Condition Response Next State
IDLE
HALT
READY1
READY2
ACTIVE
HALT

Команда WUPA

Starting State Condition Response Next State
IDLE
HALT
READY1
READY2
ACTIVE
HALT

Команда READ

Starting State Condition Response Next State
IDLE IDLE
HALT HALT
READY1 Addr=0, правильная чётность и CRC 16 байт (адреса 0-15) + CRC ACTIVE
неправильная чётность и CRC IDLE
READY2
ACTIVE
HALT

Команда HALT

Starting State Condition Response Next State
IDLE
HALT
READY1
READY2
ACTIVE
HALT

Команда WRITE

Starting State Condition Response Next State
IDLE
HALT
READY1
READY2
ACTIVE
HALT

Команда CWRITE

Starting State Condition Response Next State
IDLE
HALT
READY1
READY2
ACTIVE
HALT

NEW