零基础STM32单片机编程入门(十七)SPI总线详解及RC522-NFC刷卡模块实战含源码

文章目录

    • 一.概要
    • 二.SPI总线基本概念
      • 1.SPI总线内部框图
      • 2.总体特征
      • 3.通讯时序
    • 三.RC522介绍
      • 1.NFC基本介绍
      • 2.RC522模块基本特点
      • 3.RC522模块原理图
      • 4.RC522模块SPI通讯时序
    • 四.RC522模块读卡实验
    • 五.CubeMX工程源代码下载
    • 六.小结

一.概要

SPI总线是由Motorola公司提出,是一种三线同步接口:同步信号、输入信号和输出信号。
另外每个扩展芯片还需要一根片选线,主器件通过片选线选通与其通信的从器
件。
SPI是全双工的,即数据的发送和接收可同时进行。如果仅对从器件写数据,主器件可以丢弃同时读入的数据;反之,如果仅读数据,可以在命令字节后,写入任意数据。数据传送以字节为单位,并采用高位在前的格式。

二.SPI总线基本概念

SPI总线一般由四个信号组成。
MISO:主设备输入/从设备输出管脚。该管脚在从模式下发送数据,在主模式下接收数据。
MOSI:主设备输出/从设备输入管脚。该管脚在主模式下发送数据,在从模式下接收数据。
SCK:串口时钟,作为主设备的输出,从设备的输入
/SS:从设备选择,低电平有效。这是一个可选的管脚,用来选择从设备。它的功能是用来作为“片选管脚”,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。从设备的/SS管脚可以由主设备当作一个标准的IO来驱动。/SS管脚作为输出管脚,并在SPI设置为主模式时拉低;从机的/SS管脚连接到主设备/SS管脚的SPI设备,会检测到低电平,如果它们被设置为/SS硬件模式,就会自动进入从设备状态

在这里插入图片描述

1.SPI总线内部框图

在这里插入图片描述
在这里插入图片描述

一个主机跟一个从机典型应用连接如下图:
MOSI脚相互连接,MISO脚相互连接。这样,数据在主和从之间串行地传输(MSB位在前)。 通信总是由主设备发起。主设备通过MOSI脚把数据发送给从设备,从设备通过MISO引脚回传数据。这意味全双工通信的数据输出和数据输入是用同一个时钟信号同步的;时钟信号由主设备通过SCK脚提供。
在这里插入图片描述

2.总体特征

● 3线全双工同步传输
● 带或不带第三根双向数据线的双线单工同步传输
● 8或16位传输帧格式选择
● 主或从操作
● 支持多主模式
● 8个主模式波特率预分频系数(最大为fPCLK/2)
● 从模式频率 (最大为fPCLK/2)
● 主模式和从模式的快速通信
● 主模式和从模式下均可以由软件或硬件进行NSS管理:主/从操作模式的动态改变
● 可编程的时钟极性和相位
● 可编程的数据顺序,MSB在前或LSB在前
● 可触发中断的专用发送和接收标志
● SPI总线忙状态标志
● 支持可靠通信的硬件CRC

3.通讯时序

数据传输的时钟依靠主处理器的时钟脉冲。时钟的设置是根据时钟极性(CPOL)和时钟相位(CPHA)两个参数来决定的。
主和从必须配置成相同的时序模式。

CPOL 0:SCK在空闲状态保持低电平。
CPOL 1:SCK在空闲状态保持高电平。
CPHA 0:SCK的第1个(奇数)边沿进行数据位采样接收,数据在第2个时钟边沿发送数据。
CPHA 1:SCK的第2个(偶数)边沿进行数据位采样接收,数据在第1个时钟边沿发送数据。
根据CPOL和CPHA的不同组合,可以有四种不同的时钟极性和相位模式,分别为:
模式0:CPOL=0,CPHA=0
模式1:CPOL=0,CPHA=1
模式2:CPOL=1,CPHA=0
模式3:CPOL=1,CPHA=1

目前最常用的是CPOL 0,CPHA 0,就是空闲时SCK时钟为低电平,采样时刻为第1个边沿即上升沿。

总线空闲时:
SCK信号强制为低,SS强制为高,MOSI/MISO管脚处于高阻状态。
在传输数据时:
SS被拉低,从设备选中,主设备开始控制SPI时钟,1/2个SCK周期后,主机发送数据到MOSI管脚,从机发送数据到MISO管脚。此时数据在SCK信号的上升沿被捕获,保持到SCK的下降沿。
在发送单个帧的时候,当数据帧的所有位发送完成后,最后一个数据位被捕获的一个SCK周期后,SS返回高电平。
在这里插入图片描述

三.RC522介绍

RC522 刷卡模块是应用于13.56MHz 非接触式通信中高集成度读写卡系列芯片中的一员,是NXP 公司针对“三表”应用推出的一款低电压、低成本、体积小的非接触式读卡器芯片。

在这里插入图片描述

1.NFC基本介绍

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.RC522模块基本特点

在这里插入图片描述

3.RC522模块原理图

在这里插入图片描述

4.RC522模块SPI通讯时序

在这里插入图片描述
对RC522基本命令码
在这里插入图片描述

对卡片操作的0x0C数据通讯命令中的基本指令
在这里插入图片描述

由上面的SPI讲解知识可知,RC522的SPI通讯时序中的CPOL=0,CPHA=0
在这里插入图片描述

四.RC522模块读卡实验

硬件准备:

STLINK接STM32F103C8T6小系统板,STLINK接电脑USB口,

1.用杜邦线连接板子跟刷卡模块:
开发板3.3V            <->模块VCC
开发板PA4脚          <->模块SDA(SS引脚)
开发板PA5脚          <->模块SCK
开发板PA6脚          <->模块MISO
开发板PA7脚          <->模块MOSI
开发板GND            <->模块GND 
开发板3.3V            <->模块RST 2.用杜邦线连接板子与OLED显示屏:
板子3.3V--模块VCC
板子GND---模块GND	
板子PB10--模块SCL
板子PB11--模块SDA	

在这里插入图片描述
打开STM32CubeMX软件,新建工程
在这里插入图片描述
Part Number处输入STM32F103C8,再双击就创建新的工程
在这里插入图片描述
配置下载口引脚
在这里插入图片描述
配置外部晶振引脚
在这里插入图片描述
配置系统主频
在这里插入图片描述

配置PA4引脚为GPIO输出,配置SPI1,使用PA5,PA6,PA7引脚
在这里插入图片描述

配置工程文件名,保存路径,KEIL5工程输出方式
在这里插入图片描述
生成工程
在这里插入图片描述
用Keil5打开工程
在这里插入图片描述
添加代码
在这里插入图片描述
在这里插入图片描述

主要代码

int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();//8M外部晶振,72M主频/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_SPI1_Init();//配置SPI1引脚,/* USER CODE BEGIN 2 */MFRC522_Init();//RC522初始化,使用SPI驱动OLED_Init();//OLED初始化  OLED_Clear();//清屏/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */OLED_Clear();//清屏OLED_ShowCHinese(18,0,0);//光OLED_ShowCHinese(36,0,1);//子OLED_ShowCHinese(54,0,2);//物OLED_ShowCHinese(72,0,3);//联OLED_ShowCHinese(90,0,4);//网OLED_ShowString(6,3,"NFC RC522 TEST");//显示字符串OLED_ShowString(3,6,"ID:");//显示字符串OLED_ShowString(30,6,txBuffer);//显示读到的ID值HAL_Delay(1000);//等待1秒if (!MFRC522_Request(PICC_REQIDL, str)) {//寻卡if (!MFRC522_Anticoll(str)) {//获得卡序列号j = 0;b = 0;for (i=0; i<4; i++) if (lastID[i] != str[i]) j = 1;								// 如果读到ID不同,需要显示更新if (j) {for (i=0; i<4; i++) lastID[i] = str[i];for (i=0; i<4; i++) {char_to_hex(str[i]);txBuffer[b] = retstr[0];//序列号存在txBuffer中b++;txBuffer[b] = retstr[1];b++;}										}}}}/* USER CODE END 3 */
}
//初始化复位跟配置
void MFRC522_Init(void) {MFRC522_Reset();MFRC522_WriteRegister(MFRC522_REG_T_MODE, 0x8D);MFRC522_WriteRegister(MFRC522_REG_T_PRESCALER, 0x3E);MFRC522_WriteRegister(MFRC522_REG_T_RELOAD_L, 30);           MFRC522_WriteRegister(MFRC522_REG_T_RELOAD_H, 0);MFRC522_WriteRegister(MFRC522_REG_RF_CFG, 0x7F);				// 48dB gain	MFRC522_WriteRegister(MFRC522_REG_RX_THRESHOLD, 0x84);<<<<<<<<<<<<<<<<<<<<MFRC522_WriteRegister(MFRC522_REG_TX_AUTO, 0x40);MFRC522_WriteRegister(MFRC522_REG_MODE, 0x3D);MFRC522_AntennaOn();																		// Open the antenna
}void MFRC522_Reset(void) {MFRC522_WriteRegister(MFRC522_REG_COMMAND, PCD_RESETPHASE);
}void MFRC522_AntennaOn(void) {uint8_t temp;temp = MFRC522_ReadRegister(MFRC522_REG_TX_CONTROL);if (!(temp & 0x03)) MFRC522_SetBitMask(MFRC522_REG_TX_CONTROL, 0x03);
}
//SPI口写一字节内容
uint8_t SPI1SendByte(uint8_t data) {unsigned char writeCommand[1];unsigned char readValue[1];writeCommand[0] = data;HAL_SPI_TransmitReceive(&hspi1, (uint8_t*)&writeCommand, (uint8_t*)&readValue, 1, 10);//调用HAL库生成的SPI收发驱动函数return readValue[0];}
//写寄存器
void SPI1_WriteReg(uint8_t address, uint8_t value) {cs_reset();SPI1SendByte(address);SPI1SendByte(value);cs_set();
}
//获取卡序列号
uint8_t MFRC522_Anticoll(uint8_t* serNum) {uint8_t status;uint8_t i;uint8_t serNumCheck = 0;uint16_t unLen;MFRC522_WriteRegister(MFRC522_REG_BIT_FRAMING, 0x00);												// TxLastBists = BitFramingReg[2..0]serNum[0] = PICC_ANTICOLL;serNum[1] = 0x20;status = MFRC522_ToCard(PCD_TRANSCEIVE, serNum, 2, serNum, &unLen);if (status == MI_OK) {// Check card serial numberfor (i = 0; i < 4; i++) serNumCheck ^= serNum[i];if (serNumCheck != serNum[i]) status = MI_ERR;}return status;
} 

五.CubeMX工程源代码下载

链接:https://pan.baidu.com/s/11yqx3uEpEFb5WWkIibICLg
提取码:5uqi
如果链接失效,可以联系博主给最新链接

程序下载下来之后解压就行

六.小结

STM32的SPI口是一种同步、全双工的通信标准,常用于短距离通信,如与Flash、传感器、显示驱动器等设备的通信,所以学会SPI能驱动各种模块传感器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/47373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

05_解封装和解码

1. 基本概念 容器就是一种文件格式&#xff0c;比如flv、mkv、mp4等。包含下面5种流以及文件头信息。 流是一种视频数据信息的传输方式&#xff0c;5种流&#xff1a;音频&#xff0c;视频&#xff0c;字幕&#xff0c;附件&#xff0c;数据。 包在ffmpeg中代表已经编码好的一…

FPGA实验3:D触发器设计

一、实验目的及要求 熟悉Quartus II 的 VHDL 文本设计简单时序电路的方法&#xff1b; 掌握时序电路的描述方法、波形仿真和测试&#xff0c;特别是时钟信号的特性。 二、实验原理 运用Quartus II 集成环境下的VHDL文本设计方法设计简单时序电路——D触发器&#xff0c;依据…

ABC363 题解

ABC363 题解 A - Piling Up (模拟) 题意&#xff1a; 输入一个数字&#xff0c;数字介于 1 1 1- 99 99 99显示了一次^, 100 100 100- 199 199 199显示了^两次…增加显示的所需的最小的评分增幅 分析&#xff1a; 算比次数字大且为 100 100 100的倍数的最小值减此数字 代码…

三相PWM整流器滞环电流控制仿真matlab simulink

1、内容简介 略 88-可以交流、咨询、答疑 2、内容说明 略 三相&#xff30;&#xff37;&#xff2d;整流器已广泛应用工业与电气控制领域电流控制技术决定着三相&#xff30;&#xff37;&#xff2d;整流器系统的控制性能。综合比 较了各种电流控制方法应用较多的滞环比较…

C++ 类和对象 构造函数(下)

一 初始化列表&#xff1a; 1.1 构造函数体赋值&#xff1a; 在C中&#xff0c;构造函数用于创建对象并赋予其初始值。通常&#xff0c;我们可以在构造函数体内对成员变量进行赋值&#xff1a; class Date { public:Date(int year, int month, int day) {_year year;_mont…

golang 解压带密码的zip包

目录 Zip文件详解ZIP 文件格式主要特性常用算法Zip格式结构图总览Zip文件结构详解数据区本地文件头文件数据文件描述 中央目录记录区&#xff08;核心目录记录区 &#xff09;中央目录记录尾部区 压缩包解压过程方式1 通过解析中央目录区来解压方式2 通过读取本地文件头来解压两…

Java 环境配置——Java 语言的安装、配置、编译与运行

引言 Java 作为全球最广泛使用的编程语言之一&#xff0c;其强大的跨平台特性和丰富的生态系统&#xff0c;使其在企业级应用、移动开发、大数据处理等领域具有重要地位。正确配置 Java 开发环境是每一个 Java 开发者的必备技能。本文将详细介绍如何在不同操作系统上安装、配置…

CentOS7中的yum命令不可用,网络不可达

前言 我也搜了大量的文章&#xff0c;基本上都是 输入 vi /etc/sysconfig/network-scripts/ifcfg-ens33 (这个ens33 是上面图片对应的以太网卡的名称&#xff0c;有的可能是ifcfg-eth0) 将 ONBOOTno 改为 ONBOOTyes以及其他方法&#xff0c;但是都没用。 解决 具体原因我也…

Wpf和Winform使用devpress控件库导出Excel并调整报表样式

Wpf和Winform使用devpress控件库导出Excel并调整报表样式 背景 客户需求经常需要出各种报表&#xff0c;部分客户对报表的样式有要求。包括颜色、字体、分页等等。 代码 使用Datagridview导出excel调整样式 DevExpress.XtraGrid.Views.Grid.GridView gdv #region GridView…

2024“钉耙编程”杭电多校1006 序列立方(思维+前缀和优化dp)

来源 题目 Problem Description 给定长度为 N 的序列 a。 一个序列有很多个子序列&#xff0c;每个子序列在序列中出现了若干次。 小马想请你输出序列 a 每个非空子序列出现次数的立方值的和&#xff0c;答案对 998244353 取模。 你可以通过样例解释来辅助理解题意。 Input 第…

[言简意赅] Matlab生成FPGA端rom初始化文件.coe

&#x1f38e;Matlab生成FPGA端rom初始化文件.coe 本文主打言简意赅。 函数源码 function gencoeInitialROM(width, depth, signal, filepath)% gencoeInitialROM - 生成 Xilinx ROM 初始化格式的 COE 文件%% 输入参数:% width - ROM 数据位宽% depth - ROM 数据深度% s…

heic文件怎么转换成jpg?上百份文件转换3秒就能搞定(办公必备)

heic和jpg是两种不同的图片格式&#xff0c;平时整理图片素材时&#xff0c;如果需要将heic转为jpg格式&#xff0c;那么可以使用相关的heic图片转换工具。 ​ 为什么要将heic文件转换成jpg&#xff1f;虽然HEIC格式具有很多优点&#xff0c;但是目前并不是所有设备和应用程序…

好玩模拟游戏推荐:缺氧:眼冒金星 单机游戏分享

《缺氧》 是一款太空殖民模拟游戏。 在外太空岩深处&#xff0c;你手下的勤劳开拓者们需要熟练掌握科技&#xff0c;战胜新的陌生生命形式&#xff0c;以及利用难以置信的太空技术来生存。甚至&#xff0c;还有可能繁荣起来。 建立广阔的基地以及探索生存所需的资源&#xff1…

服务攻防_01数据库安全RedisCouchdbH2database

一、数据库-Redis-未授权RCE&CVE 1、未授权访问&#xff1a;CNVD-2015-07557 &#xff08;1&#xff09;漏洞描述 Redis默认情况下会绑定在6379端口 如果没有采取相关策略&#xff08;如添加防火墙规则阻止非信任来源IP访问&#xff09;&#xff0c;会将Redis暴露在公网…

设计模式(工厂模式,模板方法模式,单例模式)

单例模式&#xff1a; 确保一个类只有一个实例&#xff0c;并提供全局访问点。 单例模式举例&#xff1a; 配置信息类&#xff1a;用于存储应用程序的全局配置信息&#xff0c;例如数据库连接信息、日志配置等。 日志类&#xff1a;用于记录应用程序运行时的日志信息&#x…

HTML5实现好看的天气预报网站源码

文章目录 1.设计来源1.1 获取天气接口1.2 PC端页面设计1.3 手机端页面设计 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_4…

揭秘电子画册制作流程,打造独一无二的作品

在这个数字化的时代&#xff0c;电子画册已经成为了展示个人创意和品牌形象的重要工具。它不仅能够呈现出丰富多彩的内容&#xff0c;还能够实现互动性和传播性&#xff0c;吸引众多观众的目光。然而&#xff0c;许多人对于电子画册的制作流程仍然感到陌生。本文将揭秘电子画册…

企业VR展厅如何提升品牌形象,生动展示产品和企业文化?

一、提升产品展示效果 1、全方位展示产品细节 企业VR展厅可以通过3D建模和虚拟现实技术&#xff0c;将产品的每一个细节清晰地展示出来。客户可以全方位查看产品的外观、结构和功能。这种身临其境的体验远比传统的平面展示更加生动和详细。 细节展示&#xff1a;客户可以通过…

Ubuntu22 Qt6.6 ROS 环境搭建

Ubuntu22.04; Qt6.6; Qt Creator 13.01; ROS2 1. 安装 Qt ROS 插件 1.下载地址&#xff1a; https://github.com/ros-industrial/ros_qtc_plugin/releases 选择对应 Qt Creator 版本的安装包。 2. Qt Creator中&#xff0c;“Help - 关于插件”–>“install Plugin…

一个模板实现的工厂的编译问题的解决。牵扯到重载、特化等

简介 在一个项目里&#xff0c;调用了第三封的库&#xff0c;这个库里面有个类用的很多&#xff0c;而且其构造函数至少有6个&#xff0c;并且个人感觉还不够多。根据实际使用&#xff0c;还得增加一些。 需求 1、增加构造函数&#xff0c;比如除了下面的&#xff0c;还增加…