FM1722/02NL+STM32硬件SPI调试笔记

2023-11-08

1.介绍

FM17XX 系列通用非接触读卡机芯片是复旦微电子股份有限公司设计的,基于 ISO14443 标准的系
列通用非接触卡读卡机芯片,采用 0.6 微米 CMOS EEPROM 工艺。
FM17XX 系列读卡机芯片可分别支持 13.56MHz 频率下的 typeA、typeB、15693 三种非接触通信协
议;支持 MIFARE 和上海标准的加密算法;可兼容飞利浦公司的 RC500、RC530、RC531 及 RC632
等读卡机芯片;芯片内部高度集成了模拟调制解调电路,所以只需最少量的外围电路即可工作;支
持 6 种微处理器接口;其数字电路具有 TTL、CMOS 两种电压工作模式;该芯片适用于各类计费系
统读卡器的应用。
尤其是 FM17XXL 系列芯片,其三路电源的最低工作电压均可达 2.9V,这一特性优于其他公司的同
类产品。

FM17XX型号众多,实际上只是接口、加密算法、协议支的不一样,大部分都是兼容的。

下面是FM17xx的选型表

我使用的是FM1722NL这一款,上面的表里没有,实际上和FM1702NL、FM1724/5兼容,只是FM1722NL相对FM1702NL支持的协议多一点,基本代码(读写ISO 14443A卡)通用。

2.硬件电路(硬件SPI)

FM1722的引脚图如上图所示,特别注意NRD、NWR、A1这三个脚,必须按照上图的要求连接高电平或者低电平,否则可能会导致FM1722无法使用SPI接口通信。

虽然FM1722NL支持3.3V~5V供电,实际使用发现3.3V供电时,天线发射功率很小,

卡片需要紧贴着天线才能读到卡,有时甚至无法读卡,所以建议(主要针对IO口为3.3V单片机)

1.模拟+天线使用 5V供电

2.数字使用3.3V供电

FM1722的SPI时序采用标准SPI时序,主要注意以下几点

  • 注意下CPOL和CPHA的设置
  • NSS在发送时必须拉低,发送完必须拉高。
  • 8位数据位,MSB在前
  • FM1722必须配置为从机

 3.软件调试

软件部分主要是SPI通信,这里采用STM32的硬件SPI(SPI2:PB13、PB14、PB15),需要注意的是前面提到的SPI的CPOL、CPHA和NSS的配置。

主机端SPI配置如下:

void SPI1_Init(void)
{
  GPIO_InitTypeDef     GPIO_InitStructure;	
	SPI_InitTypeDef      SPI_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );//PORTB 时钟使能
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE );//SPI2 时钟使能

	// 初始化SPI接口引脚	//PB13/14/15 复用推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化 GPIOB	
	
	// 初始化片选、复位引脚   PB12:片选     PB9:复位
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化 PB9/12  
	// 初始化SPI参数	
	GPIO_SetBits(GPIOB,GPIO_Pin_9);//FM17XX NSS拉高 开始复位
	
	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //双线双向全双工
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主 SPI
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // SPI 发送接收 8 位帧结构
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//CLK空闲为电平
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//上升沿数据被采样
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS 信号由软件控制
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //预分频 256
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从 MSB 位开始
	SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC 值计算的多项式
	SPI_Init(SPI2, &SPI_InitStructure); //根据指定的参数初始化外设 SPIx 寄存器	
	SPI_Cmd(SPI2, ENABLE); //使能 SPI2 外设
  SPI1_ReadWriteByte(0xff); 
}   
u8 SPI1_ReadWriteByte(u8 TxData)
{		
   	u8 retry=0;
	while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //等待发送区空
	{
		retry++;
		if(retry>200)
			return 0;
	}
	SPI2->DR = TxData;	
	retry=0;
	while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //等待接收完一个 byte
	{
		retry++;
		if(retry>200)
			return 0;
	}
	return (SPI2->DR); //返回通过 SPIx 最近接收的数据	
}

FM1722主要是初始化函数、读写寄存器函数。

/****************************************************************/
/*名称: WriteReg                                              */
/*功能: 写FM1702寄存器                                           */
/*输入: Address - 寄存器地址; value - 写入的值                  */
/*输出: N/A                                                     */
/****************************************************************/
void SPIWrite(unsigned char Address, unsigned char Data)
{
    Address = ((Address<<1)&0x7E);
    FM1702_CS_L;
    SPI1_ReadWriteByte(Address);
    SPI1_ReadWriteByte(Data);
    FM1702_CS_H;
}
/****************************************************************/
/*名称: ReadReg                                               */
/*功能: 读FM1702寄存器                                           */
/*输入: Address-寄存器地址                                      */
/*输出: 读出的值                                                */
/****************************************************************/
unsigned char SPIRead(unsigned char Address)
{
    unsigned char Temp;
    Address=(Address<<1)|0x80;   
    FM1702_CS_L;
	  SPI1_ReadWriteByte(Address);
    Temp=SPI1_ReadWriteByte(0x0); 
    FM1702_CS_H;
    return Temp;
}

其中FM1702_CS_L就是拉低NSS脚

/****************************************************************/
/*名称: Init_FM1702 */
/*功能: 该函数实现对FM1702初始化操作*/
/*输入: mode:工作模式, 0:TYPEA模式*/
/* 1:TYPEB模式*/
/* 2:上海模式*/
/*输出: N/A */
/****************************************************************/
void Init_FM1702(uchar mode)
{

    uchar temp;
    uint	i;
	  SPI1_Init();//初始化SPI接口
	
    GPIO_SetBits(GPIOB,GPIO_Pin_9);
    delay_ms(10);
    GPIO_ResetBits(GPIOB,GPIO_Pin_9);
    delay_ms(10); //RST引脚下降沿 FM17xx复位 
    
   
    while(SPIRead(Command) != 0)		 // 等待Command = 0,FM1702复位成功 
    { 	
      temp=SPIRead(Command); 			
			printf("复位中...%d\r\n",temp);		
			if(temp==FM1702_OK)break;
			delay_ms(500);
    }

					
    SPIWrite(Page_Sel,0x80);    //往Page寄存器写80hex初始化SPI接口
    for(i = 0; i < 0x1fff; i++) /* 延时 */
    {
        if(SPIRead(Command) == 0x00)
        {
            SPIWrite(Page_Sel,0x00);
        }
    }
		
    if(mode ==2)
    {
        SPIWrite(TypeSH,0x01);
    }
    else
    {
        SPIWrite(TypeSH,0x00);
    }
    
}

这些代码实际上都是根据官方代码修改的。

4.调试

首先调试SPI通信,确保主机和FM1722通信正常,方法如下:

需要找一个FM1722可读可写的寄存器,主机向该寄存器中写入一个数,然后再读出来,如果写入的值与读出来的一样,那么SPI通信基本上没有问题,可以多找几个寄存器试试。

然后就是尝试读卡号,基本流程是Request->AntiColl->Select_Card ,AntiColl成功后就能读到卡号了。

STM32F103调试通过例程:FM1702NL/FM1722硬件SPI读写程序_fm1702-硬件开发文档类资源-CSDN下载

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FM1722/02NL+STM32硬件SPI调试笔记 的相关文章

  • RFID ACCESS CONTROL门禁密码修改

    1 必须先进入编程方式 xff1a 按 xff3b xff3d xff0b xff3b 6位编程密码 如012345 xff0c 忘记编程密码参考第6步重置 xff0c 嘟嘟两声响 xff0c xff08 红灯闪烁 xff0c 绿灯长亮 出
  • 19.RFID复习

    题型 填空题30分 xff08 一空一分 xff09 简答题30分 xff08 三道题 xff09 综合题40分 xff08 两道题 xff09 重点章节第一章 xff0c 第二章 xff08 见整理的练习题 xff09 xff0c 第四章
  • RFID 负载调制和反向散射调制

    我用我质朴的语言概述一下我的理解 xff0c 射频识别系统中 xff0c 阅读器和标签之间的通信通过电磁波来实现 按照通信距离 xff0c 可以划分为近场和远场 xff1b 按照频率又分 xff1a 低频 高频 超高频 相应的 xff0c
  • 第1章 前 言

    来源 我是码农 转载请保留出处和链接 本文链接 http www 54manong com id 1258 1 1 问题的背景 1 1 1 RFID技术 RFID即无线射频识别技术 Radio Frequency Identificatio
  • 应用于电力计能表的RFID仓储管理系统

    1 应用背景 电力计量中心是电力行业的电能计量检测机构 承担辖区内电能计量器具安全生命周期管理的职能 包括采购 仓储 检测 配送 安装 运行监测等各个环节 随着城网改造和居民一户一表工作的深入进行 电力新装用表数量急剧增加 传统的计量中心难
  • 图解通信原理与案例分析-32:物流仓储、智能交通中的RFID通信技术详解

    前言 RFID射频身份识别 是一个非常成熟的通信技术 在仓储物流 交通运输等行业有广泛的应用 本文就将介绍RFID的通信原理 目录 第1章 RFID射频身份识别概述 第2章 RFID网络架构 2 1 RFID通信无线通信 2 2 RFID系
  • FM1722/02NL+STM32硬件SPI调试笔记

    1 介绍 FM17XX 系列通用非接触读卡机芯片是复旦微电子股份有限公司设计的 基于 ISO14443 标准的系 列通用非接触卡读卡机芯片 采用 0 6 微米 CMOS EEPROM 工艺 FM17XX 系列读卡机芯片可分别支持 13 56
  • “RFID与光伏板的完美融合:探索能源科技的新时代!“

    随着科技的不断发展 人类创造出了许多令人惊叹的发明 其中 RFID Radio Frequency Identification 技术的应用在各个领域日益广泛 最近的研究表明 将RFID技术应用于光伏板领域 不仅可以提高光伏板的效率 还可以
  • CK-GW208-EC与汇川PLC配置走EtherCAT通讯指南

    CK GW208 EC这款产品是晨控智能一款工业级 IO LINK 主站网关 支持 EtherCat 工业协议 可通过以太网接口 对 IO LINK 从站设备进行控制 CK GW208 EC 是一款支持标准工业 Ethercat协议的 IO
  • 毕业设计 stm32 RFID智能仓库管理系统(源码+硬件+论文)

    文章目录 0 前言 1 主要功能 3 核心软件设计 4 实现效果 5 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟学妹告诉学长自己做的项目系统达不
  • Android NFC 读取 ISO15693 RFID 标签

    我正在尝试使用 nfc android 库读取 ISO15693 RFID 标签 以下是有关标签的更多信息 http img42 com gw07d 标签 ID 已正确读取 但标签中的数据未正确读取 onCreate Method init
  • MIFARE Classic:如何找到良好的访问字节值

    我的目标是仅进行 KEY A 身份验证并禁用 Key B 用于存储数据的空间 我阅读了这些文档 http www nxp com documents data sheet MF1S503x pdf http dangerousthings
  • Mifare认证

    假设我想对 Mifare Classic 进行身份验证 我如何知道要发送到卡的 APDU 的确切类型 Example 这段代码 bcla 0xFF bins 0x86 bp1 0x0 bp2 0x0 currentBlock len 0x5
  • 区分不同类型的 MIFARE Ultralight

    如何识别不同类型的MIFARE Ultralight标签 在文档中AN10834Ultralight 和 Ultralight C 的不同之处在于 Auth 的答案 这个 验证 是什么 芯片的datasheet中没有对该功能的描述 我注意到
  • Apple Watch 是否能被 RFID 读取器检测到?

    我是 NFC 技术的新手 苹果尚未向开发者开放 NFC 这是否意味着第 3 方应用程序无法在设备上写入数据或触发操作 但是否可以使用类似于智能卡的 RFID 读取器来识别手表呢 使用支持 NFC 的 Apple Wallet Pass 可以
  • 是否可以像读取 RFID 标签一样读取 iPhone 的 NFC 芯片?

    我知道 iPhone 6 不可能读取 RFID 标签 而且 iPhone API 只允许使用 NFC 进行 Apple Pay 但是是否可以像读取 RFID 标签一样读取 iPhone 的 NFC 芯片呢 也就是说 通过将 RFID 读取器
  • 树莓派 pico rfid rc522 (Micropython)

    我想使用 RPi Pico 从 mfrc522 Iduino RFID rc522 读卡器读取数据 但我不知道如何操作 我试图使用为此目的制作的 mfrc522 py MicroPython 库 阅读器正在通过 SPI 与 Pi 通信 我将
  • 更改 MIFARE Classic 中扇区的身份验证密钥

    根据埃文的回答这一页 https forums tessel io t change auth code 1091 为了更改扇区的身份验证密钥 我们需要覆盖该扇区的第四个块 最后一个块 中的密钥 默认密钥始终为 FF FF FF FF FF
  • Android 应用程序模仿物理 RFID 卡

    Android 应用程序是否可以将之前存储的 RFID 卡 ID 发送到 NFC 读卡器 目标是使用 Android 设备代替物理 RFID 卡来访问房间 在阅读了许多有关 NFC RFID 和卡模拟的其他帖子后 我得出的结论是 它目前在
  • ISO15693 (NfcV) / Tag-it HF-I 命令引发标签丢失异常

    当我尝试收发 NFC V Tag it HF I Plus Inlay 标签的命令时 大多数命令都会出现 TagLostException 从我经历过的链接来看 这个异常可能是由不正确的命令引起的 如何为 Nfc V Tag it HF I

随机推荐

  • 你不知道的JavaScript-----词法作用域

    作用域 引擎就是老大 是终极控制中心 控制整个程序的执行 编译器是协助引擎解析程序 而作用域是解析程序的一种规则 注意 无论函数在哪里调用 也无论它如何被调用 它的词法作用域都只由函数被声明时所处的位置决定 词法阶段 词法作用域就是定义在词
  • 基于vue的文件夹上传插件

    基于vue simple uploader封装文件分片上传 秒传及断点续传的全局上传插件 1 前言 之前公司要在管理系统中做一个全局上传插件 即切换各个页面的时候 上传界面还在并且上传不会受到影响 这在vue这种spa框架面前并不是什么难题
  • statsmodels API

    1 介绍 主要的 statsmodels API 分为以下模块 statsmodels api 横截面模型和方法 statsmodels tsa api 时间序列模型和方法 statsmodels formula api 使用公式字符串和
  • 《数学建模与数学实验》第5版 非线性规划 习题4.4

    文章目录 1 一电路由三个电阻 R 1 R 2
  • JAVA框架03 -- Spring

    概念相关 spring 是什么 Spring 是分层的 Java SE EE 应用 full stack 轻量级开源框架 以 IoC Inverse Of Control 反转控制 和 AOP Aspect Oriented Program
  • JavaWeb核心技术——Web概述

    目录 1 Web概述 1 1 Web和JavaWeb的概念 1 2 JavaWeb技术栈 1 2 1 B S架构 1 2 2 静态资源 1 2 3 动态资源 1 2 4 数据库 1 2 5 HTTP协议 1 2 6 Web服务器 1 Web
  • 【华为OD】

    目录 一 题目描述 二 输入描述 三 输出描述 用例 四 题目解析 五 Java玩法 六 JavaScript玩法 一 题目描述 给定两个字符串 s1 和 s2 和正整数 K 其中 s1 长度为 n1 s2 长度为 n2 在 s2 中选一个
  • 跳频技术——学习总结(一)

    跳频技术 学习总结 一 开始跳频的学习快一个月了吧 最近才停下其它事情 集中时间看了一些内容 资料有 跳频通信干扰与抗干扰技术 那丹彤 跳频通信 梅文华 和网上百度的各种资料 一 扩频概念和分类 扩频通信 一种利用与信息无关的伪随机序列使射
  • Linux之GPIO应用

    目录 一 sysfs 文件系统 二 LED标准接口 三 GPIO标准接口 1 gpiochipX 2 export direction value active low edge 3 unexport 在 Linux 系统下 一切皆文件 应
  • 外包的水太深了,18k的阿里外包不太敢去.....

    有挺多测试员曾在BAT 网易这些大厂做过外包 想必大家也是非常关心此类问题 我就想介绍下 什么是外包 外包公司的现状 就 为什么这么多人鄙视外包测试岗 阿里18K的外包测试岗能去吗 谈谈自己的想法 什么是外包 外包指企业在管理系统实施过程中
  • Environment Modules

    什么是 Environment Modules 通常 用户在登录时通过为会话期间要引用的每个应用程序设置环境信息来初始化其环境 Environment Modules包 是一个简化shell初始化的工具 它允许用户在使用 modulefil
  • JSTL的基本使用

    开发工具与关键技术 IDEA 撰写时间 2022 8 28 前提 创建一个java Maven项目 并把 Tomcat 装上 并在后端传数据到jsp页面 在 pox xml文件下导入该jar包
  • WEB_HCTF_2018_WarmUp

    Categories web 代码审计 write up source code get source code http eb22847d 9f8a 4ecf b972 5ecebfcf5faf node3 buuoj cn source
  • C++ sizeof() 和一道面试题

    首先要明确sizeof不是函数 也不是一元运算符 他是个类似宏定义的特殊关键字 sizeof 括号内在编译过程中是不被编译的 而是被替代类型 如int a 8 sizeof a 在编译过程中 它不管a的值是什么 只是被替换成类型sizeof
  • 使用Jsoncpp生成和解析Json字符串

    上一篇 同大家一起分享了QJson的移植 Qt4 8 3 使用技巧 如何移植和使用QJson 本篇我们来熟悉下使用Jsoncpp生成和解析Json字符串 当然作为Qt的狂热爱好者 我还是会继续改造Jsoncpp项目 来一个Qt项目版 需要下
  • 欧姆龙PLC伺服功能块 功能块可供选择脉冲0-3,脉冲输出方式CW/CCW或者脉冲加方向

    欧姆龙PLC伺服功能块 功能块可供选择脉冲0 3 脉冲输出方式CW CCW或者脉冲加方向 一个功能块实现伺服点动 相对位置 绝对位置 伺服回原点所有操作 所有一些标志位 都有对应的输入和输出 程序里都有讲解和注明 ID 6920615056
  • redis应用之缓存穿透、缓存击穿、缓存雪崩

    redis应用之缓存穿透 缓存击穿 缓存雪崩 记录一下redis应用中常见的三大问题 首先看一下应用redis作为缓存的系统数据访问的架构图 客户端发起一个查询请求的时候 首先去缓存中查询 如果数据在缓存中存在 则直接将缓存中的数据返回给客
  • 解决Eclipse EE部署web项目在Tomcat webapp目录下没有工程文件的问题

    之前本人在进行web应用开发时用的都是 MyEclipse 最近在用 Eclipse EE 进行 web 应用开发时却发现成功部署后 在Tomcat 的 webapps 目录下没有相关的工程文件 要知道在使用MyEclipse的时候是默认部
  • 7、使用IO流读取指定文件内容,并完成相关操作

    编程题目 7 从类似如下的文本文件中读取出所有的姓名 并打印出重复的姓名和重复的次数 并按重复次数排序 1 张三 28 2 李四 35 3 张三 28 4 王五 35 5 张三 28 6 李四 35 7 赵六 28 8 田七 35 示例代码
  • FM1722/02NL+STM32硬件SPI调试笔记

    1 介绍 FM17XX 系列通用非接触读卡机芯片是复旦微电子股份有限公司设计的 基于 ISO14443 标准的系 列通用非接触卡读卡机芯片 采用 0 6 微米 CMOS EEPROM 工艺 FM17XX 系列读卡机芯片可分别支持 13 56