目录
1 任务指导
2 实验步骤
3 串口调试
4 USART配置
5 fputs函数重写
内 容:能够读取RFID卡S50的ID——编程实现串口数据收发
学 时:3学时
知识点:电路图设计、USART配置
重点: USART配置
难点:USART配置
时间:2022年12月22日 13:30~16:20
1 任务指导
使用MFRC522读卡器读取S50卡的ID号,并显示在12864液晶上。
2 实验步骤
MFRC522读卡器和开发板的硬件接线,如图1-2所示,上图为电路图,下图为实物图。
图1-1 MFRC522硬件电路
图1-2 MFRC522读卡器电路图和实物图
读卡器和开发板进行连接,连接方式如图1-3所示。
图1- 3 读卡器与开发板连接方式
MFRC522是高度集成的非接触式(13.56MHz)读卡芯片。此发送模块利用调制和解调的原理,并将它们完全集成到各种非接触式通信方法和协议中。
MFRC522的发送模块支持ISO 14443A/MIFARE协议。
MFRC522的内部发送器部分可以驱动读卡器天线与ISO 14443A/MIFARE卡和应答机的通信,无需其他的电路。接收器部分提供一个功能强大和高效的解调和译码电路,用来处理兼用ISO 1443A/MIFARE的卡和应答机的信号。数字电路部分处理完整的ISO1443A/MIFARE帧和错误检测。MFRC522支持MFARE更高速的非接触式通信,双向数据传输速率高达424Kbit/s。可以实现各种不同主机接口的功能:
(1)SPI接口
(2)串行UART接口
(3)I2C接口
不同类型的接口连接方法如图1-4所示。
图1-4 不同类型接口的连接方法
开发板有专门的SPI接口,用于外接MFRC522。所以,本实验采用的是SPI接口,如图1-1所示。关于MFRC522的详细资料可以参考MFRC522中文手册。
软件实现步骤。下图1-5是读写流程。
图1-5 读写流程
3 串口调试
为了模拟RFID数据通讯添加串口输出数据电路,通过查询数据手册,确定PA9引脚对应有USART1_TX(发送)功能。在proteus中添加虚拟终端,将虚拟终端的RXD(接收)引脚接与单片机引脚PA9连接。电路设计如图4。
图4 串口输出数据电路设计
4 USART配置
在main.c中编写USART的配置函数,调用库函数配置USART相关参数,在配置参数之前,需要调用时钟使能函数对GPIOA、AFIO、USART的端口时钟进行使能。GPIO_InitTypeDef及USART_InitTypeDef结构体包含了GPIO和USART所需配置的参数,因此参数配置主要是调用GPIO_InitTypeDef及USART_InitTypeDef对其内部的元素进行配置。代码如下:
void usart_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1, ENABLE);
// PA9 -> Tx
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
// USART
USART_InitStruct.USART_BaudRate = 9600;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode = USART_Mode_Tx;
USART_Init(USART1, &USART_InitStruct);
USART_Cmd(USART1, ENABLE);
}
5 fputs函数重写
重写串口发送函数,代码如下:
int fputc(int ch, FILE *f)
{
USART_SendData(USART1, (uint8_t)ch);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) != 1);
return ch;
}