exponenta event banner

Ближняя полевая связь (NFC)

В этом примере показано, как моделировать связь между двумя устройствами NFC.

Введение

Near Field Communication (NFC) - основанная на стандартах технология беспроводной связи ближнего радиуса действия, предназначенная для интуитивной и простой связи между двумя электронными устройствами. NFC работает на центральной частоте 13,56 МГц (Fc), со скоростью от 106 кбит/с до 424 кбит/с, и его типичный рабочий диапазон составляет 10 см или менее. NFC всегда включает в себя инициатор и мишень - инициатор активно генерирует электромагнитное поле, которое может питать пассивную мишень.

ISO ®/IEC 18092 (Телекоммуникации и обмен информацией между системами - Ближняя полевая связь - Интерфейс и протокол), также называемый NFCIP-1 (Ближняя полевая связь - Спецификация интерфейса и протокола), является действующим международным стандартом для NFC. Он основан на ISO/IEC 14443. ISO/IEC 18092 включает два режима связи:

  • Пассивный: Устройство-инициатор генерирует поле несущей, а целевое устройство отвечает, модулируя существующее поле. В этом режиме целевое устройство извлекает свою рабочую мощность из электромагнитного поля, обеспечиваемого инициатором.

  • Активный: и инициатор, и целевое устройство взаимодействуют, поочередно генерируя свои собственные поля. Устройство отключает свое РЧ-поле во время ожидания данных. В этом режиме оба устройства обычно имеют источники питания.

В рамках двух режимов связи существуют три режима работы, определенные в ISO/IEC 18092:

  • Чтение/запись: В этом режиме устройство NFC может считывать данные из или записывать данные в любой из поддерживаемых NFC-тегов (бесконтактных карт) в стандартном формате данных NFC. Приложения включают в себя чтение информации, хранящейся в недорогих NFC-тегах, встроенных в этикетки или смарт-плакаты.

  • Эмуляция карты: Устройство NFC может также выступать в качестве NFC-тега для других устройств чтения. Это позволяет устройствам с поддержкой NFC, таким как смартфоны, действовать как смарт-карты для выполнения транзакций, таких как платежи или выдача билетов.

  • Peer-to-Peer: Два устройства NFC могут обмениваться данными. Приложения включают совместное использование связи WiFi или Bluetooth ® или обмен данными в виде виртуальных визитных карточек и фотографий.

Настройка системы

Этот пример иллюстрирует протокол NFC и команды, необходимые для передачи данных от инициатора к целевому объекту. Здесь используется пассивный режим связи, при котором Инициатор обеспечивает электромагнитное поле, и Цель посылает информацию обратно посредством модуляции этого поля. Инициатор работает как устройство записи, а цель - как эмулятор карты или тег. Инициатор и мишень используют радиоинтерфейс типа А, определенный в ISO/IEC 14443-2 (Идентификационные карты - Бесконтактные интегральные платы - Бесконтактные платы - Часть 2: Радиочастотная мощность и сигнальный интерфейс) и работают со скоростью 106 кбит/с. Инициатор использует кодировку Modified Miller со 100% ASK, как показано в области времени ниже. Цель генерирует поднесущую с частотой 847,5 кГц (Fs) посредством модуляции нагрузки, используя поле инициатора, и затем модулирует данные на несущей частоте инициатора, используя эту поднесущую. Ниже показана модуляция нагрузки анализатора спектра. Чтобы выделить поднесущую с частотой 847,5 кГц, в окне анализатора спектра выберите Tools- > Measurements- > Peak Finder. Цель использует манчестерское кодирование с 10% ASK, как показано в области времени ниже. Следует отметить, что сигналы временной области, показанные в двух временных областях, являются сигналами основной полосы частот, т.е. сигнал несущей 13,56 МГц отключается.

Объект nfcInitiator представляет инициатора. Свойство UserData содержит данные, которые должны быть переданы целевому объекту. Объект nfcTarget представляет целевой объект, а ReceivedUserData содержит данные, полученные от инициатора. Из-за малого диапазона устройств NFC SNR системы очень высок.

initiator = nfcInitiator
initiator = 
                     Fc: 13560000
       SamplesPerSymbol: 64
                     t1: 32
               AppLayer: []
               UserData: 'Hello, from MathWorks.'
    EnableVisualization: 1

target = nfcTarget
target = 
                     Fc: 13560000
                     Fs: 847500
       SamplesPerSymbol: 64
                    UID: '11aa22bb'
               AppLayer: []
       ReceivedUserData: ''
    EnableVisualization: 1

% Signal to noise ratio, in dB
snrdB = 50;
% Reset the RNG for reproducible results 
s = rng(0);

Инициализация и антиколлизия

Инициатор и цель следуют последовательностям инициализации и антиколлизии для установления линии связи. Рис. 9 (Блок-схема инициализации и антиколлизионной схемы для PCD) и Рис. 10 (Контур антиколлизионной схемы, блок-схема для PCD) в ISO/IEC 14443-3 (Идентификационные карты - Бесконтактные интегральные платы - Бесконтактные платы, Часть 3: Инициализация и антиколлизионная схема) иллюстрируют соответствующие блок-схемы. В разделе 6 (Тип A - Инициализация и антиколлизия) стандарта ISO/IEC 14443-3 подробно описаны команды и протокол. Функции nfcInitialization () и nfcAnticollingLoop () реализуют соответствующую последовательность команд и протокола. В примере показано состояние и действия устройств инициатора и адресата, а также важная информация, которой обмениваются для указания потока команд.

Транспортный протокол

Как описано в ISO/IEC 18092, транспортный протокол состоит из трех частей -

  • Активация протокола: Различные параметры протокола, такие как скорости передачи битов, согласовываются и выбираются в течение этой фазы. Раздел 12.5 (Активация протокола) стандарта ISO/IEC 18092 подробно описывает этот этап. Функция nfcProtocolActivation () реализует последовательность команд, необходимых на этой фазе.

  • Протокол обмена данными: обмен информацией на этом этапе осуществляется с использованием полудуплексного протокола, который поддерживает блочно-ориентированную передачу данных с обработкой ошибок. Подробную информацию см. в разделе 12.6 (Протокол обмена данными) стандарта ISO/IEC 18092. Функция nfcDataStartProtocol () показывает, как осуществлять обмен данными в соответствии с требованиями стандарта ISO/IEC 18092.

  • Деактивация протокола: После завершения обмена данными инициатор деактивирует протокол и соединение с целевым объектом. Функция nfcProtocolDeactivation () реализует последовательность, описанную в разделе 12.7 (Деактивация протокола) стандарта ISO/IEC 18092.

nfcPrint.Message('The message to transmit from Initiator to Target:');
The message to transmit from Initiator to Target:
nfcPrint.Message(initiator.UserData);
Hello, from MathWorks.
nfcPrint.Start();
Start of NFC Communication between Initiator and Target
nfcInitialization(initiator, target, snrdB);

	Initiator transmitted REQA
	Target received REQA

		Target transmitted ATQA in response to REQA
	Initiator received ATQA
		Target supports bit frame anticollision
		Target's UID size: single
nfcAnticollisionLoop(initiator, target, snrdB);
	Start of Anticollision loop
		Cascade Level-1
			Initiator transmitted ANTICOLLISION command
			Target received Cascade Level-1 SEL code

Figure Load Modulation contains an axes and other objects of type uiflowcontainer, uimenu, uitoolbar. The axes with title Target Signal Spectrum contains an object of type line. This object represents Channel 1.

				Target transmitted full UID
			Initiator received CL1 UID without collision
				Complete UID received: 0x11aa22bb
				Initiator transmitted SELECT command
			Target received Cascade Level-1 SEL code
				Target selection confirmed
				Target transmitted SAK with UID complete flag
			Initiator received SAK
				UID complete. Exit Anticollision loop.
	End of Anticollision loop

	Target compliant with NFCIP-1. Continue with Transport Protocol Activation
nfcProtocolActivation(initiator, target, snrdB);
	Start of Transport Protocol Activation
		Initiator transmitted ATR_REQ
		Target received ATR_REQ
			Target transmitted ATR_RES in response to ATR_REQ
		Initiator received ATR_RES
			Initiator transmitted PSL_REQ in response to ATR_REQ
			Selected send rate: 106 Kbps
			Selected receive rate: 106 Kbps
		Target received PSL_REQ
			Target transmitted PSL_RES in response to PSL_REQ
		Initiator received PSL_RES
			PSL_RES validated. All selected rates confirmed
	End of Transport Protocol Activation
nfcDataExchangeProtocol(initiator, target, snrdB);
	Start of Data Exchange Protocol (DEP)
		Initiator transmitted an Information PDU in DEP_REQ
			Initiator PNI: 0
		Target received an Information PDU in DEP_REQ
			MI chaining not activated in received information PDU
			Received Initiator PNI: 0
			Target PNI: 0
			Target transmitted an Information PDU in DEP_RES in response to DEP_REQ
		Initiator received an Information PDU in DEP_RES
			Received Target PNI: 0
		All data transmitted from Initiator to Target. Exit DEP.
	End of Data Exchange Protocol (DEP)
nfcProtocolDeactivation(initiator, target, snrdB)
	Start of Transport Protocol Deactivation
		Initiator transmitted RLS_REQ
		Target received RLS_REQ
			Target transmitted RLS_RES in response to RLS_REQ
		Initiator received RLS_RES
			Target released
	End of Transport Protocol Deactivation
nfcPrint.End();
End of NFC Communication between Initiator and Target
nfcPrint.Message('The message received by Target from Initiator:');
The message received by Target from Initiator:
nfcPrint.Message(target.ReceivedUserData);
Hello, from MathWorks.
nfcPrint.NewLine;

% Restore RNG state 
rng(s);
function nfcInitialization(initiator, target, snrdB)
    % Initialization and anticollision
    % Reference: ISO/IEC 14443-3, section 6

    txREQA = transmitREQA(initiator);
    rxREQA = awgn(txREQA, snrdB, 'measured');

    txATQA = receiveREQA(target, rxREQA);
    rxATQA = awgn(txATQA, snrdB, 'measured');

    [isATQAValid, isCollisionDetected, isTargetCompliant] = ...
        receiveATQA(initiator, rxATQA);

    coder.internal.errorIf(~isATQAValid, 'comm:NFC:InvalidATQA');
    coder.internal.errorIf(isCollisionDetected, 'comm:NFC:CollisionATQA');
    coder.internal.errorIf(~isTargetCompliant, 'comm:NFC:TargetNotCompliant');    
end

function nfcAnticollisionLoop(initiator, target, snrdB)
    % Anticollision Loop
    % Reference: ISO/IEC 14443-3, section 6
    
    nfcPrint.NewLine;
    nfcPrint.Heading1('Start of Anticollision loop');
    
    % Start anticollision loop
    cascadeLevel = 1;
    targetRxAC = [];
    nfcPrint.CascadeLevel(cascadeLevel);
    [initiatorTxAC, newCascadeLevel, uidComplete, isoCompliantTarget] = ...
        antiCollisionLoop(initiator, targetRxAC, cascadeLevel);
    
    while (newCascadeLevel <= 3) && ~uidComplete
        
        nfcPrint.CascadeLevel(newCascadeLevel, cascadeLevel);
        cascadeLevel = newCascadeLevel;
        
        targetRxAC = awgn(initiatorTxAC, snrdB, 'measured');
        % Target's anticollision loop
        targetTxAC = antiCollisionLoop(target, targetRxAC);
        initiatorRxAC = awgn(targetTxAC, snrdB, 'measured');
        % Initiator's anticollision loop
        [initiatorTxAC, newCascadeLevel, uidComplete, isoCompliantTarget] = ...
            antiCollisionLoop(initiator, initiatorRxAC, cascadeLevel);
    end
    
    coder.internal.errorIf(~uidComplete, 'comm:NFC:IncompleteUID');
    coder.internal.errorIf(~isoCompliantTarget, ...
        'comm:NFC:TargetNotCompliantWithNFCIP1');
    
    nfcPrint.Heading1('End of Anticollision loop');
    nfcPrint.NewLine;    
    nfcPrint.Heading1(['Target compliant with NFCIP-1. '...
        'Continue with Transport Protocol Activation']);    
end

function nfcProtocolActivation(initiator, target, snrdB)
    % NFCIP-1 Transport Protocol Activation
    % Reference: ISO/IEC 18092, section 12.5
    
    nfcPrint.NewLine;
    nfcPrint.Heading1('Start of Transport Protocol Activation');
    
    txATR_REQ = transmitATR_REQ(initiator);
    rxATR_REQ = awgn(txATR_REQ, snrdB, 'measured');
    
    txATR_RES = receiveATR_REQ(target, rxATR_REQ);
    rxATR_RES = awgn(txATR_RES, snrdB, 'measured');
    
    txPSL_REQ = receiveATR_RES(initiator, rxATR_RES);
    rxPSL_REQ = awgn(txPSL_REQ, snrdB, 'measured');
    txPSL_RES = receivePSL_REQ(target, rxPSL_REQ);
    
    status = receivePSL_RES(initiator, txPSL_RES);
    coder.internal.errorIf(~status, 'comm:NFC:TPActivationFailed');
    
    nfcPrint.Heading1('End of Transport Protocol Activation');    
end

function nfcDataExchangeProtocol(initiator, target, snrdB)
    % Data Exchange Protocol
    % Reference: ISO/IEC 18092, section 12.6
    
    nfcPrint.NewLine;
    nfcPrint.Heading1('Start of Data Exchange Protocol (DEP)');
    
    status = nfcDEP(initiator, target, snrdB);
    coder.internal.errorIf(~status, 'nfc:NFC:DEPFailed');
    
    nfcPrint.Heading1('End of Data Exchange Protocol (DEP)');
    nfcPrint.NewLine;    
end

function nfcProtocolDeactivation(initiator, target, snrdB)
    % Transport Protocol Deactivation
    % Reference: ISO/IEC 18092, section 12.7

    nfcPrint.NewLine;
    nfcPrint.Heading1('Start of Transport Protocol Deactivation');

    txRLS_REQ = transmitRLS_REQ(initiator);
    rxRLS_REQ = awgn(txRLS_REQ, snrdB, 'measured');
    
    txRLS_RES = receiveRLS_REQ(target, rxRLS_REQ);
    rxRLS_RES = awgn(txRLS_RES, snrdB, 'measured');
    
    status = receiveRLS_RES(initiator, rxRLS_RES);
    coder.internal.errorIf(~status, 'comm:NFC:TPDeactivationFailed');
    
    nfcPrint.Heading1('End of Transport Protocol Deactivation');
end

Исследование

Изучите различные методы объектов nfcInitiator и nfcTarget, чтобы понять различные команды и протоколы, описанные в стандартах NFC. Поэкспериментируйте с различными параметрами системы, такими как SNR, тип UID (одиночный или двойной), значение UID, значение SharingPerSymbol, чтобы увидеть, как они влияют на систему.

Ссылки

  1. http://nfc-forum.org/

  2. ISO/IEC 14443-2 Идентификационные карты - Бесконтактные интегральные платы - Бесконтактные платы - Часть 2: Радиочастотный интерфейс питания и сигнала

  3. ISO/IEC 14443-3 Идентификационные карты - Бесконтактные интегральные платы - Бесконтактные платы - Часть 3: Инициализация и антиколлизия

  4. ISO/IEC 18092 Информационные технологии - Телекоммуникации и обмен информацией между системами - Ближняя связь - Интерфейс и протокол (NFCIP-1)