打印
[STM32F4]

STM32例程+RFID-RC522门禁控制系统

[复制链接]
楼主: dingbo95
手机看帖
扫描二维码
随时随地手机跟帖
21
gaoke231| | 2017-9-29 21:40 | 只看该作者 回帖奖励 |倒序浏览
不错,楼主辛苦,支持下。

使用特权

评论回复
22
dingbo95|  楼主 | 2017-9-30 20:50 | 只看该作者
/////////////////////////////////////////////////////////////////////
//功    能:写RC632寄存器
//参数说明:Address[IN]:寄存器地址
//          value[IN]:写入的值
/////////////////////////////////////////////////////////////////////
void WriteRawRC(unsigned char Address, unsigned char value)
{  
    unsigned char i, ucAddr;

    MF522_SCK = 0;
    MF522_NSS = 0;
    ucAddr = ((Address<<1)&0x7E);

    for(i=8;i>0;i--)
    {
        MF522_SI = ((ucAddr&0x80)==0x80);
        MF522_SCK = 1;
        ucAddr <<= 1;
        MF522_SCK = 0;
                delay_us(10);           //STM32需要多加的延时时间。51的不需要加
    }

    for(i=8;i>0;i--)
    {
        MF522_SI = ((value&0x80)==0x80);
        MF522_SCK = 1;
        value <<= 1;
        MF522_SCK = 0;
                delay_us(10);         //STM32需要多加的延时时间。51的不需要加
    }
    MF522_NSS = 1;
    MF522_SCK = 1;
}

使用特权

评论回复
23
dingbo95|  楼主 | 2017-9-30 20:53 | 只看该作者
/////////////////////////////////////////////////////////////////////
//功    能:置RC522寄存器位
//参数说明:reg[IN]:寄存器地址
//          mask[IN]:置位值
/////////////////////////////////////////////////////////////////////
void SetBitMask(unsigned char reg,unsigned char mask)  
{
    char tmp = 0x0;
    tmp = ReadRawRC(reg);
    WriteRawRC(reg,tmp | mask);  // set bit mask
}

/////////////////////////////////////////////////////////////////////
//功    能:清RC522寄存器位
//参数说明:reg[IN]:寄存器地址
//          mask[IN]:清位值
/////////////////////////////////////////////////////////////////////
void ClearBitMask(unsigned char reg,unsigned char mask)  
{
    char tmp = 0x0;
    tmp = ReadRawRC(reg);
    WriteRawRC(reg, tmp & ~mask);  // clear bit mask
}

使用特权

评论回复
24
dingbo95|  楼主 | 2017-9-30 20:56 | 只看该作者
/////////////////////////////////////////////////////////////////////
//功    能:通过RC522和ISO14443卡通讯
//参数说明:Command[IN]:RC522命令字
//          pInData[IN]:通过RC522发送到卡片的数据
//          InLenByte[IN]:发送数据的字节长度
//          pOutData[OUT]:接收到的卡片返回数据
//          *pOutLenBit[OUT]:返回数据的位长度
/////////////////////////////////////////////////////////////////////
char PcdComMF522(unsigned char Command,
                 unsigned char *pInData,
                 unsigned char InLenByte,
                 unsigned char *pOutData,
                 unsigned int  *pOutLenBit)
{
    char status = MI_ERR;
    unsigned char irqEn   = 0x00;
    unsigned char waitFor = 0x00;
    unsigned char lastBits;
    unsigned char n;
    unsigned int i;
    switch (Command)
    {
       case PCD_AUTHENT:
          irqEn   = 0x12;
          waitFor = 0x10;
          break;
       case PCD_TRANSCEIVE:
          irqEn   = 0x77;
          waitFor = 0x30;
          break;
       default:
         break;
    }
   
    WriteRawRC(ComIEnReg,irqEn|0x80);
    ClearBitMask(ComIrqReg,0x80);
    WriteRawRC(CommandReg,PCD_IDLE);
    SetBitMask(FIFOLevelReg,0x80);
   
    for (i=0; i<InLenByte; i++)
    {   WriteRawRC(FIFODataReg, pInData[i]);    }
    WriteRawRC(CommandReg, Command);
   
   
    if (Command == PCD_TRANSCEIVE)
    {    SetBitMask(BitFramingReg,0x80);  }
   
    i = 600;//根据时钟频率调整,操作M1卡最大等待时间25ms
    do
    {
         n = ReadRawRC(ComIrqReg);
         i--;
    }
    while ((i!=0) && !(n&0x01) && !(n&waitFor));
    ClearBitMask(BitFramingReg,0x80);
             
    if (i!=0)
    {   
         if(!(ReadRawRC(ErrorReg)&0x1B))
         {
             status = MI_OK;
             if (n & irqEn & 0x01)
             {   status = MI_NOTAGERR;   }
             if (Command == PCD_TRANSCEIVE)
             {
                       n = ReadRawRC(FIFOLevelReg);
                      lastBits = ReadRawRC(ControlReg) & 0x07;
                if (lastBits)
                {   *pOutLenBit = (n-1)*8 + lastBits;   }
                else
                {   *pOutLenBit = n*8;   }
                if (n == 0)
                {   n = 1;    }
                if (n > MAXRLEN)
                {   n = MAXRLEN;   }
                for (i=0; i<n; i++)
                {   pOutData[i] = ReadRawRC(FIFODataReg);    }
            }
         }
         else
         {   status = MI_ERR;   }
        
   }
   

   SetBitMask(ControlReg,0x80);           // stop timer now
   WriteRawRC(CommandReg,PCD_IDLE);
   return status;
}

使用特权

评论回复
25
dingbo95|  楼主 | 2017-9-30 20:57 | 只看该作者
关于IC卡的天线操作需要用到下面连个函数。

使用特权

评论回复
26
dingbo95|  楼主 | 2017-9-30 20:59 | 只看该作者
/////////////////////////////////////////////////////////////////////
//开启天线  
//每次启动或关闭天险发射之间应至少有1ms的间隔
/////////////////////////////////////////////////////////////////////
void PcdAntennaOn()
{
    unsigned char i;
    i = ReadRawRC(TxControlReg);
    if (!(i & 0x03))
    {
        SetBitMask(TxControlReg, 0x03);
    }
}

使用特权

评论回复
27
sopc12| | 2017-10-20 15:27 | 只看该作者
不错啊。多谢分享

使用特权

评论回复
28
dingbo95|  楼主 | 2017-10-20 20:55 | 只看该作者
sopc12 发表于 2017-10-20 15:27
不错啊。多谢分享

相互学习,一起努力。

使用特权

评论回复
29
向北lm| | 2017-10-21 20:32 | 只看该作者
感谢分享

使用特权

评论回复
30
gyh974| | 2017-10-22 11:23 | 只看该作者

使用特权

评论回复
31
2205005| | 2017-10-30 20:14 | 只看该作者
谢谢大佬分享,好人啊

使用特权

评论回复
32
烟染染| | 2018-1-8 20:31 | 只看该作者
请问mfrc522 ,也可以用这个吗?

使用特权

评论回复
评论
dingbo95 2018-1-10 11:52 回复TA
没有试过,你可以试下 
33
hanny96| | 2018-5-9 15:49 | 只看该作者
我也是淘宝买的那种最常见的,因为没有Jlink所有没法串口助手调试,只能看RC522上的指示灯判别,好像要贴着感应区,指示灯才变化啊QAQ是这样吗?

使用特权

评论回复
34
qiangtech| | 2018-5-9 19:25 | 只看该作者
正好要搞这东西,谢谢分享。

使用特权

评论回复
35
dingbo95|  楼主 | 2018-6-13 09:28 | 只看该作者
烟染染 发表于 2018-1-8 20:31
请问mfrc522 ,也可以用这个吗?

应该可以的

使用特权

评论回复
36
dingbo95|  楼主 | 2018-6-13 09:29 | 只看该作者
qiangtech 发表于 2018-5-9 19:25
正好要搞这东西,谢谢分享。

不客气,这个只是比较简单的工程,需要开发项目还要另说。

使用特权

评论回复
37
dingbo95|  楼主 | 2018-6-13 09:29 | 只看该作者
2205005 发表于 2017-10-30 20:14
谢谢大佬分享,好人啊

就当学习下而已,这只是基础工程。

使用特权

评论回复
38
lasermiao| | 2018-8-7 18:27 | 只看该作者
楼主 你好  我下载的你的工程出现了警告  是我的软件出现了问题吗

使用特权

评论回复
39
dingbo95|  楼主 | 2018-8-19 19:46 | 只看该作者
lasermiao 发表于 2018-8-7 18:27
楼主 你好  我下载的你的工程出现了警告  是我的软件出现了问题吗

警告没事,只有没有错误即可。

使用特权

评论回复
40
zzzzzhuo| | 2018-9-25 16:44 | 只看该作者
请问如果有STM32的SPI外设,如何进行不用模拟的操作呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则