SLRC400程序设计.docx
《SLRC400程序设计.docx》由会员分享,可在线阅读,更多相关《SLRC400程序设计.docx(18页珍藏版)》请在冰豆网上搜索。
SLRC400程序设计
SLRC400程序设计
#include
#include
#include
#include"main.h"
#include"slrc400.h"
#include"iso15693.h"
unsignedcharxdataini_at_0x7f00;//movebaseaddress
to0x7f00
unsignedcharxdata*GpBase=&ini;//redirectpointerto
baseaddress
#defineReadRawIO(addr)(*(GpBase+addr))
#defineWriteRawIO(addr,value)*(GpBase+addr)=value;
externstructTranSciveBuffer{unsignedcharMfCommand;
unsignedintMfLength;
unsignedcharMfData[64];
};
///////////////////////////////////////////////////////////
//////////
//复位并初始化RC400
//注意:
RC400上电后应延时500ms才能可靠初始化
///////////////////////////////////////////////////////////
//////////
charPcdReset()
{
charstatus=MI_OK;
charn=0;
unsignedinti=2000;
RC400_RST=0;
DelayMs(50);
RC400_RST=1;
DelayMs(5);
RC400_RST=0;
while(i!
=0&&n!
=PCD_RESETPHASE)
{
n=ReadRawRC(RegCommand);
i--;
}
while(i!
=0&&n==PCD_RESETPHASE)
{
n=ReadRawRC(RegCommand);
i--;
}
if(i!
=0)
{
WriteRawRC(RegPage,0x80);
n=0x80;
while((i!
=0)&&(n&0x80))
{
n=ReadRawRC(RegCommand);
i--;
}
if(i==0||(n&0xFF))
{status=MI_RESETERR;}
}
else
{status=MI_RESETERR;}
if(status==MI_OK)
{WriteRawRC(RegPage,0x0);}
returnstatus;
}
///////////////////////////////////////////////////////////
///////////
//设置RC400的工作方式
///////////////////////////////////////////////////////////
///////////
charPcdConfigISOType()
{
ClearBitMask(RegControl,0x08);//
WriteRawRC(RegTxControl,0x58);//100%ASK
WriteRawRC(RegCwConductance,0x3f);//输出功率和操作
距离调整
WriteRawRC(RegModConductance,0x05);//mustbe
measuredfor15%ModulationIndex
WriteRawRC(RegCoderControl,0x2f);//2efast2f
//52.97kHz,1-256coding
WriteRawRC(RegModWidth,0x3F);//设置调制脉冲
宽度:
9.44us
WriteRawRC(RegModWidthSOF,0x3F);//设置SOF脉冲
宽度:
9.44us
//WriteRawRC(RegTypeBFraming,0x00);
WriteRawRC(RegRxControl1,0x8b);//控制接收:
电压增
益42db
WriteRawRC(RegDecoderControl,0x34);//c14);
WriteRawRC(RegBitPhase,0xad);//0xcd);//0xad);
//?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
WriteRawRC(RegRxThreshold,0x68);//c68);
//WriteRawRC(RegBPSKDemControl,0);
WriteRawRC(RegRxControl2,0x81);//c41);I时钟用作
接收器时钟
WriteRawRC(RegClockQControl,0x00);
WriteRawRC(RegRxWait,0x08);
WriteRawRC(RegChannelRedundancy,0x2C);//EnableCRC
TX/RX
WriteRawRC(RegCRCPresetLSB,0xFF);
WriteRawRC(RegCRCPresetMSB,0xFF);
WriteRawRC(RegTimeSlotPeriod,0x00);
WriteRawRC(RegSIGOUTSelect,0x00);//?
0X02//
enableSIGOUT=envelope
//WriteRawRC(RFU27,0x00);
WriteRawRC(RegFIFOLevel,0x38);
WriteRawRC(RegTimerClock,0x0B);
WriteRawRC(RegTimerReload,0x00);
WriteRawRC(RegTimerControl,0x02);//
TStopRxEnd=0,TStopRxBeg=1,
//WriteRawRC(RFU2E,0x00);
//WriteRawRC(RFU2F,0x00);
DelayMs
(1);
PcdAntennaOn();
returnMI_OK;
}
///////////////////////////////////////////////////////////
//////////
//读RC400寄存器位
//input:
Address=寄存器地址
//ouput:
读出的值
///////////////////////////////////////////////////////////
//////////
unsignedcharReadRawRC(unsignedcharAddress)
{
staticunsignedcharc;
c=ReadRawIO(Address);//readvalue
atthespecified
//address
returnc;
}
///////////////////////////////////////////////////////////
//////////
//写RC400寄存器
//input:
Address=寄存器地址
//value=要写入的值
///////////////////////////////////////////////////////////
//////////
voidWriteRawRC(unsignedcharAddress,unsignedcharvalue)
{
WriteRawIO(Address,value);
}
///////////////////////////////////////////////////////////
//////////
//置RC400寄存器位
//input:
reg=寄存器地址
//mask=置位值
///////////////////////////////////////////////////////////
//////////
voidSetBitMask(unsignedcharreg,unsignedcharmask)
{
chartmp=0x0;
tmp=ReadRawRC(reg);
WriteRawRC(reg,tmp|mask);//setbitmask
}
///////////////////////////////////////////////////////////
//////////
//清RC400寄存器位
//input:
reg=寄存器地址
//mask=清位值
///////////////////////////////////////////////////////////
//////////
voidClearBitMask(unsignedcharreg,unsignedcharmask)
{
chartmp=0x0;
tmp=ReadRawRC(reg);
WriteRawRC(reg,tmp&~mask);//clearbitmask
}
///////////////////////////////////////////////////////////
//////////
//通过RC400和ISO15693卡通讯
//input:
pi->MfCommand=RC400命令字
//pi->MfLength=发送的数据长度
//pi->MfData[]=发送数据
//output:
status=错误字
//pi->MfLength=接收的数据BIT长度
//pi->MfData[]=接收数据
///////////////////////////////////////////////////////////
//////////
charISO15693_Transceive(structTranSciveBuffer*pi)
{
bitrecebyte=0;
charstatus=MI_COM_ERR;
unsignedcharn,waitFor,TimerReload;
unsignedinti;
switch(pi->MfCommand)
{
casePCD_TRANSMIT:
waitFor=0x08;//0x10;
break;
default:
waitFor=0x28;
recebyte=1;
break;
}
/*
switch(pi->MfData[1])
{
caseISO15693_STAY_QUIET:
TimerReload=0x04;//2048/fc
=>0x01=151us
break;
caseISO15693_SELECT:
caseISO15693_RESET_TO_READY:
TimerReload=0x0F;//2048/fc
=>0x01=151us
break;
caseISO15693_LOCK_AFI:
caseISO15693_LOCK_DSFID:
caseISO15693_LOCK_BLOCK:
caseISO15693_WRITE_SINGLE_BLOCK:
caseISO15693_WRITE_MULTIPLE_BLOCKS:
caseISO15693_WRITE_AFI:
caseISO15693_WRITE_DSFID:
TimerReload=0x29;//2048/fc
=>0x01=151us
break;
caseISO15693_READ_SINGLE_BLOCK:
TimerReload=0x17;//2048/fc
=>0x01=151us
break;
caseISO15693_INVENTORY:
TimerReload=0x1F;//2048/fc
=>0x01=151us
break;
caseISO15693_GET_SYSTEM_INFO:
TimerReload=0x25;//2048/fc
=>0x01=151us
break;
caseISO15693_GET_MULTIPLE_BLOCK_SECURITY:
TimerReload=
0x40;//(0x04+(cmd[cmdlen-1]+0x01))*0x02+0x04+0x01;//
2048/fc=>0x01=151us
break;
//(0x04+cmd[cmdlen-1])*0x02->Time
forallreceivedBytes,0x04->Timebevoreandafterresponse,
0x01additional
caseISO15693_READ_MULTIPLE_BLOCKS:
TimerReload=
0x40;//(0x04+0x04*(cmd[cmdlen-1]+0x01))*0x02+0x04+0x01;
//2048/fc=>0x01=151us
break;
default:
TimerReload=0x86;//2048/fc=>
0x01=151us
break;
}
WriteRawRC(RegPage,0x00);
WriteRawRC(RegFIFOLevel,0x1A);
SetBitMask(RegChannelRedundancy,0x04);
WriteRawRC(RegTimerReload,TimerReload);
WriteRawRC(RegTimerControl,0x06);
*/
SetBitMask(RegControl,0x01);
WriteRawRC(RegCommand,0x00);
WriteRawRC(RegInterruptEn,0x81);
WriteRawRC(RegInterruptRq,0x3F);
WriteRawRC(RegInterruptEn,0x38|0x80);
for(i=0;iMfLength;i++)
{
WriteRawRC(RegFIFOData,pi->MfData[i]);
_nop_();_nop_();_nop_();_nop_();_nop_();
}
WriteRawRC(RegCommand,PCD_TRANSCEIVE);//start
tosendcommandtolabel
i=0xa000;
do
{
n=ReadRawRC(RegInterruptRq);
i--;
}while((i!
=0)&&!
(n&waitFor));//等待发送完毕
if(!
recebyte)
{
if(n&0x10)
{
status=MI_OK;
}
WriteRawRC(RegInterruptEn,0x10);
WriteRawRC(RegTimerControl,0x00);
WriteRawRC(RegCommand,PCD_IDLE);
ClearBitMask(RegCoderControl,0x80);
returnstatus;
}
else
{
if((i!
=0)&&(n&0x08))
{
if(!
(ReadRawRC(RegErrorFlag)&0x0C))
{
n=ReadRawRC(RegFIFOLength);
pi->MfLength=n*8;
for(i=0;i{
pi->MfData[i]=ReadRawRC(RegFIFOData);
_nop_();_nop_();_nop_();_nop_();_nop_();
}
if(pi->MfData[0]==0)//没有错误标志
{
status=MI_OK;
}
}
}
WriteRawRC(RegInterruptEn,0x10);
WriteRawRC(RegTimerControl,0x00);
WriteRawRC(RegCommand,PCD_IDLE);
ClearBitMask(RegCoderControl,0x80);
returnstatus;
}
}
///////////////////////////////////////////////////////////
//////////
//开启天线
//每次启动或关闭天险发射之间应至少有1ms的间隔
///////////////////////////////////////////////////////////
//////////
charPcdAntennaOn()
{
unsignedchari;
i=ReadRawRC(RegTxControl);
if(i&0x03)
{returnMI_OK;}
else
{
SetBitMask(RegTxControl,0x03);
returnMI_OK;
}
}
charISO15693_Transceive1(structTranSciveBuffer*pi)
{
bitrecebyte=0;
charstatus=MI_COM_ERR;
unsignedcharn,waitFor,TimerReload;
unsignedinti;
switch(pi->MfCommand)
{
casePCD_TRANSMIT:
waitFor=0x10;
break;
default:
waitFor=0x28;
recebyte=1;
break;
}
switch(pi->MfData[1])
{
caseISO15693_STAY_QUIET:
TimerReload=0x04;//2048/fc
=>0x01=151us
break;
caseISO15693_SELECT:
caseISO15693_RESET_TO_READY:
TimerReload=0x0F;//2048/fc
=>0x01=151us
break;
caseISO15693_LOCK_AFI:
caseISO15693_LOCK_DSFID:
caseISO15693_LOCK_BLOCK:
caseISO15693_WRITE_SINGLE_BLOCK:
caseISO15693_WRITE_MULTIPLE_BLOCKS:
caseISO15693_WRITE_AFI:
caseISO15693_WRITE_DSFID:
TimerReload=0x29;//2048/fc
=>0x01=151us
break;
caseISO15693_READ_SINGLE_BLOCK:
TimerReload=0x17;//2048/fc
=>0x01=151us
break;
caseISO15693_INVENTORY:
TimerReload=0x1F;//2048/fc
=>0x01=151us
break;
caseISO15693_GET_SYSTEM_INFO:
TimerReload=0x25;//2048/fc
=>0x01=151us
break;
caseISO15693_GET_MULTIPLE_BLOCK_SECURITY:
TimerReload=
0x40;//(0x04+(cmd[cmdlen-1]+0x01))*0x02+0x04+0x01;//
2048/fc=>0x01=151us
break;
//(0x04+cmd[cmdlen-1])*0x02->Time
forallreceivedBytes,0x04->Timebevoreandafterresponse,
0x01additional
caseISO15693_READ_MULTIPLE_BLOCKS:
TimerReload=
0x40;//(0x04+0x04*(cmd[cmdlen-1]+0x01))*0x02+0x04+0x01;
//2048/fc=>0x01=151us
break;
default:
TimerReload=0x86;//2048/fc=>
0x01=151us
break;
}
WriteRawRC(RegPage,0x00);
WriteRawRC(RegFIFOLevel,0x1A);
SetBitMask(RegChannelRedundancy,0x04);
WriteRawRC(RegTimerReload,TimerReload);
WriteRawRC(RegTimerControl,0x06);
SetBitMask(RegControl,0x01);
WriteRawRC(RegCommand,0x00);
WriteRawRC(RegInterruptEn,0x81);
WriteRawRC(RegInterruptRq,0x3F);
WriteRawRC(RegInterruptEn,0x38|0x80);
for(i=0;iMfLength;i++)
{
WriteRawRC(RegFIFOData,pi->MfData[i]);
_nop_();_nop_();_nop_();_nop_();_nop_();
}
WriteRawRC(RegCommand,PCD_TRANSCEIVE);//start
tosendcommandtolabel
i=0xa000;
do
{
n=ReadRawRC(RegInterruptRq);
i--;
}while((i!
=0)&&!
(n&waitFor));//等待发送完毕
if(!
recebyte)
{
if(n&0x10)
{
status=MI_OK;
}
WriteRawRC(RegIn