打印

求助啊!关于STM32驱动RC500读卡器问题

[复制链接]
4587|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
国防大学|  楼主 | 2013-7-20 17:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟最近在做从51上驱动RC500读卡器移植到STM32上的实验。
知道STM32是3.3V芯片,RC500是5V芯片.
硬件电路我是这样做的:
    使用RC500的独立读/写选通的复用地址总线的连接方式,使用STM32的5V兼容引脚加5V上拉电阻和RC500相连
    采用模拟总线的方式,底层相关驱动代码如下:
/**        
        *        @name                static void GPIO_Write1(u8 value)
  * [url=home.php?mod=space&uid=247401]@brief[/url]  GPIOBÒý½Å¸ß8λÊä³öÊý¾Ý
  * @param  value ÒªÊä³öµÄÊý¾Ý  
  * @retval None
  */
void GPIOB_Write1(u8 value)  
{
        RC500_Adress_Data_GPIO_Config(GPIO_Mode_Out_OD);//ÅäÖÃΪ¿ªÂ©Êä³ö
       
        GPIO_SetBits(GPIOB, (value<<8) & 0xffff);
        GPIO_ResetBits(GPIOB, (((~value)<<8) & 0xffff));
}

/**       
        *        @name                static void GPIO_Write1(u8 value)
  * @brief  ¶ÁÈ¡GPIOBÒý½Å¸ß8λÊý¾Ý
  * @param  None
  * @retval ·µ»Ø´ÓGPIOBÒý½Å¸ß8λ¶ÁÈ¡µÄÊý¾Ý
  */
u8 GPIOB_Read(void)
{
        u8 value = 0;
        u16 temp = 0;
       
        GPIOB_Write1(0XFF);
        Delay_1ms(1);
       
        RC500_Adress_Data_GPIO_Config(GPIO_Mode_IN_FLOATING);//ÅäÖÃΪ¸¡¿ÕÊäÈë
        Delay_1ms(1);
        temp = GPIO_ReadInputData(GPIOB);
        temp =(temp>>8);
        value = temp;
        return value;
}

/**       
        *        @name                static void WriteRawIO(u8 address,u8 value)
  * @brief  ÍùÒ»¸öµØַдһ¸öÊý¾Ý
  * @param  address µØÖ·
        *                                        value   Êý¾Ý
  * @retval None
  */
void WriteRawIO(u8 address,u8 value)
{
        RC500_ALE(0);
        RC500_NCS(1);
        RC500_NWR(1);
        RC500_ALE(1);

        GPIOB_Write1(address);//дµØÖ·

        RC500_ALE(0);
        RC500_NCS(0);
        GPIOB_Write1(value);//дÊý¾Ý
        RC500_NWR(0);
        __nop();
  RC500_NWR(1);
        RC500_NCS(1);
}

/**       
        *        @name                u8 ReadRawIO(u8 address)
  * @brief  ´ÓÒ»¸öµØÖ·¶ÁÒ»¸öÊý¾Ý
  * @param  address µØÖ·  
  * @retval ·µ»Ø¶Á³öµÄÊý¾Ý
  */
u8 ReadRawIO(u8 address)
{
        u8 value;

        RC500_ALE(0);
        RC500_NCS(1);
        RC500_NRD(1);
        RC500_ALE(1);
       
  GPIOB_Write1(address);//дµØÖ·
       
        RC500_ALE(0);
        RC500_NCS(0);
       
        __nop();
        Delay_1ms(1);
        RC500_NRD(0);
        value = GPIOB_Read();//¶Á³öÊý¾Ý
         
        RC500_NRD(1);
        RC500_NCS(1);

        return value;
}

/**       
        *        @name                void WriteIO(u8 address, u8 value)
  * @brief  ÍùRC500Ò»¸öµØַдһ¸öÊý¾Ý
  * @param  address µØÖ·  
                                                value                Êý¾Ý
  * @retval None
  */
void WriteIO(u8 address, u8 value)
{
        WriteRawIO(0x00,GetRegPage(address));  
        WriteRawIO(address,value);              
}

/**       
        *        @name                u8 ReadRawIO(u8 address)
  * @brief  ´ÓÒ»¸öµØÖ·¶ÁÒ»¸öÊý¾Ý
  * @param  address µØÖ·  
  * @retval ·µ»Ø¶Á³öµÄÊý¾Ý
  */
u8 ReadIO(u8 address)
{
   WriteRawIO(0x00,GetRegPage(address));
   return ReadRawIO(address);                    
}

/**       
        *        @name                char M500PcdReset(void)
  * @brief  RC500¸´Î»
  * @param  None
  * @retval ¸´Î»³É¹¦Ôò·µ»Ø0
  */
u8 M500PcdReset(void)
{
        u8 status = MI_OK;
        u16 timecnt=0;
       
        RC500_NCS(0);
        RC500_RST(0);  
        Delay_1ms(50);
        RC500_RST(1);  
        Delay_1ms(20);
        RC500_RST(0);
        RC500_NCS(0);       
        Delay_1ms(10);
       
        timecnt=3000;

        while ((ReadIO(RegCommand) & PCD_RESETPHASE) && timecnt--);//µÈ´ý³õʼ»¯²¢ÐнӿÚÀàÐͽ׶νáÊø

       
        if(!timecnt)
        {
                status = MI_RESETERR; //¸´Î»´íÎó
        }
        if (status == MI_OK)
        {
                WriteIO(RegPage,0x80);//½«0X80дÈëpage¼Ä´æÆ÷ÒÔ³õʼ»¯Î¢¿ØÖÆÆ÷½Ó¿Ú
                if (ReadIO(RegCommand) != 0x00)//¶ÁCommand¼Ä´æÆ÷£¬Èç¹ûֵΪ0Ôò½Ó¿Ú³õʼ»¯³É¹¦
                {      
                       
                        status = MI_INTERFACEERR;  //½Ó¿ÚÀàÐÍ´íÎó£¬Î¢¿ØÖÆÆ÷½Ó¿Ú³õʼ»¯²»³É¹¦
                }
        }

        return status;
}
但是复位不成功,测试为接口类型初始化错误(MI_INTERFACEERR)。望哪位大侠能给看一下,谢谢!
沙发
国防大学|  楼主 | 2013-7-20 17:35 | 只看该作者
自己先顶一下
对了,STM32的GPIOB 8-15连接RC500的AD0-AD15

PA11        NCS
PA12        NWR
PA13        NRD
PA14        ALE
PA15        RST

PA11        NCS
PA12        NWR
PA13        NRD
PA14        ALE
PA15        RST

PA11        NCS
PA12        NWR
PA13        NRD
PA14        ALE
PA15        RST
PA8        RC500IRQ

使用特权

评论回复
板凳
国防大学|  楼主 | 2013-7-20 17:39 | 只看该作者
:dizzy:4.7a的MDK老是这样,汉字不兼容

使用特权

评论回复
地板
hawksabre| | 2013-7-20 18:50 | 只看该作者
不是很了解   楼主  帮你顶一个  

使用特权

评论回复
5
国防大学|  楼主 | 2013-7-21 09:32 | 只看该作者
谢谢四楼
问题是接口类型初始化错误
哪位大神帮帮忙啊

使用特权

评论回复
6
trumpxp| | 2013-7-21 09:34 | 只看该作者
好长的代码   楼主   帮你顶一个   看看别人的意见吧   顶一个

使用特权

评论回复
7
jsll86| | 2013-7-21 12:18 | 只看该作者
不晓得,帮顶了

使用特权

评论回复
8
国防大学|  楼主 | 2013-7-23 17:53 | 只看该作者
要沉了吗??

使用特权

评论回复
9
xtay1215225| | 2013-9-10 11:13 | 只看该作者
我用rc522做的和stm32,现在能读写卡了,但还不是很完善。现在又重新修改rc522模块

使用特权

评论回复
10
fengsth| | 2014-5-5 22:13 | 只看该作者
楼主,我用RC632和stc90单片机做的读卡器,之间是并口通讯,用14443A协议(想用15693),目前在rc632初始化出错,求帮助

使用特权

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

本版积分规则

8

主题

54

帖子

1

粉丝