OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5312|回复: 1

STM32 RC522 跳不出复位程序,大家帮忙看看

[复制链接]

81

主题

270

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
452
金钱
452
注册时间
2014-8-11
在线时间
87 小时
发表于 2015-4-22 15:30:51 | 显示全部楼层 |阅读模式
5金钱
/////////////////////////////////////////////////////////////////////
//功    能:复位RC522
//返    回: 成功返回MI_OK
/////////////////////////////////////////////////////////////////////
char PcdReset(void)
{
    u8 regvalue;
    u8 reg_value[2];

        //PORTD|=(1<<RC522RST);
        RC522_RESET_SET();
    delay_us(10);
        //PORTD&=~(1<<RC522RST);
        RC522_RESET_RESET();
    delay_ms(60);
        //PORTD|=(1<<RC522RST);
        RC522_RESET_SET();
    delay_us(500);

    WriteRawRC(CommandReg,PCD_TRANSMIT);
    delay_ms(2);
    regvalue=ReadRawRC(CommandReg)&0x0F;
    //sprintf((char*)a,"result:%04x",i);
    LCD_ShowCmd(regvalue);

    delay_ms(2);

    WriteRawRC(ModeReg,0x3D);            //和Mifare卡通讯,CRC初始值0x6363
    WriteRawRC(TReloadRegL,30);          //定时器的低8位数据
    WriteRawRC(TReloadRegH,0);                         //定时器的高8位数据
    WriteRawRC(TModeReg,0x8D);                         //定时器模式寄存器,定时器减值计数
    WriteRawRC(TPrescalerReg,0x3E);                 //实际值是OXD3E,这部分主要是设置定时器寄存器
    //ClearBitMask(TestPinEnReg,0x80);
    WriteRawRC(TxAutoReg,0x40);//必须要,设置逻辑1,强制100%ASK调制*/

    delay_ms(2);
//以下这段程序是我为了方便调试,把之前设置的寄存器值显示到LCD
    regvalue=ReadRawRC(ModeReg);
    sprintf((char*)reg_value,"Mode:%04x",regvalue);
    LCD_ShowRegValue(130,reg_value);
    regvalue=ReadRawRC(TReloadRegL);
    sprintf((char*)reg_value,"TReloadRegL:%04x",regvalue);
    LCD_ShowRegValue(150,reg_value);
    regvalue=ReadRawRC(TReloadRegH);
    sprintf((char*)reg_value,"TReloadRegH:%04x",regvalue);
    LCD_ShowRegValue(170,reg_value);
    regvalue=ReadRawRC(TModeReg);
    sprintf((char*)reg_value,"TModeReg:%04x",regvalue);
    LCD_ShowRegValue(190,reg_value);
    regvalue=ReadRawRC(TPrescalerReg);
    sprintf((char*)reg_value,"TPrescalerReg:%04x",regvalue);
    LCD_ShowRegValue(210,reg_value);
    regvalue=ReadRawRC(TxAutoReg);
    sprintf((char*)reg_value,"TxAutoReg:%04x",regvalue);
    LCD_ShowRegValue(230,reg_value);
//点亮一个led是为了看程序是否在这里还往下走
    GPIO_ResetBits(GPIOB,GPIO_Pin_5);
    GPIO_SetBits(GPIOE,GPIO_Pin_5);

    return MI_OK;
}
用上面这个程序测试发现执行正常,但是在main中之后调用的程序就不执行了
然后我把lcd显示的那一段注释掉了,如下
char PcdReset(void)
{
    u8 regvalue;
    u8 reg_value[2];

        //PORTD|=(1<<RC522RST);
        RC522_RESET_SET();
    delay_us(10);
        //PORTD&=~(1<<RC522RST);
        RC522_RESET_RESET();
    delay_ms(60);
        //PORTD|=(1<<RC522RST);
        RC522_RESET_SET();
    delay_us(500);

    WriteRawRC(CommandReg,PCD_TRANSMIT);
    delay_ms(2);
    regvalue=ReadRawRC(CommandReg)&0x0F;
    //sprintf((char*)a,"result:%04x",i);
    LCD_ShowCmd(regvalue);

    delay_ms(2);

    WriteRawRC(ModeReg,0x3D);            //和Mifare卡通讯,CRC初始值0x6363
    WriteRawRC(TReloadRegL,30);          //定时器的低8位数据
    WriteRawRC(TReloadRegH,0);                         //定时器的高8位数据
    WriteRawRC(TModeReg,0x8D);                         //定时器模式寄存器,定时器减值计数
    WriteRawRC(TPrescalerReg,0x3E);                 //实际值是OXD3E,这部分主要是设置定时器寄存器
    //ClearBitMask(TestPinEnReg,0x80);
    WriteRawRC(TxAutoReg,0x40);//必须要,设置逻辑1,强制100%ASK调制*/

    delay_ms(2);
//以下这段程序是我为了方便调试,把之前设置的寄存器值显示到LCD
    /*regvalue=ReadRawRC(ModeReg);
    sprintf((char*)reg_value,"Mode:%04x",regvalue);
    LCD_ShowRegValue(130,reg_value);
    regvalue=ReadRawRC(TReloadRegL);
    sprintf((char*)reg_value,"TReloadRegL:%04x",regvalue);
    LCD_ShowRegValue(150,reg_value);
    regvalue=ReadRawRC(TReloadRegH);
    sprintf((char*)reg_value,"TReloadRegH:%04x",regvalue);
    LCD_ShowRegValue(170,reg_value);
    regvalue=ReadRawRC(TModeReg);
    sprintf((char*)reg_value,"TModeReg:%04x",regvalue);
    LCD_ShowRegValue(190,reg_value);
    regvalue=ReadRawRC(TPrescalerReg);
    sprintf((char*)reg_value,"TPrescalerReg:%04x",regvalue);
    LCD_ShowRegValue(210,reg_value);
    regvalue=ReadRawRC(TxAutoReg);
    sprintf((char*)reg_value,"TxAutoReg:%04x",regvalue);
    LCD_ShowRegValue(230,reg_value);*/
//点亮一个led是为了看程序是否在这里还往下走
    GPIO_ResetBits(GPIOB,GPIO_Pin_5);
    GPIO_SetBits(GPIOE,GPIO_Pin_5);

    return MI_OK;
}
这样main运行就正常了
int main(void)
{
//    u8 i;
    u8 Card_Type1[2];
//    u8 regvalue;
//    u8 reg_value[2];                                   //卡类型
//    u8 Card_ID[4];                                       //卡序列号
//    u8 Card_KEY[6] = {0xff,0xff,0xff,0xff,0xff,0xff};  //卡密码  //{0x11,0x11,0x11,0x11,0x11,0x11};
//    u8 Card_Data[16];                                   //卡数据
//    u8 status;
    delay_init();
    NVIC_Configuration();
    uart_init(9600);
    LED_Init();
    LCD_Init();
    BEEP_Init();
//    u16 a=0x0000;
    BACK_COLOR=WHITE;
    OINT_COLOR=RED;
    LCD_ShowString(50,70,200,16,16,"RFIDMFRC522");
    LCD_ShowString(50,90,200,16,16,"CardType:");

    //LED0=1;
    //LED1=0;
    GPIO_SetBits(GPIOB,GPIO_Pin_5);//指示灯熄灭
    GPIO_SetBits(GPIOE,GPIO_Pin_5);
    delay_ms(10000);

    RC522_IO_Init();     //IO定义
    cdReset();          //复位RC522
 //不注释LCD显示那一块下面的就不执行了,一直在PcdReset()里面
    cdAntennaOff();     //关闭天线
    delay_ms(10000);
    cdAntennaOn();         //打开天线
...................................................}

void LCD_ShowRegValue(u16 x_location,u8 *value)
{
     LCD_ShowString(50,x_location,200,16,16,value);
}//显示寄存器的值正常显示的
  

我是一只菜鸟,但我会大鹏展翅
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

81

主题

270

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
452
金钱
452
注册时间
2014-8-11
在线时间
87 小时
 楼主| 发表于 2015-4-22 16:06:47 | 显示全部楼层
进一步测试发现哪个函数添加语句
regvalue=ReadRawRC(。。。);
sprintf((char*)reg_value,"。。。。:%04x",regvalue);
LCD_ShowRegValue(230,reg_value);
哪个函数就跳不出去
我是一只菜鸟,但我会大鹏展翅
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-23 12:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表