历史上的今天
今天是:2025年01月29日(星期三)
2020年01月29日 | 基于STM8的RFID程序设计
2020-01-29 来源:eefocus
好久好久没有更新了~
现在开始在实习,正好公司最近在做一款宾馆用的插卡取电模块,用的是STM8配合RFID MFRC522模块实现的,国庆没事正好在淘宝上买了一款RFID模块,配合自己的STM8,体验一下。
MFRC522 模块使用了支持 SPI UART I2C,但是一般都使用SPI接口开发(难道是因为淘宝上的程序都是SPI?!)
MFRC522是个很有故事的芯片,因为打开它的数据手册,映入眼帘的是一大团寄存器,我去这尼玛是哪家新出的单片机,说好的芯片不就是几个引脚的故事吗!
不过好在这些寄存器的操作我们不用去了解,直接使用库函数即可。
关于接口

因此在我们移植程序的时候,需要将STM8的 SCK设置为输出 MOSI设置为输出 MISO设置为上拉输入 NSS设置为输出
关于SPI的通信原理

关于SPI的时序要求

STM8属于单周期单片机,时钟一般使用16Mhz,所以一个机器周期 1s/16 000 000 = 62.5 ns 所以说是符合SPI时序要求的。
关于复位
MFRC522要求复位脉宽至少100ns 然而从前面可以知道,STM8的机器周期是62.5ns虽然说实际上可能有出入,不过为了保险起见,我们在写复位程序的时候这么写
MF522_RST_SET(); //复位周期至少100 NS
asm("nop");
asm("nop");
asm("nop");
MF522_RST_CLR();
asm("nop");
asm("nop");
asm("nop");
MF522_RST_SET();
asm("nop");
asm("nop");
asm("nop");
已知asm("nop");是一个机器周期那么3个nop加上执行SRT/CLR语句的指令时间,就可以达到100ns的复位宽度。我觉得大了很多。。。
关于程序有毒
是的,这不是我手滑,真的有毒!
淘宝上的程序在改数值操作上面和备份操作上面是有毒的
而这个毒在该数值和备份上面是一样的,下面就已数值改写为例(扣款/充值)来说说
首先放程序(淘宝代码)

红框框里面就是有毒的地方,这里的功能是封装一个数据缓冲区修改数值的数组,发送给缓冲区,MFRC522会对所有指令返回一个确认值,这也是之前所有程序里面的校验方式,唯独在这里缓冲区的操作是不返回确认值的

这里说到卡片无返回,然而程序依旧进行了校验,这就导致了实际运行中卡在这里出不去的情况,于是注释掉以后强行忽略这个步骤。反正后面是用起来也没有发生数据错误的情况,我觉得更深入的解决方案还需要再学习。
说到这里MFRC522淘宝上51版本的源代码移植就算是完成了,下面就是配置主程序的串口以及定时器操作了,不过这不是我们今天的主角。就不多说了。RFID的只是还有很多,比如M1卡结构,控制字的使用。留待以后再说(主要是没人看)。

最后上一张模块大图
下一篇:stm8 TIM2 PWM配置
史海拾趣
|
该系统是当今先进的防盗报警系统,以求助、防盗融为一体,是现代家庭理想的保安器材。最适用于家庭、商铺的防盗报警。 探头发现盗情后,主机自动拨打您预存的电话号码(多至10个),如手机、固定电 ...… 查看全部问答> |
|
摘要: 在FPGA片内实现全数字锁相环用途极广。本文在集成数字锁相环74297的基础上进行改进,设计了锁相状态检测电路,配合CPU对环路滤波参数进行动态智能配置,从而使锁相环快速进入锁定状态,在最短时间内正常工作并且提高输出频率的质量。 关键词 ...… 查看全部问答> |
|
无意在网上找到的,因此把目录整理出来,有兄弟需要的发邮件给我yulzhu@gmail.com,注明需要哪一部分,直接发怕有些问题。 混合动力有关材料 Toyota Series - Hybrid Hybrid01 Hybrid System Overview.pdf Hybrid02 Hybrid System ...… 查看全部问答> |
|
WinCE里面做Win32应用程序,十分郁闷的就是其控件Z次序分配与VS里面完全相反,VS里面后创建的控件在前,但是在CE里面却是先创建的控件在前,造成很多不便,比如说要声明一个Group Button,再以这个Group Button作为父窗口在里面再创建 ...… 查看全部问答> |
|
win7 32位旗舰版安装Quartus II13.0时安到最后老是出错,请问有谁知道什么原因吗 win7 32位旗舰版安装Quartus II13.0时安到最后老是出错,请问有谁知道什么原因吗… 查看全部问答> |
|
使用tms320c6713的芯片,在ccs3.3环境下使用profile 来观察代码所在的range所消耗的时间情况,这段代码将1000个16bit的有符号整形转换为float型,函数内容如下所示 void dataFormatTrs(Int16 *input, float *output, int size) { in ...… 查看全部问答> |




