OS-VVM (Диплом)/Спецификация микросхемы Mifare Ultralight — различия между версиями
ANA (обсуждение | вклад) м (→BCC =) |
м (→Анализ команд и ответов ИМС) |
||
(не показаны 80 промежуточных версий 2 участников) | |||
Строка 48: | Строка 48: | ||
==== Анализ команд и ответов ИМС ==== | ==== Анализ команд и ответов ИМС ==== | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
{| class="wikitable" | {| class="wikitable" | ||
Строка 90: | Строка 62: | ||
! Размер | ! Размер | ||
! Описание | ! Описание | ||
+ | |- | ||
+ | | 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х93 | ||
| 0х20-0х67 | | 0х20-0х67 | ||
− | | | + | | s8p8pee |
− | | '''16'''+ | + | | '''16'''+5 |
| Антиколлизия каскадного уровня 1 | | Антиколлизия каскадного уровня 1 | ||
| UID + BCC1 | | UID + BCC1 | ||
− | | | + | | s8p..8pBCC1e |
− | | | + | | 2..47 |
| Часть UID + BCC1 | | Часть 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 === | === BCC === | ||
+ | Вычисляется как "исключающее или" по 4 предыдущим байтам | ||
=== CRC16=== | === CRC16=== | ||
+ | B.3 Code sample written in C language for CRC calculation | ||
+ | |||
+ | <source lang="cpp"> | ||
+ | |||
+ | #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> | ||
+ | |||
+ | == Диаграмма состояний микросхемы == | ||
+ | |||
+ | <graph> | ||
+ | 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 == | == NEW == |
Текущая версия на 12:37, 19 апреля 2013
- Спецификация ИМС
- Тестовый план
- Описание тестовой программы
- Метрики и процессы покрытия (en)
- Coverage Examples (Practice) (en)
- Requirements Writing Guidelines (en)
Содержание |
Описание микросхемы
Список вопросов
Описание входных/выходных протоколов
Требования, предъявляемые к временным ограничениям сигналов
- частота (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);
Диаграмма состояний микросхемы
Таблица переходов
Состояние POR
Состояние IDLE
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
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
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
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
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
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 |