中级会员
 
- 积分
- 452
- 金钱
- 452
- 注册时间
- 2014-8-11
- 在线时间
- 87 小时
|
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);
}//显示寄存器的值正常显示的
|
|