Чей индекс пишется внизу на конверте – Как заполнять конверт («Почта России»)? Образец конверта – ЮРСОВЕТНИК 2021

Технология nfc создавалась для ограниченного круга приложений, таких как бесконтактная оплата, электронные ключи, электронные билеты и т. д. однако идея обмена данными на сверхмалых расстояниях оказалась настолько удачной, что сейчас область применения nfc значительно расширилась. активные и пассивные интеллектуальные nfc-устройства используются в промышленности, портативной электронике, медицине, автомобильном транспорте и других отраслях. в публикации предложен краткий обзор nfc-eeprom с двойным интерфейсом от компании stmicroelectronics.

Near Field Communication (NFC) представляет собой беспроводную технологию обмена данными, работающую с радиодиапазоном 13,56  МГц, и является развитием более ранних стандартов бесконтактных карт ISO/IEC 14443 и ISO/IEC 15693.

NFC-устройства объединяют функции привычной бесконтактной карты и ретранслятора и способны выполнять двунаправленный обмен данными, находясь в непосредственной близости друг от друга. Разделяют пассивные и активные NFC-устройства. Активные могут самостоятельно создавать электромагнитное поле для поддержания радиоканала.

  • эмуляция работы обычной бесконтактной карты (CARD EMULATION MODE);
  • обмен между пассивными и активными NFC-устройствами (READER/WRITER MODE);
  • обмен между двумя активными NFC-устройствами (PEER-TO-PEER MODE).

Изначально технология NFC была задумана как развитие бесконтактных карт для систем оплаты, однако в дальнейшем превратилась в полноценную беспроводную технологию обмена данными и нашла применение в самых разных областях и устройствах. Например, NFC-модули появились во многих современных смартфонах, а поддержка данного стандарта присутствует в ОС Android (начиная с версии 4.0)

Широкую номенклатуру NFC-решений предлагает компания STMicroelectronics: от пассивных NFC-устройств до NFC-контроллеров (рис. 1). Данная статья посвящена наиболее интересному сегменту NFC-устройств от STMicroelectronics, а именно памяти EEPROM с двойным интерфейсом.

NFC: особенности и стандарты

Говоря о NFC, следует кратко коснуться основных отраслевых стандартов, определяющих данную технологию (табл. 1).

Основные положения, относящиеся к NFC, представлены в стандарте ISO/IEC 18092. В России существует переведенный и адаптированный аналог — ГОСТ Р ИСО/МЭК 18092-2021 «Телекоммуникации и обмен информацией между системами. Коммуникация в ближнем поле. Интерфейс и протокол (NFCIP-1)».

ГОСТ Р ИСО/МЭК 18092-2021 определяет режимы индуктивной связи устройств, работающих на центральной частоте 13,56 МГц, интерфейс и протокол коммуникации при активном и пассивном режиме связи, схемы модуляции, кодирования, скорости передачи и радиочастотную структуру интерфейса устройств NFC, схемы инициализации и условия, необходимые для контроля за конфликтными ситуациями во время инициализации.

Как уже было сказано, изначально технология NFC создавалась как развитие стандартов бесконтактных карт ISO/IEC 14443 и ISO/IEC 15693. По этой причине NFC-устройства совместимы с существующей инфраструктурой бесконтактных карт. Для подтверждения совместимости в документации указывается соответствующий стандарт.

От ISO/IEC 14443 и ISO/IEC 15693 технология NFC унаследовала и физическую реализацию канала передачи данных. Параметры радиоканала определяются в стандарте ISO/IEC 18000 Часть 3 «Параметры для интерфейса воздушных коммуникаций в 13,56 МГц».

EEPROM с двойным интерфейсом от STMicroelectronics

Наиболее интересным NFC-решением от STMicroelectronics представляются активные NFC-устройства серий M24LR, M24SR, ST25DV-I2C и ST25DV-PWM. По сути, это микросхемы EEPROM с двойным интерфейсом (рис. 2). Серии M24LR, M24SR, ST25DV-I2C обеспечивают доступ к EEPROM со стороны других NFC-устройств по радиоканалу, а также доступ со стороны управляющего микроконтроллера по I2C. Серия ST25DV-PWM вместо I2C имеет ШИМ-выходы.

Между собой серии M24LR, M24SR, ST25DV-I2C и ST25DV-PWM различаются параметрами NFC-канала, характеристиками памяти, эксплуатационными характеристиками и наличием дополнительных особенностей. Поскольку статья посвящена NFC, то начать ее следует именно с рассмотрения параметров NFC-канала и дополнительных функций микросхем.

Характеристики NFC-канала и дополнительные особенности EEPROM с двойным интерфейсом

Серии EEPROM с двойным интерфейсом имеют различную дальность действия и скорость обмена данными по NFC. Серия M24SR совместима со стандартом ISO14443 и может обеспечивать обмен информацией с другими NFC-устройствами на расстояниях до 10 см (табл. 2).

Дальность действия радиоканала напрямую определяет и скорость передачи данных. Для представителей серии M24SR скорость достигает 106 кбит/с, в то время как для остальных микросхем стандартная скорость составляет 26  кбит/с. Для M24LR, ST25DV возможна частота обмена 53  кбит/с.Чей индекс пишется внизу на конверте – Как заполнять конверт («Почта России»)? Образец конверта - ЮРСОВЕТНИК 2021

Вторым рабочим интерфейсом для серий M24LR, M24SR, ST25DV-I2C является I2C, максимальная частота обмена по которому составляет 1 МГц для M24LR и ST25DV-I2C, и 400 кГц для M24SR.

В микросхемах ST25DV-PWM отсутствует I2C-интерфейс. Вместо него в распоряжении пользователя оказывается один или два ШИМ-выхода (табл. 3). Суть данного решения достаточно очевидна: благодаря таким микросхемам можно обойтись без дополнительного управляющего микроконтроллера в целом ряде простых приборов, таких как светодиодные светильники, устройства с электродвигателями (например, электронные замки) и т. д.

Выходная частота ШИМ-сигнала в ST25DV-PWM может быть запрограммирована в диапазоне 488–31250 Гц. Разрядность зависит от частоты и достигает 15 бит при 488 Гц ШИМ. Микросхема способна обеспечивать выходной ток до 4  мА. Конечно же, этого недостаточно для прямого управления электродвигателем или мощным светодиодом, соответственно, в зависимости от приложения в схеме может понадобиться усилитель или драйвер.

В остальных сериях — M24LR, M24SR, ST25DV-I2C — также существует возможность реализации простейших функций управления без участия дополнительного микроконтроллера. Для этого могут быть использованы цифровые выходы с открытым истоком. В серии ST25DV-I2C есть модели с КМОП-выходами.

Важным достоинством микросхем ST25DV-I2C является наличие встроенного буфера объемом 256 байт. С его помощью удается реализовать функцию быстрого обмена данными (Fast Transfer mode) между контроллером и внешним NFC-устройством.

Также следует отметить интересную функцию сбора энергии (Energy Harvesting), которая присутствует в сериях M24LR и ST25DV-I2C. Эти микросхемы способны собирать энергию внешнего электромагнитного поля, создаваемого ридером, и применять ее не только для собственного питания, но и для питания других компонентов схемы.

Эксплуатационные характеристики и параметры EEPROM

Не надо забывать, что M24LR, M24SR, ST25DV-I2C и ST25DV-PWM — это в первую очередь микросхемы памяти, а потому следует рассмотреть и соответствующие параметры данных компонентов (табл. 4).

Все представленные серии имеют объем памяти EEPROM до 64 кбит, за исключением ST25DV-PWM, для которой существуют только 2-кбит модели.

Для защиты данных от взлома разработчикам предлагается использовать пароли, кроме того, в ST25DV-PWM присутствует блок цифровой подписи TruST25.

С точки зрения длительности хранения данных серии также различаются. При этом выделяется серия M24SR. По утверждениям STMicroelectronics, представители M24SR способны сохранять информацию в течение 200 лет при температуре 55 °С.

Для всех микросхем рабочий диапазон температур при использовании NFC-канала составляет –40… 85 °C. Если же радиоинтерфейс не используется, возможна работа в диапазоне –40… 105 °C (кроме M24LR).

Анализируя характеристики отдельных серий, трудно дать какие-либо рекомендации по применению в той или иной области. Скорее выбор будет основываться на особенностях конкретного приложения. Тем не менее микросхемы EEPROM с двойным интерфейсом от STMicroelectronics будут востребованы в бытовых приложениях, медицинской технике, промышленном оборудовании, в портативной электронике и иных областях.

Обзор модельного ряда EEPROM с двойным интерфейсом от STMicroelectronics

В настоящий момент номенклатура EEPROM с двойным интерфейсом от STMicroelectronics включает более десятка моделей. Кроме того, каждая модель имеет различные корпусные исполнения: SO8, TSSOP8, UFDFPN (табл. 5).

Инструменты разработки и отладки

Важное преимущество продукции STMicroelectronics — хорошая техническая поддержка. Специалистам предлагается весь спектр средств разработки и отладки: программные библиотеки, оценочные наборы, огромный перечень руководств и документации, утилита для расчета печатных катушек.

Для каждой серии микросхем (за исключением самой новой серии ST25DV-PWM) выпускаются различные отладочные наборы. При этом существует выбор между законченными наборами Discovery и платами расширения для фирменных стеков Nucleo от STMicroelectronics (рис. 3–5). Каждый из наборов сопровождается программным пакетом с примерами и библиотеками.

Большая часть микросхем имеет повыводную совместимость (8-выводные корпуса), кроме того, они способны работать с одними и теми же антеннами. Для NFC применяются как печатные антенны, так и SMD-индуктивности.

Читайте ещё про NFC:  С карты «Сбера» несколько раз списали деньги без моего ведома — Приёмная на

Расчет печатной антенны может оказаться наиболее пугающим этапом разработки, поэтому STMicroelectronics предлагает использовать для таких целей простую утилиту. От разработчика требуется лишь ввести параметры антенны (число витков, длина, ширина), параметры проводников (ширина, зазор, толщина металлизации), параметры основания (толщина, диэлектрическая проницаемость), после чего программа автоматически высчитает величину эквивалентной индуктивности (рис. 6).

Заключение

Технология NFC является дальнейшим развитием бесконтактных устройств ближнего радиуса действия и имеет обратную совместимость со всей существующей инфраструктурой бесконтактных карт, поддерживающих стандарты ISO/IEC 14443 и ISO/IEC 15693.

Компания STMicroelectronics предлагает широкий выбор NFC-решений, начиная от пассивных устройств и заканчивая NFC-контроллерами. Данная статья посвящена микросхемам EEPROM с двойным интерфейсом. На сегодня STMicroelectronics выпускает три серии микросхем, обеспечивающих доступ к памяти через NFC-радиоканал и I2C-интерфейс:

  • M24SR с объемом до 64 кбит и радиусом действия до 10 см;
  • M24LR с объемом до 64 кбит, с увеличенным радиусом действия и функцией сбора энергии;
  • ST25DV-I2C с объемом до 64 кбит, с увеличенным радиусом действия, с функцией сбора энергии и возможностью ускоренного обмена между микроконтроллером и NFC-ридером.

Эти микросхемы могут использоваться в бытовых приложениях, медицинской технике, промышленном оборудовании, в портативной электронике и т. д.

Особое место в номенклатуре STMicroelectronics занимает серия ST25DV-PWM, у которой вместо I2C реализованы ШИМ-выходы. Такая особенность позволяет отказаться от управляющего контроллера в целом ряде приложений, например при создании светодиодных светильников или электронных замков.

Литература:

Банковские карты

Чипы NFC используются не только в мобильных устройствах в режиме эмуляции карты, но и в самих пластиковых картах, для возможности бесконтактной оплаты, и еще в других распространенных устройствах с возможностью эмуляции вашей карты, типа кольца или браслета со встроенным чипом NFC.Чей индекс пишется внизу на конверте – Как заполнять конверт («Почта России»)? Образец конверта - ЮРСОВЕТНИК 2021
Рис. 15. Этапы прохождения платжной транзакции.

В случае использования контактной карты, в ее чип зашивается платежное приложение банка-эмитента, которое через платежную систему взаимодействует с банком-эквайером продавца при проведении платежной транзакции, и персональные платежные данные клиента банка, на чье имя выпущена карта. Данные хранятся в зашифрованном криптоключами виде и защищены от перезаписи или изменения.

В работе бесконтактной карты добавляется NFC модуль, который обеспечивает бесконтактное соединение со считывателем банковских карт.

Что же происходит в случае эмулирования карты мобильным телефоном. Чтобы не записывать на чип SE в мобильном устройстве платежные приложения всех банковских карт, которыми пользуется владелец устройства, которые к тому же надо персонализировать, т.е. передать данные о выпущенных картах и хранить их в защищенном виде, была сформулирована роль TSM (Trusted Service Manager), который объединяет с одной стороны поставщиков услуг (Service Provider TSM), а с другой стороны чипы Secure Element (Secure Element Issuer TSM).

TSM — Trusted Service Manager — уникальный посредник, который владеет ключами. Это аппаратно-программный комплекс, предоставляющий технологические отношения между операторами связи и поставщиками услуг.
Чей индекс пишется внизу на конверте – Как заполнять конверт («Почта России»)? Образец конверта - ЮРСОВЕТНИК 2021
Рис. 16. Trusted Service Manager или TSM – доверенный поставщик услуг. Выполняет защищенную загрузку и менеджмент контента защищенного элемента (SE) для транспортных приложений, магазинов, мобильных операторов, банковских приложений, конфиденциальные данные держателя карты.Ключевые услуги доверенной третьей стороны включают защищенную загрузку и менеджмент контента элемента безопасности, выполняемый при взаимодействии с провайдерами мобильных сервисов. Это могут быть банки, транспортные компании, поставщики и агрегаторы услуг. Удаленное управление приложениями, обычно выполняемое с использованием технологий беспроводной сотовой связи (over-the-air, OTA), включает установку и персонализацию приложений в элементе безопасности мобильного телефона, а также дальнейшее обслуживание установленных приложений на всем протяжении их жизненного цикла, равно как и сервисную поддержку. Подробнее о TSM здесь. Однако эта технология платежей все равно требовала присутствия физического защищенного элемента на мобильном устройстве. Что давало определенные ограничения, например, если производитель мобильного устройства не включил SE в свою платформу, в этом случае, требовалось менять SIM-карту на карту с поддержкой SE у мобильного оператора.

В 2021 году Дугом Йегером и Тедом Фифельски, основателями SimplyTapp, Inc. был придуман термин «эмуляция хост-карты» (Host Card Emulation ), который описывал возможность открытия канала связи между терминалом бесконтактных платежей и удаленным размещенным защищенным элементом, содержащим финансовые данные, данные платежной карты, позволяющие проводить финансовые операции в терминале торговой точки. Они внедрили эту новую технологию в операционной системе Android, начиная с версии 4.4. HCE требует, чтобы протокол NFC направлялся в основную операционную систему мобильного устройства, а не в локальную микросхему защищенного аппаратного элемента (SE). Итак, начиная с версии Android 4.4 KitKat управление платежными операциями взял на себя не физический элемент, а API, точнее Google Pay API. Эмуляция карты неотделима от понятия «токенизация», потому что это следующая ступень защиты платежных данных в виртуальном мире после TSM, который выдавал ключи. Токен — это ссылка (то есть идентификатор), которая сопоставляется с конфиденциальными данными через систему токенизации. Сопоставление исходных данных с токеном использует методы, которые делают невозможным обратное преобразование токенов в исходные данные вне системы токенизации, например, с использованием токенов, созданных при помощи случайных чисел. Т.е. вместо номера вашей карты API хранит токен, полученный от банка-эмитента, который бесполезен в том виде, в котором он хранится. Даже если его узнают третьи лица, воспользоваться им будет невозможно.
Чей индекс пишется внизу на конверте – Как заполнять конверт («Почта России»)? Образец конверта - ЮРСОВЕТНИК 2021

Рис. 17. Токенизация.Когда вы вводите номер карты в мобильное приложение, обеспечивающее возможность мобльных платежей, например, номер карты 4111 1111 1111 1234, удаленный поставщик токенов (remote token service server) возвращает вместо номера карты токен вида 4281 **** **** 2819, который хранится в мобильном устройстве.

Токенизация при использовании Google Pay:

  1. Когда пользователь добавляет в Google Pay свою кредитную или дебетовую карту, приложение запрашивает у банка-эмитента токен. Затем Google Pay шифрует токенизированную карту, и она становится доступна для оплаты.
  2. При оплате клиент прикладывает свое мобильное устройство к терминалу или нажимает соответствующую кнопку в приложении. Google Pay отправляет токен и криптограмму, которая действует как одноразовый код. Платежная система проверяет криптограмму и соотносит токен с номером карты клиента.
  3. Для завершения транзакции ваш банк-эквайер и банк-эмитент покупателя используют данные клиента и расшифрованную информацию о его платеже

При этом:

Пример программы для arduino

Перед загрузкой кода, ранее считанные значения ID Value перенесём в программу, массивы uidFirstCard, uidSecondCard и uidThirdCard предназначены для хранения ID Карт.

nfc_rfid_three_led_arduino.ino
#include <Wire.h>#include <SPI.h>
 
// библиотека для работы с RFID/NFC#include <Adafruit_PN532.h>
 
// пин прерывания#define PN532_IRQ   9
 
// создаём объект для работы со сканером и передаём ему два параметра// первый — номер пина прерывания// вторым — число 100// от Adafruit был программный сброс шилда// в cканере RFID/NFC 13,56 МГц (Troyka-модуль) этот пин не используется// поэтому передаём цифру, большая чем любой пин Arduino
Adafruit_PN532 nfc(PN532_IRQ,100);
 
// пины к которым подключены светодиоды Troyka_led#define LED_FIRST   A0#define LED_SECOND  A1#define LED_THIRD   A2
 
 
// Массивы в которые необходимо записать ID карт:uint8_t uidFirstCard[]={0x04,0x40,0xA9,0xDA,0xA3,0x40,0x80};uint8_t uidSecondCard[]={0x04,0xAB,0xB4,0xDA,0xA3,0x40,0x80};uint8_t uidThirdCard[]={0x04,0x71,0xC1,0xDA,0xA3,0x40,0x81};
 
// функция которая сравнивает два переданных ID// при совпадении возвращает значение true// и значение false если ID разные
boolean comparisonOfUid(uint8_t uidRead[8],uint8_t uidComp[8],uint8_t uidLen){for(uint8_t i =; i < uidLen; i  ){if(uidRead[i]!= uidComp[i]){returnfalse;}if(i ==(uidLen)-0x01){returntrue;}}}
 
// функция переключающая светодиод, получает входные параметры:// номер светодиода ledvoid toggleLed(int led){if(digitalRead(led)== LOW){
digitalWrite(led, HIGH);}else{
digitalWrite(led, LOW);}}
 
void setup(void){// инициализация пинов Led
pinMode(LED_FIRST, OUTPUT);
pinMode(LED_SECOND, OUTPUT);
pinMode(LED_THIRD, OUTPUT);
 
// инициализация Serial - порта
Serial.begin(9600);// инициализация RFID/NFC сканера
nfc.begin();int versiondata = nfc.getFirmwareVersion();if(!versiondata){while(1){
Serial.print("Didn't find RFID/NFC reader");
delay(1000);}}
Serial.println("Found RFID/NFC reader");// настраиваем модуль
nfc.SAMConfig();
Serial.println("Waiting for a card ...");}
 
void loop(void){uint8_t success;// буфер для хранения ID картыuint8_t uid[8];// размер буфера картыuint8_t uidLength;// слушаем новые метки
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid,&uidLength);// если найдена картаif(success){// Переключаем первый светодиод если функция сравнения// ID вернёт true иначе оставляем всё как естьif(comparisonOfUid(uid, uidFirstCard, uidLength)){
toggleLed(LED_FIRST);
Serial.println("FirstTAG");}else{// Переключаем второй светодиод если функция сравнения// ID вернёт true иначе оставляем всё как естьif(comparisonOfUid(uid, uidSecondCard, uidLength)){
toggleLed(LED_SECOND);
Serial.println("SecondTAG");}else{// Переключаем третий светодиод если функция сравнения// ID вернёт true иначе оставляем всё как естьif(comparisonOfUid(uid, uidThirdCard, uidLength)){
toggleLed(LED_THIRD);
Serial.println("ThirdTAG");}else{
Serial.println("NoTAG");}}}
delay(1000);}}

Пример программы для iskrajs

Повторим те же операции, что и для Arduino. Перед загрузкой кода, ранее считанные значения uid перенесём в программу, массивы uidFirstCard, uidSecondCard и uidThirdCard предназначены для хранения ID Карт.

Читайте ещё про NFC:  Samsung Pay не работает на рутованых смартфонах — «Хакер»

nfc_rfid_three_led_iskrajs.js
// настраиваем I2C1 для работы модуля
I2C1.setup({sda: SDA, scl: SCL, bitrate:400000});
 
// подключаем модуль к I2C1 и пину прерыванияvar nfc = require('@amperka/nfc').connect({i2c: I2C1, irqPin: P9});// подключаем 3 светодиодаvar ledFirst = require('@amperka/led').connect(A0);var ledSecond = require('@amperka/led').connect(A1);var ledThird = require('@amperka/led').connect(A2);
 
// ID-карт, при поднисенни которых буду переключаться светодиоды.// считываем их примером из console:const uidFirstCard  =[4,113,193,218,163,64,129];const uidSecondCard =[4,64,169,218,163,64,128];const uidThirdCard  =[4,171,180,218,163,64,128];
 
// активируем модуль
nfc.wakeUp(function(error){if(error){
print('wake up error', error);}else{
print('wake up OK');// слушаем новые метки
nfc.listen();}});
 
nfc.on('tag',function(error, data){if(error){
print('tag read error');}else{// выводим в консоль полученные данные
print(data.uid);// переводим массив-байт в строку для удобства сравнения// вызываем функцию-обработчик метки
factoryLedLight(data.uid);}// каждые 1000 миллисекунд слушаем новую метку
setTimeout(function(){
nfc.listen();},1000);});
 
// функция-обработчик, сравнивает массивы и при совпадении возвращает truefunction comparisonOfUid(uid, card){// переменная хранящая длину массиваvar leng = uid.length;// цикл поэлементно проверяет равенство значенийfor(var i =; i < leng; i  ){// сравнение элементов между собойif(uid[i]!= card[i]){// если элементы не равны прекращаем работу функции и возвращаем falsereturnfalse;}// если все элементы массива равны возвращаем trueif( i == uid.length-1){returntrue;}}}
 
// функция сравнивает ID текущей метки с ID меток в константах// при совпадении переключает светодиодfunction factoryLedLight(id){if(comparisonOfUid(id, uidFirstCard)){
console.log('FirstTAG');
ledFirst.toggle();}else{if(comparisonOfUid(id, uidSecondCard)){
console.log('SecondTAG');
ledSecond.toggle();}else{if(comparisonOfUid(id, uidThirdCard)){
console.log('ThirdTAG');
ledThird.toggle();}else{
console.log('NoTAG');}}}}

Пробежимся по коду


Давайте кратенько пробежимся по коду, который можно посмотреть

. Там пример эмуляции двух типов карт, я разберу только EM4102.

Перво-наперво, как гласит код, нам при прошивке микроконтроллера надо прошить fuse-биты в значение lfuse to 0xC0: таким образом, чтобы контроллер тактировался от внешнего генератора. Обращаю внимание, что любая перепрошивка контроллера будет сопряжена с тем, что его надо будет тактировать от внешнего источника, так как мы устанавливаем fuse биты с генерацией от внешнего генератора!

Весь код основан на макросах. Напомню, что такое макросы — это программа, которая подготавливает код к компиляции. Наша программа состоит всего из нескольких ассемблеровских инструкций: rjmp, call (2 такта), nop, ldi, out и ret (все по 1 такту)! Всё, весь остальной код формируется макросами в зависимости от макроса серийного номера (дефайна).

Особенность работы в том, что у нас достаточно мало тактов для нормальной работы. Попробуй успей за 32 такта сделать что-то, учитывая что инструкции перехода в контроллере AVR занимают 2 такта. Поэтому весь код генерируют макросы в зависимости от ID-карты.

#define FORMAT_IS_EM4102
#define EM4102_MFR_ID		0x12
#define EM4102_UNIQUE_ID	0x3456789A

Дефайнами задаём какой тип карты мы эмулируем и задаём ID-карты. Это главный макрос, на основании которого и формируется остальной код. И, тадам, его величество макросы.

    .macro	delay cycles
.if cycles > 1
rjmp	. 0
delay	(cycles - 2)
.elseif cycles > 0
nop
delay	(cycles - 1)
.endif
.endm

Макрос задержки, принимает на вход количество тактов задержки. Достаточно очевидный рекурсивный макрос, осуществляет задержку с помощью команды nop (нет операции, 1 такт) и команды rjmp . 0 (перейти на следующую строку, 2 такта). Комбинируя эти команды между собой, можно сделать задержку нужной длинны в тактах. По сути код ничего не делает, только тратит машинное время.

Если вы ещё соображаете, то дальше я вам совсем изнасилую мозг, но код так гениален что вам придётся потерпеть.

Рекурсивный макрос кодирования манчестер-кодом.

    .macro	manchester bit, count=1
.if		count
manchester (bit >> 1), (count - 1)
.if		bit & 1
baseband_1
baseband_0
.else
baseband_0
baseband_1
.endif
.endif
.endm
.macro	stop_bit
baseband_0
baseband_1_last
.endm

Собственно тут и осуществляется вся логика. Принимает на вход битовую маску и счётчик битов. Если счётчик не нуль, то вызываем ещё раз сами себя, декрементируя счётчик (рекурсивный макрос, ага). Далее в самом теле идут вызовы макросов baseband_0, baseband_1 и baseband_1_last.

Помните выше я приводил таблицу в статье, как идёт кодирование содержимого карты, где идут биты чётности, и стоп биты в конце. Так вот, наша задача теперь ID-метки закодировать этим методом, для этого у нас существуют два макроса.

#define ROW_PARITY(n)  ( (((n) & 0xF) << 1) | 
(((n) ^ ((n) >> 1) ^ ((n) >> 2) ^ ((n) >> 3)) & 1) )
#define COLUMN_PARITY  ( (EM4102_MFR_ID >> 4) ^        
(EM4102_MFR_ID) ^             
(EM4102_UNIQUE_ID >> 28) ^    
(EM4102_UNIQUE_ID >> 24) ^    
(EM4102_UNIQUE_ID >> 20) ^    
(EM4102_UNIQUE_ID >> 16) ^    
(EM4102_UNIQUE_ID >> 12) ^    
(EM4102_UNIQUE_ID >> 8) ^     
(EM4102_UNIQUE_ID >> 4) ^     
(EM4102_UNIQUE_ID) )


ROW_PARITY — расчёт бита чётности в строке из четырёх бит, COLUMN_PARITY — расчёт контрольной суммы всей посылки.

Вся логика работы у нас описывается в макросе в .main

        header
manchester	ROW_PARITY(EM4102_MFR_ID >> 4), 5
manchester	ROW_PARITY(EM4102_MFR_ID >> 0), 5
manchester	ROW_PARITY(EM4102_UNIQUE_ID >> 28), 5
manchester	ROW_PARITY(EM4102_UNIQUE_ID >> 24), 5
manchester	ROW_PARITY(EM4102_UNIQUE_ID >> 20), 5
manchester	ROW_PARITY(EM4102_UNIQUE_ID >> 16), 5
manchester	ROW_PARITY(EM4102_UNIQUE_ID >> 12), 5
manchester	ROW_PARITY(EM4102_UNIQUE_ID >> 8), 5
manchester	ROW_PARITY(EM4102_UNIQUE_ID >> 4), 5
manchester	ROW_PARITY(EM4102_UNIQUE_ID >> 0), 5
manchester	COLUMN_PARITY, 4
stop_bit

Ну то есть, так же точно передаём заголовочные 9 бит, потом манчестер кодинг, высчитывая бит чётности для каждых 4-х бит, в конце контрольная сумма и стоп бит.

Осталось разобраться, что же такое baseband. Для этого у нас служат ещё одни макросы обёртки (да сколько можно-то, а?).

        .macro baseband_0
rcall	baseband30_0
rjmp	. 0
.endm
.macro baseband_1
rcall	baseband30_1
rjmp	. 0
.endm
.macro baseband_1_last
rcall	baseband30_1
rjmp	main
.endm
.macro header
manchester 0x1FF, 9
.endm

Макросы baseband* — выполняют ассемблеровский код: вызывают соответствующие функции, и потом делают переход на другую команду. Макрос baseband_1_last — аналогична макросу baseband_1, кроме того что делает безусловный переход не на команду ниже, а в начало функции main.

Читайте ещё про NFC:  Huawei Share: как работает служба для быстрого обмена файлами - 4APK

Последнее, что осталось разобрать — это функции baseband30_0 и baseband30_1. Они описываются следующим кодом.

baseband30_0:
ldi	r16, OUT_PINS		// 1
rjmp	baseband30		// 2
/*
* Emit a 1 at the baseband layer.
* Takes a total of 30 clock cycles, including call overhead.
*/
baseband30_1:
ldi	r16, 0			// 1
rjmp	baseband30		// 2
/*
* Internal routine for baseband32_0 and _1. Must use
* a total of 24 clock cycles. (32 - 1 ldi - 2 rjmp - 3 rcall)
*/ 
baseband30:
out	_SFR_IO_ADDR(DDRB), r16		// 1
delay	19				// 19
ret					// 4

В зависимости от того, какая функция вызывается baseband30_0 или baseband30_1 в регистр r16 записывается значение того что должно быть на пине ввода/вывода: 1 или 0. После этого идёт безусловный переход на baseband30 осуществляется вывод и задержка на 19 тактов, после чего идёт возврат.

Самая большая магия этого кода, что он просчитан точно до каждого такта, каждый такт передачи манчестерского кода занимает ровно столько периодов, сколько допустимо стандартом, а именно 32 такта процессора! Это фантастически гениально, надо помнить сколько тактов занимает каждая команда.

Давайте его скорее скомпилируем и посмотрим как он выглядит, как развернутся все эти макросы. Компилируем командой make (предварительно установив avr-gcc) и дизассемблируем получившийся elf-файл

00000000 __vectors:
0:	0e c0       	rjmp	. 28     	; 0x1e __ctors_end
2:	15 c0       	rjmp	. 42     	; 0x2e __bad_interrupt
...

Вначале у нас вектора прерываний, но нас интересует только первый jump. Так как остальные вектора никуда не ведут.

0000001e __ctors_end:
1e:	11 24       	eor	r1, r1
20:	1f be       	out	0x3f, r1	; 63
22:	cf e5       	ldi	r28, 0x5F	; 95
24:	d2 e0       	ldi	r29, 0x02	; 2
26:	de bf       	out	0x3e, r29	; 62
28:	cd bf       	out	0x3d, r28	; 61
2a:	02 d0       	rcall	. 4      	; 0x30 main
2c:	11 c1       	rjmp	. 546    	; 0x250 _exit


Здесь мы настраиваем порты ввода/вывода, и вызываем функцию main. A main состоит из безумного количества вызовов функций baseband30* и jump (так развернулся наша адский цирк макросов).

00000030 main:
30:	01 d1       	rcall	. 514    	; 0x234 baseband30_1
32:	00 c0       	rjmp	. 0      	; 0x34 main 0x4
34:	fd d0       	rcall	. 506    	; 0x230 baseband30_0
36:	00 c0       	rjmp	. 0      	; 0x38 main 0x8
38:	fd d0       	rcall	. 506    	; 0x234 baseband30_1
3a:	00 c0       	rjmp	. 0      	; 0x3c main 0xc
3c:	f9 d0       	rcall	. 498    	; 0x230 baseband30_0
3e:	00 c0       	rjmp	. 0      	; 0x40 main 0x10
40:	f9 d0       	rcall	. 498    	; 0x234 baseband30_1
42:	00 c0       	rjmp	. 0      	; 0x44 main 0x14
44:	f5 d0       	rcall	. 490    	; 0x230 baseband30_0
46:	00 c0       	rjmp	. 0      	; 0x48 main 0x18
48:	f5 d0       	rcall	. 490    	; 0x234 baseband30_1
4a:	00 c0       	rjmp	. 0      	; 0x4c main 0x1c
4c:	f1 d0       	rcall	. 482    	; 0x230 baseband30_0
...
22e:	00 cf       	rjmp	.-512    	; 0x30 main

И так далее… пока не джампнемся снова на main

Ну и глянем как же выглядит наш baseband модуль.

00000230 baseband30_0:
230:	08 e1       	ldi	r16, 0x18	; 24
232:	02 c0       	rjmp	. 4      	; 0x238 baseband30
00000234 baseband30_1:
234:	00 e0       	ldi	r16, 0x00	; 0
236:	00 c0       	rjmp	. 0      	; 0x238 baseband30
00000238 baseband30:
238:	07 bb       	out	0x17, r16	; 23
23a:	00 c0       	rjmp	. 0      	; 0x23c baseband30 0x4
23c:	00 c0       	rjmp	. 0      	; 0x23e baseband30 0x6
23e:	00 c0       	rjmp	. 0      	; 0x240 baseband30 0x8
240:	00 c0       	rjmp	. 0      	; 0x242 baseband30 0xa
242:	00 c0       	rjmp	. 0      	; 0x244 baseband30 0xc
244:	00 c0       	rjmp	. 0      	; 0x246 baseband30 0xe
246:	00 c0       	rjmp	. 0      	; 0x248 baseband30 0x10
248:	00 c0       	rjmp	. 0      	; 0x24a baseband30 0x12
24a:	00 c0       	rjmp	. 0      	; 0x24c baseband30 0x14
24c:	00 00       	nop
24e:	08 95       	ret


В конце видно как delay развернулся в список jump и nop для задержки. Вот такая красивая магия.

Ну что же, с кодом разобрались. Соберите вытекший мозг с ушей, переходим к испытаниям.

Создание антенны

Никаких хитростей в создании катушечной антенны нет, но всё же необходимо ознакомиться с документацией и понимать физику процесса… Это не сложно, и справится даже школьник, требуется только немного терпения и усидчивости.

Собрать и настроить антенну очень просто, прямо как в картинке из [1].

Для расчёта антенны надо вспомнить немного теории. Нам необходимо сделать колебательный контур, который будет настроен на частоту 125 кГц. Откроем курс Теоретических Основ Электротехники и прочитаем, что же такое колебательный контур:

Колебательный контур, электрическая цепь, содержащая катушку индуктивности и конденсатор, в которой могут возбуждаться электрические колебания. Параллельный колебательный контур

Если оставить всю математику и перейти к сути, у колебательного контура есть такой параметр, как резонансная частота, которая определяется по формуле.

Где

f

— частота колебаний,

L

— индуктивность катушки,

C

— ёмкость конденсатора.

В данном случае у нас есть фиксированный параметр — частота, а с ёмкостью и индуктивностью мы можем играться. Для того чтобы рассчитать катушку, воспользуемся документом [2]. Все кто хоть как-то собираются делать антенны для RFID меток (любых частот), обязаны с ним ознакомиться!

Многие умельцы, как для ридеров, так и для эмуляторов (суть не важна) делают круглые катушки. Их проще считать и изготавливать, но они имеют существенный недостаток — их линейные размеры больше карточки. Я хочу изготовить катушку индуктивности в форме прямоугольника, с линейными размерами меньше размеров стандартной карты и, чтобы результирующее устройство было размером со стандартную карту RFID.

В результате выбираю размер будущей катушки индуктивности практически такой же, как стоит в настоящей метке, то есть примерно 70х40 мм. Если конденсатор выбрать 10 нФ, то индуктивность катушки (из формулы выше), должна составлять у нас 162 мкГн.

Как видим параметры толщины и ширины катушки у нас неизвестные и изменяемые (упираются в толщину провода 0,2 мм), но общие прикидки мне дали цифру в 42 витка. Можно было бы сделать несколько итераций, и сделать прям точный-точный расчёт, но в нашем штучном случае, и так сойдёт.

После чего, необходимо изготовить каркас 70х40 мм для намотки катушки. Его я изготовил из текстолита и на него намотал катушку.

Каркас из текстолитаНамотка и готовая катушка

К сожалению, измерителя индуктивности у меня нет, поэтому пришлось действовать далее методом научного тыка. Поскольку я наверняка ошибся в расчётах, и в количестве витков, когда наматывал катушку, так как делал их приблизительно и на глаз, то я решил подобрать резонансную ёмкость вручную.

Начнём подбор резонансного конденсатора

Сначала я проверил конденсатор емкостью 10 нФ, который должен быть резонансным. Но амплитуда сигнала сразу просела, по сравнению с пустой катушкой. Тогда я взял конденсатор меньшего номинала. И так перебирал конденсаторы, пока не поймал резонанс. Таким образом резонансная ёмкость конденсатора составила 3,2 нФ.

Сигнал без конденсатора, пустая катушкаСигнал 10 нФ1 нФ, 2 нФ3 нФ, 4 нФ, 2,2 нФ3,2 нФ

Видно, что пробовал разные варианты, и было ясно что максимум лежит где-то между 3 и 4 нФ и результатом стал конденсатор 3,2 нФ (состоящий из двух конденсаторов в параллели). Всё, наша катушка готова к дальнейшим опытам.

Вообще, хочу заметить, что катушку можно сделать вообще в виде дорожек на печатной плате, и при небольшой серии изделий так и стоит делать. Вот, пример такой платы, именно на 125 кГц от Alexander Guthmann. К сожалению, сайт практически умер, а автор давно не выходит на связь, так что довольствуемся только моими фото. Если кто поможет его найти, буду признателен! Не знаю что с ним случилось.

Таким образом, делать эмулятор сразу в виде печатной платы — нет никаких проблем. Думаю имея руководство

, сможете рассчитать такое самостоятельно, раз это смог сделать четырнадцатилетний немецкий школьник.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector