FM1722/02NL+STM32硬件SPI调试笔记
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调试笔记相关推荐
- STM32硬件SPI控制TM1638 按键数码管LED显示模块
STM32硬件SPI控制TM1638按键数码管LED显示模块 从淘宝买来的,TM1638专门是控制LED的,LED组合起来就可以变成数码管,还有按键,这个我就没管了,不想管了,发这个帖子只是为了记 ...
- 嵌入式开发-STM32硬件SPI驱动TFT屏
嵌入式开发-STM32硬件SPI驱动TFT屏 这次用到的TFT屏 CubeMX设置 代码编写 增加的内容 需要注意问题 代码下载 这次用到的TFT屏 现在的TFT屏幕已经很便宜了,65536色屏幕,2 ...
- STM32硬件SPI驱动OLED
文章目录 一.OLED相关 1.OLED简介 2.0.96寸的OLED模块概述 3.模块引脚说明 4.汉字点阵编码原理 二.硬件SPI 1.SPI简介 2.SPI的引脚映射关系 三.SPI驱动的OLE ...
- DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信
本篇详细的记录了如何使用STM32CubeMX配置STM32F103C8T6的硬件SPI外设与DW1000通信,为移植DW1000官方驱动打下基础. 1. 准备工作 硬件准备 开发板 首先需要准备一个 ...
- 基础篇010.2 STM32驱动RC522 RFID模块之二:STM32硬件SPI驱动RC522
目录 1. 实验硬件及原理图 1.1 RFID硬件 1.2 硬件原理图 2. 单片机与RFID硬件模块分析 3. 利用STM32CubeMX创建MDK工程 3.1 STM32CubeMX工程创建 3. ...
- STM32硬件SPI使用与nSS的理解
最近在调试硬件SPI,之前使用软件模拟方式,为了提高速度,选择该方式进行替换. 花了一些时间了解寄存器跟库函数直接调用,结果要么读取不出数据(陷入等待TXE,RXNE死循环)或读取数据为0xffff, ...
- STM32F030xx硬件SPI调试记录
笔者最近调试STM32F030F4这颗芯片的硬件SPI,本以为将F103的程序直接移植过去就可以,但是却出了很多问题,故在此记录一下,避免后面再走弯路,顺便也给广大网友做一个前车之鉴. 注意:本文使用 ...
- stm32硬件SPI驱动3线SPI-LCD的方法
1.基本控制原理 三线SPI LCD, 顾名思义,最少只需要3个IO控制LCD显示,如果采用硬件控制上电时序和背光,最少只需要接SCK,CS,MOSI三个引脚即可控制LCD,并且不管接不接其他引脚,控 ...
- STM32硬件SPI通过fm17550读取身份证UID,识别银行卡,识别TYPEA与TYPEB
上面是我的微信和QQ群,欢迎新朋友的加入. 目录 1.硬件平台 2.驱动实现 3.循环扫卡测试程序 4.TYPEB射频卡扫描 5.TYPEA射频卡扫描 6.身份证UID读取 1.硬件平台 1.STM3 ...
最新文章
- java保存多张图片格式_从多个URL下载多个图像文件并保存到本地计算机(使用R)...
- 开发管理 CheckLists(4) -风险管理
- 活动推荐丨阿里云TechInsight论坛为什么这么火?
- Linux CenOS Python3 和 python2 共存
- 构建器设计模式_创新设计模式:构建器模式
- 2. OD-爆破exe验证程序
- Tensorflow 实战 Google 深度学习框架(第2版)---- 10.2.2节 P274 代码
- 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。...
- 2021大学计算机一级考试试题题库,2021年全国计算机等级考试一级试题及答案.pdf...
- ENGLISH-剑桥-朗文-柯林斯-韦氏dictionary
- php贴吧系统,PhpSay 开源贴吧系统 v2.1
- 聚焦交通缓堵之东城篇,核心区如何重拳治堵
- 在 RedHat、 CentOS、 Fedora 上安装 Teamviewer 9(转)
- Python 函数 | zip 函数详解
- 微信支付账单修改数字
- 用户计算机名更改为英文,win10将用户名改为英文怎么改_win10如何更改用户名为英文图文教程-系统城...
- 【行业首发】蛙色VR全景作品支持对接飞猪旅行
- H5 架构和原生架构的区别
- 从X240电脑看传统企业的创新陷阱
- c语言 %-10s,10s