SLRC400程序设计.docx

上传人:b****6 文档编号:9096975 上传时间:2023-02-03 格式:DOCX 页数:18 大小:16.75KB
下载 相关 举报
SLRC400程序设计.docx_第1页
第1页 / 共18页
SLRC400程序设计.docx_第2页
第2页 / 共18页
SLRC400程序设计.docx_第3页
第3页 / 共18页
SLRC400程序设计.docx_第4页
第4页 / 共18页
SLRC400程序设计.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

SLRC400程序设计.docx

《SLRC400程序设计.docx》由会员分享,可在线阅读,更多相关《SLRC400程序设计.docx(18页珍藏版)》请在冰豆网上搜索。

SLRC400程序设计.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 法学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1