|
本帖最后由 and001 于 2014-4-24 15:38 编辑
最近调试一个RFID软件:发现一个问题---就是读出来的值是“0”
我明明是将某个位已经置“1”了可是读出来还是“0”
为了简洁列出 主要函数
主要函数如下:
//初始化函数:
void MC522_Initial(void)
{
PcdReset();
PcdAntennaOff();
Delay_us(10000);
PcdAntennaOn();
Delay_us(10000);
M500PcdConfigISOType( 'A' );
}
/////////////////////////////////////////////////////////////////////
//复位RC522
//成功返回: MI_OK
/////////////////////////////////////////////////////////////////////
char PcdReset(void)
{
MF522_RST_H()
__NOP;
Delay_us(1);
MF522_RST_L()
__NOP;
Delay_us(1); MF522_RST_H()
__NOP;
Delay_us(1);
WriteRawRC(CommandReg,PCD_RESETPHASE); __NOP;
WriteRawRC(ModeReg,0x3D);
WriteRawRC(TReloadRegL,30);
WriteRawRC(TReloadRegH,0);
WriteRawRC(TModeReg,0x8D);
WriteRawRC(TPrescalerReg,0x3E);
WriteRawRC(TxAutoReg,0x40);
return MI_OK;
}
/////////////////////////////////////////////////////////////////////
//开启天线
//每次开启天线或者关闭天线时间间隔大于1mS
/////////////////////////////////////////////////////////////////////
void PcdAntennaOn()
{
unsigned char i;
i = ReadRawRC(TxControlReg);
printf("\n 先确认txcontrolreg= %d. \r\n ", i );
if (!(i & 0x03))
{
SetBitMask(TxControlReg, 0x03);
i = ReadRawRC(TxControlReg); //add by chen jian
printf("\n 再读出txcontrolreg= %d: \r\n ", i );
//问题点:刚写进去第三位为“1”,可是读出来还是“0”
}
}
/////////////////////////////////////////////////////////////////////
//读RC632寄存器的值
//返回读出值
/////////////////////////////////////////////////////////////////////
unsigned char ReadRawRC(unsigned char Address)
{
unsigned char i, ucAddr;
unsigned char ucResult=0;
MF522_SCK_L()
MF522_NSS_L()
Delay_us(1); //add by chen ji an
ucAddr = Address|0x80; // ucAddr = ((Address<<1)&0x7E)|0x80; //我自己修改部分,其实后面是没有改的语句也是不行
//特别说明下:我是认为第一个地址左移一次后值改变了,好像有点矛盾,所有自己改了下同时也满足读的时候第一个字节高位为“1”
for(i=8;i>0;i--)
{
// MF522_SI = ((ucAddr&0x80)==0x80);// 从51移植过来的,现在MCU是STM32
if ((ucAddr&0x80)==0x80)
MF522_SI_H()
else
MF522_SI_L()
MF522_SCK_H()
Delay_us(1); //add by chen ji an
ucAddr <<= 1;
MF522_SCK_L()
Delay_us(1); //add by chen ji an
}
for(i=8;i>0;i--)
{
MF522_SCK_H()
Delay_us(1); //add by chen ji an
ucResult <<= 1;
// ucResult|=MF522_SO; // ucResult|=(bit)MF522_SO; // 从51移植过来的,现在MCU是STM32
if( GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8)) ucResult|=0x01;
else ucResult&=~0x01;
MF522_SCK_L()
Delay_us(1);
}
MF522_NSS_H()
MF522_SCK_H()
return ucResult;
}
/////////////////////////////////////////////////////////////////////
//些RC632寄存器
//
/////////////////////////////////////////////////////////////////////
void WriteRawRC(unsigned char Address, unsigned char value)
{
unsigned char i, ucAddr;
MF522_SCK_L()
MF522_NSS_L()
Delay_us(1); //add by chen ji an
ucAddr = (Address&0x7F); // ucAddr = ((Address<<1)&0x7E); //我自己修改部分,其实后面是没有改的语句也是不行
//特别说明下:我是认为第一个地址左移一次后值改变了,好像有点矛盾,所有自己改了下同时也满足写的时候第一个字节高位为“0”
for(i=8;i>0;i--)
{
// MF522_SI = ((ucAddr&0x80)==0x80); // 从51移植过来的,现在MCU是STM32
if ((ucAddr&0x80)==0x80)
MF522_SI_H()
else
MF522_SI_L()
MF522_SCK_H()
Delay_us(1); //add by chen ji an
ucAddr <<= 1;
MF522_SCK_L()
Delay_us(1); //add by chen ji an
}
for(i=8;i>0;i--)
{
// MF522_SI = ((value&0x80)==0x80); // 从51移植过来的,现在MCU是STM32
if ((value&0x80)==0x80)
MF522_SI_H()
else
MF522_SI_L()
MF522_SCK_H()
Delay_us(1); //add by chen ji an
value <<= 1;
MF522_SCK_L()
Delay_us(1); //add by chen ji an
}
MF522_NSS_H()
MF522_SCK_H()
}
请有做过这个的高人帮忙指点!求救。。。
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|