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; //主 SPISPI_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; //预分频 256SPI_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下载

FM1722/02NL+STM32硬件SPI调试笔记相关推荐

  1. STM32硬件SPI控制TM1638 按键数码管LED显示模块

    STM32硬件SPI控制TM1638按键数码管LED显示模块   从淘宝买来的,TM1638专门是控制LED的,LED组合起来就可以变成数码管,还有按键,这个我就没管了,不想管了,发这个帖子只是为了记 ...

  2. 嵌入式开发-STM32硬件SPI驱动TFT屏

    嵌入式开发-STM32硬件SPI驱动TFT屏 这次用到的TFT屏 CubeMX设置 代码编写 增加的内容 需要注意问题 代码下载 这次用到的TFT屏 现在的TFT屏幕已经很便宜了,65536色屏幕,2 ...

  3. STM32硬件SPI驱动OLED

    文章目录 一.OLED相关 1.OLED简介 2.0.96寸的OLED模块概述 3.模块引脚说明 4.汉字点阵编码原理 二.硬件SPI 1.SPI简介 2.SPI的引脚映射关系 三.SPI驱动的OLE ...

  4. DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信

    本篇详细的记录了如何使用STM32CubeMX配置STM32F103C8T6的硬件SPI外设与DW1000通信,为移植DW1000官方驱动打下基础. 1. 准备工作 硬件准备 开发板 首先需要准备一个 ...

  5. 基础篇010.2 STM32驱动RC522 RFID模块之二:STM32硬件SPI驱动RC522

    目录 1. 实验硬件及原理图 1.1 RFID硬件 1.2 硬件原理图 2. 单片机与RFID硬件模块分析 3. 利用STM32CubeMX创建MDK工程 3.1 STM32CubeMX工程创建 3. ...

  6. STM32硬件SPI使用与nSS的理解

    最近在调试硬件SPI,之前使用软件模拟方式,为了提高速度,选择该方式进行替换. 花了一些时间了解寄存器跟库函数直接调用,结果要么读取不出数据(陷入等待TXE,RXNE死循环)或读取数据为0xffff, ...

  7. STM32F030xx硬件SPI调试记录

    笔者最近调试STM32F030F4这颗芯片的硬件SPI,本以为将F103的程序直接移植过去就可以,但是却出了很多问题,故在此记录一下,避免后面再走弯路,顺便也给广大网友做一个前车之鉴. 注意:本文使用 ...

  8. stm32硬件SPI驱动3线SPI-LCD的方法

    1.基本控制原理 三线SPI LCD, 顾名思义,最少只需要3个IO控制LCD显示,如果采用硬件控制上电时序和背光,最少只需要接SCK,CS,MOSI三个引脚即可控制LCD,并且不管接不接其他引脚,控 ...

  9. STM32硬件SPI通过fm17550读取身份证UID,识别银行卡,识别TYPEA与TYPEB

    上面是我的微信和QQ群,欢迎新朋友的加入. 目录 1.硬件平台 2.驱动实现 3.循环扫卡测试程序 4.TYPEB射频卡扫描 5.TYPEA射频卡扫描 6.身份证UID读取 1.硬件平台 1.STM3 ...

最新文章

  1. java保存多张图片格式_从多个URL下载多个图像文件并保存到本地计算机(使用R)...
  2. 开发管理 CheckLists(4) -风险管理
  3. 活动推荐丨阿里云TechInsight论坛为什么这么火?
  4. Linux CenOS Python3 和 python2 共存
  5. 构建器设计模式_创新设计模式:构建器模式
  6. 2. OD-爆破exe验证程序
  7. Tensorflow 实战 Google 深度学习框架(第2版)---- 10.2.2节 P274 代码
  8. 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。...
  9. 2021大学计算机一级考试试题题库,2021年全国计算机等级考试一级试题及答案.pdf...
  10. ENGLISH-剑桥-朗文-柯林斯-韦氏dictionary
  11. php贴吧系统,PhpSay 开源贴吧系统 v2.1
  12. 聚焦交通缓堵之东城篇,核心区如何重拳治堵
  13. 在 RedHat、 CentOS、 Fedora 上安装 Teamviewer 9(转)
  14. Python 函数 | zip 函数详解
  15. 微信支付账单修改数字
  16. 用户计算机名更改为英文,win10将用户名改为英文怎么改_win10如何更改用户名为英文图文教程-系统城...
  17. 【行业首发】蛙色VR全景作品支持对接飞猪旅行
  18. H5 架构和原生架构的区别
  19. 从X240电脑看传统企业的创新陷阱
  20. c语言 %-10s,10s

热门文章

  1. 一套完整的大型三甲医院信息管理(HIS)系统源码【免费分享源代码 】
  2. 数电笔记之第三章门电路之cmos反相器静态特性
  3. vs如何添加自定义字体
  4. 打卡小程序源码附搭建教程
  5. PYNQ下的DMA传输实现及速度测试
  6. IDEA 打包Web项目为war包
  7. 经纬度坐标与高斯坐标的转换代码
  8. 188数码管驱动程序(简洁)
  9. Excel VBA中如何支持复数计算?
  10. Neo4j调用APOC算法库