本帖最后由 ywlzh 于 2016-5-21 00:30 编辑
买的RFID模块,就是想试试无线控制的感觉,测试距离也就5到6CM就是极限了,再远点就扫描不到卡了,没有蓝牙用着爽快,也算是打开了RFID的一扇窗吧!原理图:
当中RST接的普通IO口,SDA(CS)也是接的普通IO口,SPI我个人用的SPI3,配置如下:
- GPIO_PinAFConfig(GPIOC,GPIO_PinSource12,GPIO_AF_SPI3);
- GPIO_PinAFConfig(GPIOC,GPIO_PinSource11,GPIO_AF_SPI3);
- GPIO_PinAFConfig(GPIOC,GPIO_PinSource10,GPIO_AF_SPI3);
- //这里只针对SPI口初始化
- RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3,ENABLE);//复位SPI3
- RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3,DISABLE);//停止复位SPI3
- MYRC522_CS = 1;
- SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
- SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI
- SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构
- SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //串行同步时钟的空闲状态为低电平
- SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //串行同步时钟的第一个跳变沿(上升或下降)数据被采样
- SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
- SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32; //定义波特率预分频的值:波特率预分频值为32
- SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
- SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式
- SPI_Init(SPI3, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
- SPI_Cmd(SPI3, ENABLE); //使能SPI外设
- SPIWriteByte(0xff);//启动传输
复制代码开发板是stm32f407。
RC522初始化需要将天线关闭,打开一次,然后就是将模式配置为ISO14443_A,其他模式还没有试过。
然后是对RC522的一套流程!
寻卡------> 防冲撞------> 选卡-----> 验证密码(四个扇区的初始密码是6个0xff)
这四步中的每一步会返回一个值,如果是0就操作正确,不是就需要好好看看,硬仿真试试。
这四步做完了就是读对应扇区的内容或者写对应扇区的内容或者重新写对应扇区的验证密码等等。
这之后有数据了,你想干嘛干嘛。
我将这个RCC模块的程序(亲自移植测试没有问题)分享出来,再加一个中文手册
RC_522.rar
(5.13 KB, 下载次数: 1611)
MF_RC522中文资料.pdf
(11.88 MB, 下载次数: 6078)
在移植之前,需要做个准备工作,自己要定义两个数组,一个有两个元素的数组,一个有四个元素的数组,uin8_t型就可以了,这两个数组一个是存放卡类型的数据,一个存放卡号的数据不是扇区数据,然后还要定义一个有6个元素的数组,存放验证密码(初始的值都为0xff),再定义些数组可以将读出的扇区数据存起来。