«Случай — это псевдоним Бога, когда Он не хочет подписываться своим собственным именем.» А. Франс

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

Материал из Wiki
< OS-VVM (Диплом)
Версия от 17:44, 11 марта 2013; ANA (обсуждение | вклад)

Это снимок страницы. Он включает старые, но не удалённые версии шаблонов и изображений.
Перейти к: навигация, поиск
Проект Диплом

Литература

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);

NEW