1. 项目概述从零构建一个13.56MHz RFID读卡器最近在做一个智能储物柜的项目需要用到非接触式IC卡作为用户身份识别介质。市面上现成的读卡模块虽然方便但要么尺寸不合适要么接口不灵活要么成本偏高。于是决定自己动手基于复旦微电子的FM1702SL芯片从硬件设计到软件驱动完整地开发一个13.56MHz的RFID读卡器模块。这个频段遵循ISO14443 Type A标准也是Philips现NXPMIFARE技术的主流领域应用极其广泛从门禁、考勤到公交卡、校园一卡通背后都是这套技术。自己开发读卡器的好处是显而易见的你可以完全掌控通信协议、天线参数、功耗和外形尺寸能将其无缝嵌入到你的最终产品中而不是作为一个外挂的“黑盒子”。整个过程涉及射频模拟电路设计、单片机固件编程以及上位机协议制定算是一个典型的嵌入式系统综合项目。如果你正在考虑为你的物联网设备、智能硬件或工控系统添加非接触式读卡功能或者单纯想深入理解RFID技术的工作原理那么跟着我走一遍这个开发过程应该会大有裨益。本文不会停留在芯片手册的翻译层面而是结合我实际调试中踩过的坑和总结的经验把原理、设计、实现和调试的完整链条讲清楚。2. 核心芯片选型与系统架构解析2.1 为什么选择FM1702SL在13.56MHz RFID读卡器芯片领域NXP的RC系列如RC522, RC523知名度很高资料也丰富。但我最终选择了国产的FM1702SL主要基于以下几点考量完全兼容性与低成本FM1702SL完全兼容ISO14443 Type A协议和MIFARE Classic加密算法。这意味着它能读写市面上绝大多数MIFARE S50/S70即M1卡以及基于此标准的国产兼容卡。在功能对等的前提下其成本通常更具优势对于需要控制BOM成本的产品项目来说是个务实的选择。高集成度与易用性这颗芯片内部集成了模拟调制解调电路、编码解码器、CRC协处理器和加密单元。外部只需要搭配最少量的无源器件电阻、电容、晶振和天线线圈就能构成一个完整的读卡器前端。这大大降低了射频部分的设计门槛和PCB面积。灵活的接口与电源它支持SPI和UART两种数字通信接口。SPI适合与高性能MCU高速通信而UART模式则非常巧妙芯片内部集成了协议处理器可以直接通过串口发送简单的ASCII命令来操作卡片此时MCU只需要一个UART端口甚至可以用带有UART的廉价8位单片机作为主控极大简化了系统设计。芯片支持宽电压工作2.7V-5.5V数字IO口兼容TTL/CMOS电平与各种MCU对接都很方便。注意FM1702SL有NL和SL等后缀版本以及更新的FM175xx系列。它们核心功能兼容但在部分寄存器地址、初始化序列或性能上有细微差异。务必以你手中芯片型号对应的最新版数据手册为准网上流传的代码和笔记可能基于旧版本直接套用可能导致无法通信。2.2 系统整体设计方案一个完整的RFID读卡模块远不止一颗射频芯片那么简单。它是一个典型的微控制器应用系统。我设计的系统框图如下所示清晰地展示了各部分的职责与数据流向------------------- | 上位机 (PC/主机) | | (发送命令接收数据) | ------------------ | UART/RS232/USB ---------v--------- | MCU | | (STC12C4052等) | | 协议解析、流程控制 | ------------------ | SPI/UART ---------v--------- | 射频前端芯片 | | (FM1702SL) | | 射频信号产生与解调 | ------------------ | 经由匹配电路 v ------------------- | 天线线圈 | | (发射13.56MHz磁场)| ------------------- -- 无线耦合 -- ------------------- | MIFARE 卡片 | | (无源从磁场取电) | -------------------各模块分工详解主控MCU我选用的是STC12C4052一款增强型的8051内核单片机。选择它主要是因为其内置了SPI和UART硬件接口运行稳定且支持ISP在线编程调试非常方便。它的角色是“大脑”负责与上位机通信解析指令然后通过SPI接口精确控制FM1702SL芯片执行寻卡、认证、读写等操作并处理返回的数据。射频芯片FM1702SL这是系统的“心脏”和“翻译官”。它负责产生13.56MHz的载波信号并通过天线发射出去为卡片提供能量。同时它接收卡片反射回来的、携带数据的调制信号进行解调和解码将复杂的射频模拟信号转化为MCU能理解的数字信号。通信接口系统预留了RS232电平转换电路如MAX3232可以直接连接电脑串口进行调试和命令发送。同时也将MCU的UART引脚引出方便嵌入其他系统时进行TTL电平通信。ISP接口用于给MCU下载程序。天线及其匹配电路这是整个系统的“嘴巴”和“耳朵”也是调试的重点和难点。天线线圈将FM1702SL输出的高频电流转换为电磁场反之亦然。匹配网络则确保芯片输出的能量能最大效率地传递给天线同时保证接收灵敏度。3. 天线设计理论与调试实践天线性能直接决定了读卡距离、稳定性和抗干扰能力。很多读卡器性能不佳问题八成出在天线上。3.1 天线基本参数与计算FM1702SL的工作频率是13.56MHz其波长λ约为22.1米。根据小环天线的定义L/λ ≤ 1/(2π)天线最大尺寸L应在3.5米以内这显然非常宽松。实际应用中我们使用尺寸在几厘米到十几厘米的矩形或圆形线圈。对于读卡器天线我们更关注两个关键参数电感值L和品质因数Q。电感值L由线圈的匝数、形状、尺寸和线径决定。通常需要根据芯片推荐值来设计FM1702SL的典型应用电路推荐天线电感值在1-3μH之间。可以使用工具软件或公式进行初步计算。品质因数Q这是衡量天线谐振电路“尖锐”程度的参数。Q值越高谐振时线圈中的电流越大产生的磁场越强有利于增加读卡距离。其计算公式为Q (2πf0 * L) / R其中f0是谐振频率13.56MHzL是天线电感R是天线的等效串联电阻包括线圈铜损和辐射电阻。然而Q值并非越高越好。过高的Q值会导致带宽B变窄B f0 / Q。ISO14443标准要求读写器发射的副载波调制边带必须完整这就需要足够的带宽。通常将天线的Q值设计在10到30之间是一个合理的范围最高不宜超过60。3.2 匹配网络设计与调试FM1702SL的输出引脚TX1 TX2是推挽输出需要外接一个由电感和电容组成的LC谐振网络使其谐振在13.56MHz。这个网络有两个核心作用阻抗匹配和滤波。一个典型的匹配电路如下图所示概念图FM1702SL TX1/TX2 ------[L_ant]------ 到天线线圈 | | [C1] [C2] | | GND GND其中C1和C2是谐振电容L_ant是天线的等效电感。C1和C2的容值需要根据你制作的天线线圈的实际电感值来计算使谐振频率f0 1 / (2π√(L_ant * C_parallel))等于13.56MHz。这里C_parallel是C1和C2的串联或并联等效值具体电路接法而定。调试是天线设计中最“手艺活”的部分工具准备必备一台示波器和一个频谱分析仪如果条件有限示波器的FFT功能也能顶一下。还需要一些可调电容或不同容值的贴片电容套件。初始上电先按照计算值焊接好电容。不放置卡片给读卡器上电用示波器探头最好用高频探头或普通探头×10档位测量天线两端的信号。观察波形你应该看到一个频率为13.56MHz的正弦波。一个调谐良好的天线其正弦波形应该是干净、光滑的毛刺和畸变很少。如果波形失真严重说明高次谐波成分多能量没有集中在基频上。调谐电容这是关键步骤。用示波器观察正弦波的峰峰值电压Vpp。微调匹配电容C1和C2的值每次变动一个观察效果。我们的目标是在13.56MHz频率上使天线两端的Vpp达到最大。这表示电路达到了最佳谐振状态能量传输效率最高。检查频谱如果有频谱仪可以观察13.56MHz信号的频谱纯度。理想的信号应该是主峰高而尖锐旁边的谐波如27.12MHz 40.68MHz幅度尽可能低。实际读卡测试用一张标准的MIFARE卡进行距离测试。在调整电容的过程中你会发现读卡距离会发生变化。最终你需要在天线波形Vpp最大和实际读卡距离最远、最稳定之间找到一个最佳平衡点。有时为了系统稳定性带宽需要适当牺牲一点Q值距离。实操心得天线线圈最好自己用利兹线绕制或者购买成品天线。PCB上的印刷线圈虽然一致性好但Q值通常较低读卡距离受限。调试时电容的容值变化要小步慢走比如从1pF、2.2pF这样调整。记录下每次调整的容值和对应的Vpp及读卡距离能帮你快速找到规律。4. 硬件电路设计要点读卡器的硬件电路相对简洁但几个细节处理不好会影响整个系统的稳定性。4.1 电源与去耦射频电路对电源噪声非常敏感。FM1702SL通常需要3.3V供电。必须确保电源干净、稳定。模拟与数字电源分离虽然FM1702SL是单电源芯片但在PCB布局时应尽可能将其模拟部分内部振荡器、射频前端和数字部分SPI接口、逻辑控制的电源走线分开最后在芯片电源引脚附近单点连接。充分的去耦在芯片的每个电源引脚VDD AVDD等到地之间必须就近放置一个0.1μF的陶瓷电容。此外在整板的电源入口处应并联一个10μF的钽电容或电解电容和一个0.1μF的陶瓷电容以滤除低频和高频噪声。地平面保持一个完整、连续的地平面至关重要。它为高频信号提供最短的回流路径减少电磁干扰EMI并提高信号完整性。4.2 时钟电路FM1702SL需要外部27.12MHz的晶体振荡器。这个频率是13.56MHz的两倍芯片内部会进行分频。晶体选择选择频率精度高、稳定性好的石英晶体负载电容CL需要根据数据手册推荐值来匹配。通常会在晶体两端各接一个对地电容如22pF这两个电容与晶体自身的负载电容共同构成振荡电路的负载。布局晶体、匹配电容必须尽可能靠近芯片的OSCIN和OSCOUT引脚走线要短而粗并用地线包围避免干扰其他电路。4.3 接口电路SPI接口如果使用SPI模式将FM1702SL的NSS片选、SCK时钟、MOSI主出从入、MISO主入从出分别连接到MCU的SPI引脚。注意上拉电阻根据MCU的IO类型决定是否需要。UART接口如果使用UART模式FM1702SL的TX和RX引脚直接连接到MCU的UART。注意电平匹配通常是TTL 3.3V。复位电路FM1702SL的RSTPD引脚是复位和掉电控制。通常通过一个10kΩ电阻上拉到VDD并通过一个0.1μF电容接地实现上电复位。也可以由MCU的一个IO口控制实现软件复位。5. 软件驱动开发从初始化到卡片操作软件是驱动硬件的灵魂。FM1702SL的驱动开发本质上是按照ISO14443-3 Type A的流程通过读写芯片内部寄存器来控制其完成与卡片的交互。5.1 SPI接口初始化与芯片确认这是很多开发者容易忽略而导致芯片无法通信的第一步。FM1702SL的SPI接口在上电后需要一个特定的“确认”序列才能进入正常工作状态。这个过程在数据手册中可能没有明确强调但至关重要。/** * brief 初始化FM1702SL的SPI接口 * note 这是一个必须执行的确认序列否则后续所有SPI通信都可能失败。 */ void FM1702_SPI_Init(void) { uint8_t reg_val 0; // 1. 硬件复位拉低RSTPD引脚至少1ms然后拉高 FM1702_RST_LOW(); Delay_ms(10); FM1702_RST_HIGH(); Delay_ms(10); // 等待芯片稳定 // 2. 关键确认序列开始 // 读取命令寄存器(CommandReg)等待其变为0空闲状态 do { reg_val FM1702_ReadReg(CommandReg); } while (reg_val ! 0); // 3. 向页寄存器(PageReg)写入0x80 FM1702_WriteReg(PageReg, 0x80); // 4. 再次读取命令寄存器确认其为0 do { reg_val FM1702_ReadReg(CommandReg); } while (reg_val ! 0); // 5. 向页寄存器(PageReg)写入0x00 FM1702_WriteReg(PageReg, 0x00); // 至此SPI接口确认完成可以进行后续的芯片初始化配置 }完成SPI确认后还需要对FM1702SL的工作模式、射频参数、定时器、中断等进行一系列寄存器配置这部分请严格参照芯片数据手册中的“初始化流程”章节进行。5.2 卡片操作完整流程解析对MIFARE卡的一次完整操作是一个状态机必须按顺序执行。下图清晰地展示了这个流程开始 | v [寻卡 (Request)] | (成功) v [防冲突 (Anticollision)] | (获得唯一UID) v [选卡 (Select Tag)] | (成功) v [认证 (Authentication)] | (密码正确) v [读写/增值/减值...] | (操作完成) v 结束下面我们拆解每个步骤的代码实现要点。5.2.1 寻卡 (PICC_REQALL)这是与卡片建立联系的第一步。读卡器向空间发射请求命令唤醒进入其天线场的卡片。#define PICC_REQALL 0x52 // 寻呼天线区内所有符合14443A标准的卡 /** * brief 寻卡函数 * param req_code 请求码PICC_REQALL 或 PICC_REQIDL * param pTagType 返回的卡片类型号ATQA2字节 * return 状态成功MI_OK或失败MI_ERR */ uint8_t PCD_Request(uint8_t req_code, uint8_t *pTagType) { uint8_t status; uint8_t bits; uint16_t i; // 1. 配置FM1702SL的发送和接收参数 FM1702_WriteReg(BitFramingReg, 0x07); // 发送7个比特位对应0x52命令 FM1702_WriteReg(TxControlReg, 0x5B); // 开启TX1,TX2引脚输出载波 // 2. 将命令放入FIFO FM1702_WriteReg(FIFODataReg, req_code); // 3. 执行收发命令 FM1702_WriteReg(CommandReg, PCD_TRANSCEIVE); // 4. 设置寄存器位启动发送 FM1702_SetBitMask(BitFramingReg, 0x80); // 5. 等待命令执行完成可以通过查询中断标志或等待固定时间 i 2000; // 超时计数 while (i--) { status FM1702_ReadReg(ComIrqReg); if (status 0x30) { // TxIRq 或 RxIRq 置位 break; } Delay_us(50); } FM1702_ClearBitMask(BitFramingReg, 0x80); // 清除启动位 if (i 0) { return MI_ERR_TIMEOUT; // 超时 } // 6. 检查错误 status FM1702_ReadReg(ErrorReg); if (status 0x13) { // BufferOvfl, ParityErr, ProtocolErr return MI_ERR; } // 7. 读取返回数据长度和数据 bits FM1702_ReadReg(FIFOLengthReg); if (bits ! 0x10) { // 请求命令成功返回2字节(16bit) ATQA return MI_ERR; } // 8. 读出ATQA (卡片类型) pTagType[0] FM1702_ReadReg(FIFODataReg); pTagType[1] FM1702_ReadReg(FIFODataReg); return MI_OK; }注意事项BitFramingReg寄存器的设置是关键。对于REQUEST命令标准规定只发送7个比特0x52的二进制是1010010共7位。如果错误地设置为发送8位卡片将无法正确响应。这也是新手常犯的错误之一。5.2.2 防冲突与选卡当天线场内有多个卡片时需要通过防冲突循环Anticollision Loop获取每张卡的唯一序列号UID然后选择其中一张进行操作。/** * brief 防冲突获取卡片的序列号UID * param pSnr 存放返回的UID4字节或7字节 * return 状态 */ uint8_t PCD_Anticoll(uint8_t *pSnr) { uint8_t status; uint8_t i, snr_check 0; uint8_t buf[8]; // 1. 配置为发送标准帧需要CRC FM1702_WriteReg(BitFramingReg, 0x00); // 2. 发送防冲突命令 SEL NVB (0x93, 0x20) buf[0] PICC_ANTICOLL; buf[1] 0x20; // NVB: Number of Valid Bits status PCD_ToCard(PCD_TRANSCEIVE, buf, 2, buf, i); if (status ! MI_OK) { return status; } // 3. 验证返回数据长度和校验 if (i ! 5) return MI_ERR; // UID(4字节) BCC(1字节) for (i 0; i 4; i) { pSnr[i] buf[i]; snr_check ^ buf[i]; } if (snr_check ! buf[4]) { // 异或校验 return MI_ERR; } return MI_OK; } // 选卡命令类似发送SEL NVB (0x93, 0x70) UID BCC5.2.3 认证与数据块操作选择卡片后在对特定扇区进行读写前必须进行三重认证。// 认证密钥A uint8_t PCD_Authenticate(uint8_t auth_mode, uint8_t block_addr, uint8_t *key, uint8_t *uid) { uint8_t buf[12]; uint8_t i, status; // 1. 构造认证命令包 buf[0] auth_mode; // 0x60 for Key A, 0x61 for Key B buf[1] block_addr; // 扇区内的块地址0~3 for (i 0; i 6; i) buf[2i] key[i]; // 6字节密钥 for (i 0; i 4; i) buf[8i] uid[i]; // 4字节卡片UID // 2. 使用PCD_ToCard函数发送认证命令 status PCD_ToCard(PCD_AUTHENT, buf, 12, buf, i); if ((status ! MI_OK) || (!(FM1702_ReadReg(Status2Reg) 0x08))) { status MI_ERR; } return status; } // 认证通过后即可进行读块、写块操作 uint8_t PCD_ReadBlock(uint8_t block_addr, uint8_t *buffer) { uint8_t buf[16]; uint8_t i, status; buf[0] PICC_READ; buf[1] block_addr; // 计算CRC16并附加在命令后 PCD_CalculateCRC(buf, 2, buf[2], buf[3]); status PCD_ToCard(PCD_TRANSCEIVE, buf, 4, buf, i); if (status MI_OK i 16) { for (i 0; i 16; i) buffer[i] buf[i]; } return status; }核心要点认证时使用的block_addr是扇区内的块号0-3而不是绝对块地址。每个扇区的尾块块3是控制块存放着密钥A、密钥B和存取控制位不能直接用读块命令读取需要先认证。6. 调试心得与常见问题排查开发过程就是不断解决问题的过程。以下是我在调试FM1702SL读卡器时遇到的一些典型问题及解决方法希望能帮你少走弯路。6.1 问题一完全读不到卡无任何反应可能原因1电源或时钟问题。排查用示波器测量芯片的电源引脚确保电压稳定无毛刺。测量27.12MHz晶振引脚看是否有正常起振的正弦波幅度约为电源电压的70%。可能原因2SPI通信失败。排查确保SPI初始化序列上文提到的确认流程已正确执行。用逻辑分析仪或示波器抓取SPI总线NSS SCK MOSI MISO的波形检查MCU是否发出了正确的读写命令FM1702SL是否有MISO数据返回。可以尝试先读写一个已知的寄存器如版本号寄存器来验证SPI通信是否正常。可能原因3天线未调谐或损坏。排查这是最常见的原因。用示波器测量天线两端在发送载波时应有大幅度的13.56MHz正弦波Vpp可能在几十伏。如果波形幅度很小、失真或根本没有检查匹配电容是否焊接正确天线线圈是否断路或短路。重新进行天线调谐。可能原因4芯片复位或配置问题。排查检查RSTPD引脚电平是否正确正常工作时应为高电平。确认所有必要的配置寄存器如TxControlReg RxControlReg ModeReg等已按照数据手册的推荐值设置。6.2 问题二读卡距离非常近1cm或不稳定可能原因1天线Q值过低或过高。排查Q值过低导致磁场强度弱距离近。Q值过高导致带宽窄卡片返回的信号边带被滤除通信不稳定。用示波器和频谱仪观察天线波形精细调整匹配电容在Vpp和波形纯净度之间找到最佳点。可能原因2外部金属干扰。排查天线附近是否有大面积金属如设备外壳、电池、其他PCB走线金属会产生涡流削弱磁场或导致频率偏移。尽量让天线远离金属或在金属与天线之间增加一定厚度的非金属隔离层。可能原因3电源驱动能力不足。排查射频发射时瞬时电流较大。检查你的LDO或电源电路是否能提供足够的峰值电流可能达到100mA以上。在电源输入端加大容量储能电容如100μF。6.3 问题三能寻到卡但防冲突或选卡失败可能原因1CRC校验未启用或错误。排查Request命令不需要CRC但从Anticollision命令开始后续的所有命令帧都需要附加CRC16校验码。确保在发送这些命令前TxModeReg和RxModeReg中已启用CRC功能并且使用芯片的CRC协处理器或软件正确计算了CRC值。可能原因2UID读取不完整或校验错误。排查防冲突返回的数据包含4字节UID和1字节BCC异或校验和。务必验证BCC是否正确。有些7字节UID的卡片如MIFARE Plus Ultralight C流程略有不同需要根据返回的ATQA卡片类型判断。可能原因3多张卡干扰。排查确保天线场内一次只有一张卡在进行操作。防冲突算法本身可以处理多卡但在调试阶段多卡环境会增加复杂性。6.4 问题四认证失败无法读写数据可能原因1密钥错误。排查MIFARE Classic卡的每个扇区有两组密钥Key A和Key B。默认出厂密钥通常是FF FF FF FF FF FF或A0 A1 A2 A3 A4 A5。如果你修改过密钥必须使用正确的密钥。使用已知密钥的卡片进行测试。可能原因2存取控制位ACL设置错误。排查每个扇区的块3定义了该扇区的访问权限。如果你之前错误地写入了ACL可能导致任何密钥都无法认证。这是一个不可逆的操作除非你知道原密钥并能通过认证修改回来这块卡该扇区可能就此锁死。强烈建议在开发阶段使用未初始化的空白卡或备份好重要数据的卡进行操作。可能原因3认证命令或参数错误。排查确认auth_mode0x60 for Key A 0x61 for Key B、block_addr扇区内块地址0-3以及卡片UID参数都正确无误地传递给了认证命令。6.5 一个实用的调试技巧利用LED和串口打印在代码的关键节点添加状态指示和日志输出能极大提升调试效率。LED指示用两个LED一个用于指示电源/系统运行常亮或慢闪另一个用于指示读卡事件寻到卡时闪烁一下认证成功时快闪等。串口打印将关键函数的返回值、读取到的寄存器值、卡片返回的原始数据通过串口打印到PC端的串口助手。这样你可以清晰地看到程序执行到哪一步失败了失败时返回的错误码是什么。例如在PCD_RequestPCD_AnticollPCD_Authenticate等函数返回后都打印一下状态和关键数据。7. 进阶应用与优化思路当基础读写功能稳定后可以考虑以下方向来提升你的读卡器项目7.1 低功耗设计对于电池供电的便携设备功耗至关重要。间歇工作模式MCU可以大部分时间处于休眠模式定时如每秒一次唤醒并驱动FM1702SL进行一次快速的寻卡操作PICC_REQIDL。如果没有卡片立即让FM1702SL进入掉电模式通过RSTPD引脚MCU再次休眠。动态功率控制根据读卡距离需求动态调整FM1702SL的发射功率通过配置TxControlReg等寄存器。近距离读卡时降低功率可以显著减少功耗。天线优化使用Q值更优的天线在同等读卡距离下可以降低驱动电流。7.2 多协议兼容与安全性增强兼容MIFARE Ultralight很多门禁卡、票务卡是MIFARE Ultralight芯片。其协议比Classic更简单。可以在驱动中增加对ATQA的判断自动选择不同的命令流程进行处理。使用非默认密钥与动态加密永远不要在产品中使用默认密钥。为每个设备或每批卡片生成唯一的密钥。更进一步可以实现一卡一密或与后台系统配合进行动态会话密钥协商大幅提升系统安全性。防重放与防克隆在读写器或后端服务器记录卡片UID和最近交易时间戳防止同一张卡在极短时间内被重复使用重放攻击。对于高安全场景考虑使用CPU卡或MIFARE DESFire等更安全的芯片它们具备真正的加密算法和防克隆能力。7.3 集成到更复杂的系统中你的FM1702SL读卡器模块可以作为一个子模块通过UART或SPI接口与主系统连接。定义应用层协议设计一个简洁高效的串口命令协议。例如AA BB 01 00 04 UID[4] CC DD其中AA BB是帧头01是命令字寻卡00 04是数据长度UID是返回的数据CC DD是CRC16校验。这样上位机如树莓派、ESP32或PC软件就可以方便地控制读卡器。增加状态反馈在硬件上增加蜂鸣器提示音和LED指示灯不同颜色代表不同状态提升用户体验。外壳与结构设计为读卡器设计一个3D打印或定制的外壳固定天线并屏蔽干扰使其成为一个可以独立销售或集成的产品。开发一个完整的RFID读卡器是一次对嵌入式开发全栈能力的很好锻炼。它涵盖了模拟电路调试、数字接口通信、底层协议实现和系统集成。当你亲手调通天线看到串口打印出第一张卡的UID时那种成就感是无可替代的。希望这篇详尽的总结能为你点亮开发路上的第一盏灯。记住耐心和细致的调试是成功的关键尤其是面对射频电路的时候。如果遇到问题不妨回头检查一下电源、时钟和天线这三个最基本的地方往往能事半功倍。