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

OS-VVM (Диплом)/Спецификация микросхемы Mifare Ultralight — различия между версиями

Материал из Wiki
Перейти к: навигация, поиск
м (Представление и кодирование бит при передаче от ридера к карте)
м (Анализ команд и ответов ИМС)
 
(не показаны 89 промежуточных версий 2 участников)
Строка 8: Строка 8:
  
 
==== Требования, предъявляемые к временным ограничениям сигналов ====
 
==== Требования, предъявляемые к временным ограничениям сигналов ====
* частота 13,56 МГц ± 7 кГц
+
* частота (fc) 13,56 МГц ± 7 кГц
* длительность паузы 2-3 мкс
+
* длительность паузы 27/fc - 41/fc (2-3 мкс)
 
* защитный интервал блока 1172/fc - 1236/fc (86,43 - 91,15 мкс)
 
* защитный интервал блока 1172/fc - 1236/fc (86,43 - 91,15 мкс)
 
* длительность передачи одного бита 128/fc (9,44 мкс)
 
* длительность передачи одного бита 128/fc (9,44 мкс)
Строка 49: Строка 49:
 
==== Анализ команд и ответов ИМС ====
 
==== Анализ команд и ответов ИМС ====
  
Короткие (7 бит):
+
{| class="wikitable"
 +
!colspan=5| Команда
 +
!colspan=4| Ответ
 +
|-
 +
! Код
 +
! Аргумент
 +
! Формат
 +
! Размер
 +
! Описание
 +
! Код
 +
! Формат
 +
! Размер
 +
! Описание
 +
|-
 +
| 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
 +
| 2..47
 +
| Часть UID + BCC1
 +
|-
 +
| 0х95
 +
| 0х20-0х67
 +
| s8p8pee
 +
| '''16'''+5
 +
| Антиколлизия каскадного уровня 2
 +
| UID + BCC2
 +
| s8p...8pBCC2e
 +
| 2..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
 +
| 75
 +
| Выбор каскадного уровня 1
 +
| SAK ('04')
 +
| s8pC0pC1pe
 +
| '''24'''+5
 +
| SAK ('04') + CRC
 +
|-
 +
| 0х95
 +
| 0х70 + UID cl2
 +
| s8p..8pBCC2ee
 +
| 75
 +
| Выбор каскадного уровня 2
 +
| SAK ('00')
 +
| s8pC0pC1pe
 +
| '''24'''+5
 +
| SAK ('00') + CRC
 +
|}
  
* Команда REQA (запрос карты ) 0х26, ответ ATQA 0х0044<br />
+
Принятые обозначения:
 +
* s — SOF (1 бит)
 +
* e — EOF (2 бит для команды, 1 бит для ответа)
 +
* p — четность (1 бит)
 +
* C0, С1 — CRC (8ст+8мл бит)
 +
* BCC — контрольная сумма (8 бит)
  
* Команда WUPA (запрос всех карт)0х52, ответ ATQA 0х0044<br />
+
== Расчёт контрольных сумм ==
 +
=== Контроль четности ===
  
Команда Антиколлизия каскадного уровня 1 0х93 + аргумент 0х20-0х67, ответ Часть UID + BCC1<br />
+
Р = 0, при нечетном количестве единиц
  
Команда Выбор каскадного уровня 1 0х93 + аргумент 0х70 + UID каскадный уровень 1 + BCC1 + CRC, ответ SAK ('04') + CRC<br />
+
Р = 1, при четном количестве единиц
  
Команда Антиколлизия каскадного уровня 2 0х95 + аргумент 0х20-0х67, ответ Часть UID + BCC2<br />
+
=== BCC ===
 +
Вычисляется как "исключающее или" по 4  предыдущим байтам
  
Команда Выбор каскадного уровня 2 0х95 + аргумент 0х70 + UID каскадный уровень 2 + BCC2 + CRC, ответ SAK ('00') + CRC<br />
+
=== CRC16===
 +
B.3 Code sample written in C language for CRC calculation
  
Команда READ (чтение) 0х30 + Адрес + CRC, ответ 16 байт данных + CRC<br />
+
<source lang="cpp">
  
Команда HALT (остановка) 0х50 + аргумент 0х00 + CRC, ответ Пассивный AK или NAK<br />
+
#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);
 +
</source>
  
Команда WRITE (запись) 0хA2 + аргумент Адрес + 4 байта данных + CRC, ответ AK или NAK<br />
+
== Диаграмма состояний микросхемы ==
  
Команда COMPATIBILITY WRITE (совместимая запись) 0хA0 + аргумент Адрес + CRC, ответ AK или NAK,
+
<graph>
16 байт данных + CRC, ответ AK или NAK<br />
+
digraph G{
 +
#compound=true;
 +
node [style=filled fillcolor=pink2, shape=ellipse,fontsize=12,margin="0.01,0.05"]
 +
edge[color="darkgreen",fontcolor="blue",fontsize=12,constraint=false];
 +
 
 +
POR    -> IDLE [constraint=true]
 +
IDLE  -> READY1 [label="REQA, WUPA",constraint=true]
 +
READY1 -> READY1 [label="Anticollision"]
 +
READY1 -> READY2 [label="SelectL1",constraint=true]
 +
READY1 -> ACTIVE [label="READ(0)",tailport=se,headport=ne]
 +
READY2 -> READY2 [label="Anticollision"]
 +
READY2 -> ACTIVE [label="SelectL2",constraint=true]
 +
READY2 -> ACTIVE [label="READ(0)",constraint=true]
 +
ACTIVE -> ACTIVE [label="WRITE, CWRITE"]
 +
#ACTIVE -> ACTIVE [label="WRITE, CWRITE",rankdir=RL]
 +
#ACTIVE -> ACTIVE [label="WRITE, CWRITE",tailport=w,headport=sw,constraint=true]
 +
ACTIVE -> ACTIVE [label="READ"]
 +
#ACTIVE -> ACTIVE [label="READ",rankdir=RH]
 +
ACTIVE -> HALT [label="HALT",headport=se,constraint=true]
 +
HALT  -> READY1 [label="WUPA",constraint=true]
 +
 
 +
edge[color="gray",fontcolor="gray",fontsize=11,constraint=false];
 +
READY1 -> IDLE  [color="gray",label="not (READ(0) | SelectL1)"]
 +
READY2 -> IDLE  [color="gray",label="not (READ(0) | SelectL2)"]
 +
ACTIVE -> IDLE [color="gray",label="REQA, WUPA,\n SEL1/2,\n Anticollison"]
 +
HALT -> HALT  [color="gray",label="not WUPA"]
 +
 
 +
 
 +
{rank=same IDLE HALT}
 +
 
 +
}</graph>
 +
 
 +
=== Таблица переходов ===
 +
 
 +
====  Состояние POR ====
 +
 
 +
====  Состояние IDLE ====
 +
 
 +
{| class=standard align=center
 +
|+ 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 ====
 +
 
 +
{| class=standard align=center
 +
|+ 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 ====
 +
 
 +
{| class=standard align=center
 +
|+ 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
 +
|-
 +
|rowspan=2| READ ||Адрес = 0||—||ACTIVE
 +
|-
 +
|Адрес ≠ 0||—||IDLE
 +
|-
 +
| WRITE ||—||—||IDLE
 +
|-
 +
| CWRITE ||—||—||IDLE
 +
|-
 +
|  || || ||
 +
|}
 +
 
 +
====  Состояние ACTIVE ====
 +
 
 +
{| class=standard align=center
 +
|+ ACTIVE state-transition table
 +
! Command || Condition || Action || Next State
 +
|-
 +
| REQA
 +
| —
 +
| —
 +
| IDLE
 +
|-
 +
| HALT
 +
| —
 +
| —
 +
| HALT
 +
|-
 +
| WUPA ||—||—||IDLE
 +
|-
 +
| ANTICOLISION L1 ||—||—||IDLE
 +
|-
 +
| SELECT L1 ||—||—||IDLE
 +
|-
 +
| ANTICOLISION L1 ||—||—||IDLE
 +
|-
 +
| SELECT L2 ||—||—||IDLE
 +
|-
 +
|rowspan=2| READ ||Parity & CRC = ok||Чтение 16 байт||ACTIVE
 +
|-
 +
| Parity & CRC ≠ ok || — || IDLE
 +
|-
 +
|rowspan=2| WRITE ||—||Запись 4 байт||ACTIVE
 +
|-
 +
| Parity & CRC ≠ ok || — || IDLE
 +
|-
 +
|rowspan=2| CWRITE ||Данные записи = 16 байт||Запись 4 байт||ACTIVE
 +
|-
 +
| Parity & CRC ≠ ok || — || IDLE
 +
|-
 +
| Other CMD || — || — || IDLE
 +
|}
 +
 
 +
====  Состояние HALT ====
 +
 
 +
{| class=standard align=center
 +
|+ HALT state-transition table
 +
! Command || Condition || Action || Next State
 +
|-
 +
| REQA
 +
| —
 +
| —
 +
| HALT
 +
|-
 +
| HALT
 +
| —
 +
| —
 +
| HALT
 +
|-
 +
| WUPA ||—||—||READY1
 +
|-
 +
| ANTICOLISION L1 ||—||—||HALT
 +
|-
 +
| SELECT L1 ||—||—||HALT
 +
|-
 +
| ANTICOLISION L1 ||—||—||HALT
 +
|-
 +
| SELECT L2 ||—||—||HALT
 +
|-
 +
| READ ||—||—||HALT
 +
|-
 +
| WRITE ||—||—||HALT
 +
|-
 +
| CWRITE ||—||—||HALT
 +
|-
 +
|  || || ||
 +
|}
 +
 
 +
=== Таблица ответов ===
 +
====  Команда REAQ ====
 +
 
 +
{| class=standard align=center
 +
! Starting State ||  Condition || Response || Next State
 +
|-
 +
| IDLE  ||—||ATQA (0х0044)||READY1
 +
|-
 +
| READY1  ||—||—||IDLE
 +
|-
 +
| READY2  ||—||—||IDLE
 +
|-
 +
| ACTIVE  ||—||—||IDLE
 +
|-
 +
| HALT  ||—||—||HALT
 +
|-
 +
|
 +
|
 +
|
 +
|
 +
|}
 +
 
 +
====  Команда WUPA ====
 +
 
 +
{| class=standard align=center
 +
! Starting State ||  Condition || Response || Next State
 +
|-
 +
| IDLE  ||—||ATQA (0х0044)||READY1
 +
|-
 +
| READY1  ||—||—||IDLE
 +
|-
 +
| READY2  ||—||—||IDLE
 +
|-
 +
| ACTIVE  ||—||—||IDLE
 +
|-
 +
| HALT  ||—||—||READY1
 +
|-
 +
|
 +
|
 +
|
 +
|
 +
|}
 +
 
 +
====  Команда READ ====
 +
 
 +
{| class=standard align=center
 +
|+ Команда READ
 +
|-
 +
! Starting State ||  Condition || Response || Next State
 +
|-
 +
| IDLE          || —          || —        || IDLE
 +
|-
 +
| rowspan=2 | READY1
 +
| Адрес = 0  & (Parity & CRC) <nowiki>=</nowiki> OK || 16 байт + CRC || ACTIVE
 +
|-
 +
| Адрес ≠ 0 <nowiki>|</nowiki> (Parity & CRC) ≠ OK || — || IDLE
 +
|-
 +
| rowspan=2 | READY2
 +
| Адрес <nowiki>=</nowiki> 0  & (Parity & CRC) <nowiki>=</nowiki> OK || 16 байт + CRC || ACTIVE
 +
|-
 +
| Адрес ≠ 0 <nowiki>|</nowiki> (Parity & CRC) ≠ OK || — || IDLE
 +
|-
 +
| rowspan=2 | ACTIVE
 +
| Адрес <nowiki>=</nowiki> 0..15 & (Parity & CRC) <nowiki>=</nowiki> OK || 16 байт + CRC || ACTIVE
 +
|-
 +
| Адрес ≠ 0..15 <nowiki>|</nowiki> (Parity & CRC) ≠ OK || — || IDLE
 +
|-
 +
| HALT
 +
| —
 +
| —
 +
| HALT
 +
|-
 +
|
 +
|
 +
|
 +
|
 +
|}
 +
 
 +
====  Команда HALT ====
 +
 
 +
{| class=standard align=center
 +
! Starting State ||  Condition || Response || Next State
 +
|-
 +
|  IDLE|| — || — || IDLE
 +
|-
 +
|  HALT  || —|| —|| HALT 
 +
|-
 +
|  READY1  || —|| —|| IDLE
 +
|-
 +
|  READY2  || —|| —|| IDLE
 +
|-
 +
|  rowspan=2 | ACTIVE  || Нет ошибки || Нет ответа || HALT
 +
|-
 +
| Ошибка|| NACK (5) || IDLE 
 +
|-
 +
|
 +
|
 +
|
 +
|
 +
|}
 +
 
 +
====  Команда WRITE ====
 +
 
 +
{| class=standard align=center
 +
! Starting State ||  Condition || Response || Next State
 +
|-
 +
| IDLE  || — || — || IDLE 
 +
|-
 +
| READY1  || — || — || IDLE 
 +
|-
 +
| READY2  || — || — || IDLE 
 +
|-
 +
| ACTIVE  || — || AK или NAK || ACTIVE 
 +
|-
 +
| HALT  || — || — || HALT 
 +
|-
 +
|
 +
|
 +
|
 +
|
 +
|}
 +
 
 +
====  Команда CWRITE ====
 +
 
 +
{| class=standard align=center
 +
! Starting State ||  Condition || Response || Next State
 +
|-
 +
| IDLE  || — || — || IDLE 
 +
|-
 +
| HALT  || — || — || HALT 
 +
|-
 +
| READY1  || — || — || IDLE 
 +
|-
 +
| READY2  || — || — || IDLE 
 +
|-
 +
| ACTIVE  || — || AK или NAK || ACTIVE 
 +
|-
 +
|
 +
|
 +
|
 +
|
 +
|}
 +
 
 +
==== Команда Anticollision L1 ====
 +
 
 +
{| class=standard align=center
 +
! Starting State ||  Condition || Response || Next State
 +
|-
 +
| IDLE  || — || — || IDLE 
 +
|-
 +
| HALT  || — || — || HALT
 +
|-
 +
| READY1  || — || Часть первой половины UID + BCC || READY1 
 +
|-
 +
| READY2  || — || — || IDLE 
 +
|-
 +
| ACTIVE  || — || — || IDLE
 +
|-
 +
|
 +
|
 +
|
 +
|
 +
|}
 +
 
 +
==== Команда Select L1 ====
 +
 
 +
{| class=standard align=center
 +
! Starting State ||  Condition || Response || Next State
 +
|-
 +
| IDLE  || — || — || IDLE 
 +
|-
 +
| HALT  || — || — || HALT
 +
|-
 +
| READY1  || — || Первая половина UID + BCC || READY2 
 +
|-
 +
| READY2  || — || — || IDLE 
 +
|-
 +
| ACTIVE  || — || — || IDLE
 +
|-
 +
|
 +
|
 +
|
 +
|
 +
|}
 +
 
 +
==== Команда Anticollision L2 ====
 +
 
 +
{| class=standard align=center
 +
! Starting State ||  Condition || Response || Next State
 +
|-
 +
| IDLE  || — || — || IDLE 
 +
|-
 +
| HALT  || — || — || HALT
 +
|-
 +
| READY1  || — || — || IDLE 
 +
|-
 +
| READY2  || — || Часть второй половины UID + BCC || READY2 
 +
|-
 +
| ACTIVE  || — || — || IDLE
 +
|-
 +
|
 +
|
 +
|
 +
|
 +
|}
 +
 
 +
==== Команда Select L2 ====
 +
 
 +
{| class=standard align=center
 +
! Starting State ||  Condition || Response || Next State
 +
|-
 +
| IDLE  || — || — || IDLE 
 +
|-
 +
| HALT  || — || — || HALT
 +
|-
 +
| READY1  || — || — || IDLE 
 +
|-
 +
| READY2  || — || Вторая половина UID + BCC || ACTIVE 
 +
|-
 +
| ACTIVE  || — || — || IDLE
 +
|-
 +
|
 +
|
 +
|
 +
|
 +
|}
 +
 
 +
== NEW ==

Текущая версия на 12:37, 19 апреля 2013

Проект Диплом

Литература

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 2..47 Часть UID + BCC1
0х95 0х20-0х67 s8p8pee 16+5 Антиколлизия каскадного уровня 2 UID + BCC2 s8p...8pBCC2e 2..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 75 Выбор каскадного уровня 1 SAK ('04') s8pC0pC1pe 24+5 SAK ('04') + CRC
0х95 0х70 + UID cl2 s8p..8pBCC2ee 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
Адрес ≠ 0 IDLE
WRITE IDLE
CWRITE IDLE

Состояние ACTIVE

ACTIVE state-transition table
Command Condition Action Next State
REQA IDLE
HALT HALT
WUPA IDLE
ANTICOLISION L1 IDLE
SELECT L1 IDLE
ANTICOLISION L1 IDLE
SELECT L2 IDLE
READ Parity & CRC = ok Чтение 16 байт ACTIVE
Parity & CRC ≠ ok IDLE
WRITE Запись 4 байт ACTIVE
Parity & CRC ≠ ok IDLE
CWRITE Данные записи = 16 байт Запись 4 байт ACTIVE
Parity & CRC ≠ ok IDLE
Other CMD IDLE

Состояние HALT

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

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

Команда REAQ

Starting State Condition Response Next State
IDLE ATQA (0х0044) READY1
READY1 IDLE
READY2 IDLE
ACTIVE IDLE
HALT HALT

Команда WUPA

Starting State Condition Response Next State
IDLE ATQA (0х0044) READY1
READY1 IDLE
READY2 IDLE
ACTIVE IDLE
HALT READY1

Команда READ

Команда READ
Starting State Condition Response Next State
IDLE IDLE
READY1 Адрес = 0 & (Parity & CRC) = OK 16 байт + CRC ACTIVE
Адрес ≠ 0 | (Parity & CRC) ≠ OK IDLE
READY2 Адрес = 0 & (Parity & CRC) = OK 16 байт + CRC ACTIVE
Адрес ≠ 0 | (Parity & CRC) ≠ OK IDLE
ACTIVE Адрес = 0..15 & (Parity & CRC) = OK 16 байт + CRC ACTIVE
Адрес ≠ 0..15 | (Parity & CRC) ≠ OK IDLE
HALT HALT

Команда HALT

Starting State Condition Response Next State
IDLE IDLE
HALT HALT
READY1 IDLE
READY2 IDLE
ACTIVE Нет ошибки Нет ответа HALT
Ошибка NACK (5) IDLE

Команда WRITE

Starting State Condition Response Next State
IDLE IDLE
READY1 IDLE
READY2 IDLE
ACTIVE AK или NAK ACTIVE
HALT HALT

Команда CWRITE

Starting State Condition Response Next State
IDLE IDLE
HALT HALT
READY1 IDLE
READY2 IDLE
ACTIVE AK или NAK ACTIVE

Команда Anticollision L1

Starting State Condition Response Next State
IDLE IDLE
HALT HALT
READY1 Часть первой половины UID + BCC READY1
READY2 IDLE
ACTIVE IDLE

Команда Select L1

Starting State Condition Response Next State
IDLE IDLE
HALT HALT
READY1 Первая половина UID + BCC READY2
READY2 IDLE
ACTIVE IDLE

Команда Anticollision L2

Starting State Condition Response Next State
IDLE IDLE
HALT HALT
READY1 IDLE
READY2 Часть второй половины UID + BCC READY2
ACTIVE IDLE

Команда Select L2

Starting State Condition Response Next State
IDLE IDLE
HALT HALT
READY1 IDLE
READY2 Вторая половина UID + BCC ACTIVE
ACTIVE IDLE

NEW