释放 NFC 的力量,探索它为您的数字生活带来的无限创新和便利,从即时共享到安全交易。
A
A
硬件概览
它是如何工作的?
NFC 2 Click 基于 NXP Semiconductor 的 PN7150,这是一款高性能全 NFC 解决方案,具有集成固件和 I2C 接口,专为 13.56 MHz 的非接触通信设计。该板完全符合 NFC Forum 规范,这意味着您将能够充分利用 NFC 的潜力。它是快速集成 NFC 技术的理想解决方案,特别适用于运行 Linux 和 Android 等操作系统环境的应用。嵌入的 NFC 固件提供所有 NFC 协议作为预集成功能,加上超低功耗,减少了尺寸和成本。PN7150 嵌入了一个 ARM Cortex-M0 微控制器核心,加载了集成固件。它提供了简便的集成和验证周期,因为所有 NFC 实时约束、协议和设备发现都在内部处理。主机可以配置 PN7150 以通知卡片或对等
设备检测并开始与其通信。PN7150 的核心微控制器芯片可以在没有任何外部时钟的情况下运行(基于内部振荡器)。然而,13.56MHz RF 场载波精度要求与使用内部振荡器不兼容。PN7150 有一个外部晶体振荡器连接到其 XTAL 引脚。PN7150 具有四种电源状态:监控、硬电源关闭 (HPD)、待机和活动。PN7150 将在应用级别连续在不同的电源状态之间切换,以优化电流消耗。PN7150 设计允许主控制器完全控制其操作,从而控制 PN7150 的功耗并可能限制 PN7150 功能的部分。有关这些模式的更多信息,用户可以在附带的数据表中找到。NFC 2 Click 使用标准 I2C 双线接口与 MCU 通信,标准模式下时钟频率
最高为 100kHz,快速模式下最高为 400kHz,高速模式下最高为 3.4MHz。PN7150 还允许通过将标记为 ADDR SEL 的 SMD 跳线定位到标记为 0 和 1 的适当位置来选择其 I2C 从地址的最低有效位 (LSB)。为了在 PN7150 和主控制器之间启用并确保数据流控制,提供了一个专用中断线,标记为 INT,以便可以编程活动状态。它还包含复位功能和用于通过 RF 与标签(卡片)、读写器或对等设备通信的 RF 天线。该 Click 板™ 只能在 3.3V 逻辑电压水平下工作。在使用不同逻辑电平的 MCU 之前,必须执行适当的逻辑电压电平转换。此外,它配备了包含函数和示例代码的库,可用作进一步开发的参考。
功能概述
开发板
Arduino UNO 是围绕 ATmega328P 芯片构建的多功能微控制器板。它为各种项目提供了广泛的连接选项,具有 14 个数字输入/输出引脚,其中六个支持 PWM 输出,以及六个模拟输入。其核心组件包括一个 16MHz 的陶瓷谐振器、一个 USB 连接器、一个电
源插孔、一个 ICSP 头和一个复位按钮,提供了为板 子供电和编程所需的一切。UNO 可以通过 USB 连接到计算机,也可以通过 AC-to-DC 适配器或电池供电。作为第一个 USB Arduino 板,它成为 Arduino 平台的基准,"Uno" 符号化其作为系列首款产品的地
位。这个名称选择,意为意大利语中的 "一",是为了 纪念 Arduino Software(IDE)1.0 的推出。最初与 Arduino Software(IDE)版本1.0 同时推出,Uno 自此成为后续 Arduino 发布的基础模型,体现了该平台的演进。
微控制器概述
MCU卡片 / MCU

建筑
AVR
MCU 内存 (KB)
32
硅供应商
Microchip
引脚数
28
RAM (字节)
2048
你完善了我!
配件
Click Shield for Arduino UNO 具有两个专有的 mikroBUS™ 插座,使所有 Click board™ 设备能够轻松与 Arduino UNO 板进行接口连接。Arduino UNO 是一款基于 ATmega328P 的微控制器开发板,为用户提供了一种经济实惠且灵活的方式来测试新概念并构建基于 ATmega328P 微控制器的原型系统,结合了性能、功耗和功能的多种配置选择。Arduino UNO 具有 14 个数字输入/输出引脚(其中 6 个可用作 PWM 输出)、6 个模拟输入、16 MHz 陶瓷谐振器(CSTCE16M0V53-R0)、USB 接口、电源插座、ICSP 头和复位按钮。大多数 ATmega328P 微控制器的引脚都连接到开发板左右两侧的 IO 引脚,然后再连接到两个 mikroBUS™ 插座。这款 Click Shield 还配备了多个开关,可执行各种功能,例如选择 mikroBUS™ 插座上模拟信号的逻辑电平,以及选择 mikroBUS™ 插座本身的逻辑电压电平。此外,用户还可以通过现有的双向电平转换电压转换器使用任何 Click board™,无论 Click board™ 运行在 3.3V 还是 5V 逻辑电压电平。一旦将 Arduino UNO 板与 Click Shield for Arduino UNO 连接,用户即可访问数百种 Click board™,并兼容 3.3V 或 5V 逻辑电压电平的设备。
使用的MCU引脚
mikroBUS™映射器
“仔细看看!”
Click board™ 原理图

一步一步来
项目组装
软件支持
库描述
该库包含 NFC 2 Click 驱动程序的 API。
关键功能:
nfc2_hw_reset- 硬件复位功能nfc2_core_set_protocol_config- 设置协议配置功能nfc2_cmd_card_disconnected- 卡片断开连接命令功能
开源
代码示例
完整的应用程序代码和一个现成的项目可以通过NECTO Studio包管理器直接安装到NECTO Studio。 应用程序代码也可以在MIKROE的GitHub账户中找到。
/*!
* @file main.c
* @brief NFC2 Click example
*
* # Description
* This is an example which demonstrates the usage of NFC 2 Click board.
*
* The demo application is composed of two sections :
*
* ## Application Init
* Initialization driver enables - I2C,
* hw reset, reseteting and initialize core, disabling standby mode,
* starting test procedure, set configuration and start discovery, also write log.
*
* ## Application Task
* NFC 2 Click board can be used for detection of RFiD tag
* and displays it's value via USART terminal.
* All data logs write on USB uart changes for every 1 sec.
*
* Additional Functions :
* -void display_packet ( control_packet_t *ctrl_pck ) - Display packet log data.
* -void display_nfc_data ( control_packet_t *ctrl_pck ) - Display packet log data.
* -void nfc2_read_nfc_data ( nfc2_t *ctx, control_packet_t *ctrl_pck ) - Read nfc data function.
* -void nfc2_test_antenna ( nfc2_t *ctx, control_packet_t *ctrl_pck ) - Testing Antenna function.
*
* @author Stefan Ilic
*
*/
#include "board.h"
#include "log.h"
#include "nfc2.h"
static nfc2_t nfc2;
static log_t logger;
uint8_t n_cnt;
control_packet_t ctrl_pck_data;
/**
* @brief NFC 2 display packet function.
* @details This function displays data values.
*/
void display_packet ( control_packet_t *ctrl_pck );
/**
* @brief NFC 2 display nfc data function.
* @details This function displays nfc data values.
*/
void display_nfc_data ( control_packet_t *ctrl_pck );
/**
* @brief NFC 2 read nfc data function.
* @details This function reads nfc data and displays data.
*/
void nfc2_read_nfc_data ( nfc2_t *ctx, control_packet_t *ctrl_pck );
/**
* @brief NFC 2 test antena function.
* @details This function tests antenna and displays data.
*/
void nfc2_test_antenna ( nfc2_t *ctx, control_packet_t *ctrl_pck );
void application_init ( void ) {
log_cfg_t log_cfg; /**< Logger config object. */
nfc2_cfg_t nfc2_cfg; /**< Click config object. */
/**
* Logger initialization.
* Default baud rate: 115200
* Default log level: LOG_LEVEL_DEBUG
* @note If USB_UART_RX and USB_UART_TX
* are defined as HAL_PIN_NC, you will
* need to define them manually for log to work.
* See @b LOG_MAP_USB_UART macro definition for detailed explanation.
*/
LOG_MAP_USB_UART( log_cfg );
log_init( &logger, &log_cfg );
log_info( &logger, " Application Init " );
// Click initialization.
nfc2_cfg_setup( &nfc2_cfg );
NFC2_MAP_MIKROBUS( nfc2_cfg, MIKROBUS_1 );
err_t init_flag = nfc2_init( &nfc2, &nfc2_cfg );
if ( I2C_MASTER_ERROR == init_flag ) {
log_error( &logger, " Application Init Error. " );
log_info( &logger, " Please, run program again... " );
for ( ; ; );
}
log_printf( &logger, " HW Reset \r\n" );
nfc2_hw_reset( &nfc2 );
Delay_ms ( 100 );
log_printf( &logger, "-----------------------\r\n" );
log_printf( &logger, " Reset and Init. Core \r\n" );
nfc2_cmd_core_reset( &nfc2 );
Delay_ms ( 100 );
nfc2_read_ctrl_packet_data( &nfc2, &ctrl_pck_data );
Delay_ms ( 100 );
nfc2_cmd_core_init( &nfc2 );
Delay_ms ( 100 );
nfc2_read_ctrl_packet_data( &nfc2, &ctrl_pck_data );
Delay_ms ( 100 );
display_packet( &ctrl_pck_data );
while ( nfc2_check_irq( &nfc2 ) == NFC2_IRQ_STATE_HIGH );
log_printf( &logger, "-----------------------\r\n" );
log_printf( &logger, " Disabling Standby Mode \r\n" );
nfc2_cmd_disable_standby_mode( &nfc2 );
Delay_ms ( 100 );
nfc2_read_ctrl_packet_data( &nfc2, &ctrl_pck_data );
Delay_ms ( 100 );
display_packet( &ctrl_pck_data );
nfc2_test_antenna( &nfc2, &ctrl_pck_data );
log_printf( &logger, "-----------------------\r\n" );
log_printf( &logger, "Starting Test Procedure\r\n" );
nfc2_cmd_test_procedure( &nfc2 );
Delay_ms ( 100 );
nfc2_read_ctrl_packet_data( &nfc2, &ctrl_pck_data );
Delay_ms ( 100 );
display_packet( &ctrl_pck_data );
nfc2_hw_reset( &nfc2 );
Delay_ms ( 100 );
log_printf( &logger, "-----------------------\r\n" );
log_printf( &logger, " NFC Config. \r\n" );
nfc2_default_cfg ( &nfc2, &ctrl_pck_data );
log_printf( &logger, "-----------------------\r\n" );
log_printf( &logger, " Discovery Start \r\n" );
nfc2_cmd_start_discovery( &nfc2 );
Delay_ms ( 100 );
nfc2_read_ctrl_packet_data( &nfc2, &ctrl_pck_data );
Delay_ms ( 100 );
display_packet( &ctrl_pck_data );
log_printf( &logger, "-----------------------\r\n" );
log_printf( &logger, "-------- START --------\r\n" );
log_printf( &logger, "-----------------------\r\n" );
Delay_ms ( 500 );
log_info( &logger, " Application Task " );
}
void application_task ( void ) {
while ( nfc2_check_irq( &nfc2 ) == NFC2_IRQ_STATE_HIGH ) {
nfc2_read_nfc_data ( &nfc2, &ctrl_pck_data );
}
while ( nfc2_check_irq( &nfc2 ) == NFC2_IRQ_STATE_LOW );
log_printf( &logger, "-----------------------\r\n" );
Delay_ms ( 1000 );
}
int main ( void )
{
/* Do not remove this line or clock might not be set correctly. */
#ifdef PREINIT_SUPPORTED
preinit();
#endif
application_init( );
for ( ; ; )
{
application_task( );
}
return 0;
}
void display_packet ( control_packet_t *ctrl_pck ) {
log_printf( &logger, "- - - - - - - - - - - -\r\n" );
log_printf( &logger, " Message Type = %d\r\n", ( uint16_t ) ctrl_pck->message_type );
log_printf( &logger, " Pck Bound Flag = %d\r\n", ( uint16_t ) ctrl_pck->pck_bound_flag );
log_printf( &logger, " Group Ident = %d\r\n", ( uint16_t ) ctrl_pck->group_ident );
log_printf( &logger, " Opcode Ident = %d\r\n", ( uint16_t ) ctrl_pck->opcode_ident );
log_printf( &logger, " Payload Length = %d\r\n", ( uint16_t ) ctrl_pck->payload_length );
log_printf( &logger, "- - - - - - - - - - - -\r\n" );
for ( n_cnt = 0; n_cnt < ctrl_pck_data.payload_length; n_cnt++ ) {
log_printf( &logger, " Payload[ %.2d ] = 0x%.2X\r\n", ( uint16_t ) n_cnt, ( uint16_t ) ( uint16_t ) ctrl_pck_data.payload[ n_cnt ] );
}
log_printf( &logger, "- - - - - - - - - - - -\r\n" );
memset( ctrl_pck_data.payload, 0x00, 255 );
}
void display_nfc_data ( control_packet_t *ctrl_pck ) {
log_printf( &logger, "- - - - - - - - - - - -\r\n");
log_printf( &logger, " Read Block:\r\n");
for ( n_cnt = 1; n_cnt < ctrl_pck->payload_length - 2; n_cnt++ ) {
log_printf( &logger, "\t 0x%.2X \r\n", ( uint16_t ) ctrl_pck->payload[ n_cnt ] );
}
log_printf( &logger, "\t 0x%.2X \r\n", ( uint16_t ) ctrl_pck->payload[ ctrl_pck->payload_length - 2 ] );
log_printf( &logger, "- - - - - - - - - - - -\r\n" );
memset( ctrl_pck->payload, 0x00, 255 );
}
void nfc2_read_nfc_data ( nfc2_t *ctx, control_packet_t *ctrl_pck ){
nfc2_read_ctrl_packet_data( ctx, ctrl_pck );
Delay_ms ( 100 );
nfc2_activate_rmt_mifare_card( ctx );
Delay_ms ( 100 );
nfc2_read_ctrl_packet_data( ctx, ctrl_pck );
Delay_ms ( 10 );
while ( nfc2_check_irq( ctx ) == NFC2_IRQ_STATE_LOW );
nfc2_read_ctrl_packet_data( ctx, ctrl_pck );
nfc2_cmd_authenticate_sector( ctx, 0x30 );
Delay_ms ( 100 );
nfc2_read_ctrl_packet_data( ctx, ctrl_pck );
Delay_ms ( 10 );
while ( nfc2_check_irq( ctx ) == NFC2_IRQ_STATE_LOW );
nfc2_read_ctrl_packet_data( ctx, ctrl_pck );
display_nfc_data( ctrl_pck );
log_printf( &logger, " Disconnect Card \r\n" );
nfc2_cmd_card_disconnected( ctx );
Delay_ms ( 10 );
nfc2_read_ctrl_packet_data( ctx, ctrl_pck );
Delay_ms ( 10 );
while ( nfc2_check_irq( ctx ) == NFC2_IRQ_STATE_LOW );
nfc2_read_ctrl_packet_data( ctx, ctrl_pck );
Delay_ms ( 100 );
}
void nfc2_test_antenna ( nfc2_t *ctx, control_packet_t *ctrl_pck ) {
log_printf( &logger, "-----------------------\r\n" );
log_printf( &logger, " Testing Antenna " );
nfc2_cmd_antenna_test( ctx, 0x01 );
Delay_ms ( 100 );
nfc2_read_ctrl_packet_data( ctx, ctrl_pck );
Delay_ms ( 100 );
nfc2_cmd_antenna_test( ctx, 0x07 );
Delay_ms ( 100 );
nfc2_read_ctrl_packet_data( ctx, ctrl_pck );
Delay_ms ( 100 );
nfc2_cmd_antenna_test( ctx, 0x0F );
Delay_ms ( 100 );
nfc2_read_ctrl_packet_data( ctx, ctrl_pck );
Delay_ms ( 100 );
display_packet( ctrl_pck );
}
// ------------------------------------------------------------------------ END
额外支持
资源
类别:RFID / NFC


































