近期发现技术贴少了,苦于保密问题,也不好乱发。现在发一个STM32F2XX读取RC531的DEMO。
//------------------------------------------------------------------------------------------------------
extern void SPI1_Config(void);
extern unsigned char SPI1_ReadWriteByte(unsigned char TxData);
extern unsigned char Read_RC531_IRQ(void);
/* RC531RST 引脚 */
#define RC531RST_SET() RC531_RSTPD(1) /* 置 RC500RST 为高电平 */
#define RC531RST_CLR() RC531_RSTPD(0) /* 置 RC500RST 为低电平 */
/* RC531NSS 引脚 */
#define RC531NSS_SET() RC531_CS(1) /* 置 RC500RST 为高电平 */
#define RC531NSS_CLR() RC531_CS(0) /* 置 RC500RST 为低电平 */
//全局变量
static volatile MfCmdInfo MInfo;
volatile unsigned char SerBuffer[40];
static volatile MfCmdInfo *MpIsrInfo;
static volatile unsigned char *MpIsrOut;
volatile unsigned char MLastSelectedSnr[4];
//***********************************************************************
//以下代码为1uS的延时,用视波器调整的,很准,KEIL MDK编译,优化等级为0,频率120M
void tDelay_1us(unsigned int nDly){
register unsigned char n;
while(nDly--){
n = 22;
while(n--);
}
}
/****************************************************************************
* 名 称:DelayNS()
* 功 能:长软件延时。
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void delay_1ms(unsigned long dly){
tDelay_1us(8000); //1000us
}
/****************************************************************************
* 名 称:delay_50us()
* 功 能:长软件延时。
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void delay_50us(unsigned char _50us){
tDelay_1us(40); //50us
}
//*****************************************************************************
//不改动原来函数!必须传入数据
void ResetInfo(void){
memset((unsigned char *)&MInfo,0,sizeof( MInfo));
}
/****************************************************************************
* 名 称:ReadRawIO()
* 功 能:从一个地址读出一个数据(EEPROM)。
* 入口参数:Address 地址
* 出口参数:数据
****************************************************************************/
unsigned char ReadRawIO(unsigned char Address){
unsigned char a;
RC531NSS_CLR();
SPI1_ReadWriteByte((Address<<1)|0x80);
a = SPI1_ReadWriteByte(0xff); //亚指令!
SPI1_ReadWriteByte(0x00);
RC531NSS_SET();
return a;
}
/****************************************************************************
* 名 称:WriteRawIO()
* 功 能:往一个地址写一个数据(EEPROM)。
* 入口参数:Address 地址
value 数据
* 出口参数:无
****************************************************************************/
void WriteRawIO(unsigned char Address, unsigned char value){
RC531NSS_CLR();
SPI1_ReadWriteByte((Address<<1)&0x7f);
SPI1_ReadWriteByte(value);
RC531NSS_SET();
}
/****************************************************************************
* 名 称:WriteIO()
* 功 能:往一个地址写一个数据(EEPROM)。
* 入口参数:Address 地址
value 数据
* 出口参数:无
****************************************************************************/
void WriteIO(unsigned char Address, unsigned char value){
RC531NSS_CLR();
SPI1_ReadWriteByte(0x00);
SPI1_ReadWriteByte(GetRegPage(Address));
RC531NSS_SET();
RC531NSS_CLR();
SPI1_ReadWriteByte((Address<<1)&0x7f);
SPI1_ReadWriteByte(value);
RC531NSS_SET();
}
/****************************************************************************
* 名 称:ReadIO()
* 功 能:从一个地址读出一个数据(EEPROM)。
* 入口参数:Address 地址
* 出口参数:数据
****************************************************************************/
unsigned char ReadIO(unsigned char Address) {
unsigned char a;
RC531NSS_CLR();
SPI1_ReadWriteByte(0x00);
SPI1_ReadWriteByte(GetRegPage(Address));
RC531NSS_SET();
RC531NSS_CLR();
SPI1_ReadWriteByte((Address<<1)|0x80);
a = SPI1_ReadWriteByte(0xff); //亚指令!
SPI1_ReadWriteByte(0x00);
RC531NSS_SET();
return a;
}
/****************************************************************************
* 名 称:RFRegWrite()
* 功 能:往一个地址写一个数据(EEPROM)。
* 入口参数:Address 地址
value 数据
* 出口参数:无
****************************************************************************/
void RFRegWrite(unsigned char Address, unsigned char value){
RC531NSS_CLR();
SPI1_ReadWriteByte(0x00);
SPI1_ReadWriteByte(GetRegPage(Address));
RC531NSS_SET();
RC531NSS_CLR();
SPI1_ReadWriteByte((Address<<1)&0x7f);
SPI1_ReadWriteByte(value);
RC531NSS_SET();
}
/****************************************************************************
* 名 称:ReadIO()
* 功 能:从一个地址读出一个数据(EEPROM)。
* 入口参数:Address 地址
* 出口参数:数据
****************************************************************************/
unsigned char RFRegRead(unsigned char Address){
unsigned char a;
RC531NSS_CLR();
SPI1_ReadWriteByte(0x00);
SPI1_ReadWriteByte(GetRegPage(Address));
RC531NSS_SET();
RC531NSS_CLR();
SPI1_ReadWriteByte((Address<<1)|0x80);
a = SPI1_ReadWriteByte(0xff); //亚指令!
SPI1_ReadWriteByte(0x00);
RC531NSS_SET();
return a;
}
/****************************************************************************
* 名 称:SetBitMask()
* 功 能:清一个bit
* 入口参数:reg 内存
mask俺码
* 出口参数:无
****************************************************************************/
char SetBitMask(unsigned char reg,unsigned char mask){
char tmp = 0x00;
tmp = ReadIO(reg);
WriteIO(reg,tmp | mask); // set bit mask
return 0x00;
}
/****************************************************************************
* 名 称:ClearBitMask()
* 功 能:清一个bit
* 入口参数:reg 内存
mask俺码
* 出口参数:无
****************************************************************************/
char ClearBitMask(unsigned char reg,unsigned char mask){
char tmp = 0x00;
tmp = ReadIO(reg);
WriteIO(reg,tmp & ~mask); // clear bit mask
return 0x00;
}
/****************************************************************************
* 名 称:FlushFIFO()
* 功 能:清除内部FIFO
* 入口参数:无
* 出口参数:无
****************************************************************************/
void FlushFIFO(void){
SetBitMask(RegControl,0x01);
}
/****************************************************************************
* 名 称:M500PcdCmd()
* 功 能:清一个bit
* 入口参数:unsigned char cmd,
unsigned char *rcv,
MfCmdInfo idata *info
* 出口参数:0正常,其它错误码
****************************************************************************/
char M500PcdCmd(unsigned char cmd,
unsigned char *rcv,
MfCmdInfo *info){
char status = MI_OK;
unsigned char irqEn = 0x00;
unsigned char waitFor = 0x00;
unsigned int timecnt = 0;
char tmpStatus ;
unsigned char lastBits;
WriteIO(RegInterruptEn,0x7F); //开中断
WriteIO(RegInterruptRq,0x7F); //清中断
WriteIO(RegCommand,PCD_IDLE); //清除指令
FlushFIFO();
MpIsrInfo = info;
MpIsrOut = rcv;
info->irqSource = 0x00;
switch(cmd){
case PCD_IDLE: //0x00 无指令,清指令
irqEn = 0x00;
waitFor = 0x00;
break;
case PCD_WRITEE2: //0x01 写FIFO,并定入EEPROM
irqEn = 0x11;
waitFor = 0x10;
break;
case PCD_READE2: //0x03 从EEPROM取数据并写入FIFO
irqEn = 0x07;
waitFor = 0x04;
break;
case PCD_LOADCONFIG: //0x07 从EEPROM读数据并用于初始化
case PCD_LOADKEYE2: //0x0b 将密钥从EEPROM复制到KEY缓存
case PCD_AUTHENT1: //0x0c 执行Cryptol算法的认证过程
irqEn = 0x05;
waitFor = 0x04;
break;
case PCD_CALCCRC: //0x12 激活CRC
irqEn = 0x11;
waitFor = 0x10;
break;
case PCD_AUTHENT2: //0x14 执行Cryptol算法的认证过程二
irqEn = 0x04;
waitFor = 0x04;
break;
case PCD_RECEIVE: //0x16 接收
info->nBitsReceived = -(ReadIO(RegBitFraming) >> 4);
irqEn = 0x06;
waitFor = 0x04;
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
#define _RC531_H
//-------------------------------------------------------------------------------------------------------
#define RC531_CS1 (GPIO_Pin_2) //PA2
//********************************************************************************************************************
#define RC531_CS(x) ((x>0)? (GPIO_SetBits(GPIOA, RC531_CS1)) : (GPIO_ResetBits(GPIOA, RC531_CS1) ))//设置1,0
//-------------------------------------------------------------------------------------------------------
//IRQ 估计是用中断,请注意!!!!
#define RC531_IRQ1 (GPIO_Pin_1) //PA1
//********************************************************************************************************************
#define RC531_IRQ(x) ((x>0)? (GPIO_SetBits(GPIOA, RC531_IRQ1)) : (GPIO_ResetBits(GPIOA, RC531_IRQ1) ))//设置1,0
//-------------------------------------------------------------------------------------------------------
#define RC531_RSTPD1 (GPIO_Pin_3) //PA3
//********************************************************************************************************************
#define RC531_RSTPD(x) ((x>0)? (GPIO_SetBits(GPIOA, RC531_RSTPD1)) : (GPIO_ResetBits(GPIOA, RC531_RSTPD1) ))//设置1,0
//******************************************************************************
#define READER_ERR_BASE_START 0
#define MI_OK 0
#define MI_CHK_OK 0
#define MI_CRC_ZERO 0
#define MI_CRC_NOTZERO 1
#define MI_NOTAGERR 1
#define MI_CHK_FAILED 1
#define MI_CRCERR 2
#define MI_CHK_COMPERR 2
#define MI_EMPTY 3
#define MI_AUTHERR 4
#define MI_PARITYERR 5
#define MI_CODEERR 6
#define MI_SERNRERR 8
#define MI_KEYERR 9
#define MI_NOTAUTHERR 10
#define MI_BITCOUNTERR 11
#define MI_BYTECOUNTERR 12
#define MI_IDLE 13
#define MI_TRANSERR 14
#define MI_WRITEERR 15
#define MI_INCRERR 16
#define MI_DECRERR 17
#define MI_READERR 18
#define MI_OVFLERR 19
#define MI_POLLING 20
#define MI_FRAMINGERR 21
#define MI_ACCESSERR 22
#define MI_UNKNOWN_COMMAND 23
#define MI_COLLERR 24
#define MI_RESETERR 25
#define MI_INITERR 25
#define MI_INTERFACEERR 26
#define MI_ACCESSTIMEOUT 27
#define MI_NOBITWISEANTICOLL 28
#define MI_QUIT 30
#define MI_RECBUF_OVERFLOW 50
#define MI_SENDBYTENR 51
#define MI_SENDBUF_OVERFLOW 53
#define MI_BAUDRATE_NOT_SUPPORTED 54
#define MI_SAME_BAUDRATE_REQUIRED 55
#define MI_WRONG_PARAMETER_VALUE 60
#define MI_BREAK 99
#define MI_NY_IMPLEMENTED 100
#define MI_NO_MFRC 101
#define MI_MFRC_NOTAUTH 102
#define MI_WRONG_DES_MODE 103
#define MI_HOST_AUTH_FAILED 104
#define MI_WRONG_LOAD_MODE 106
#define MI_WRONG_DESKEY 107
#define MI_MKLOAD_FAILED 108
#define MI_FIFOERR 109
#define MI_WRONG_ADDR 110
#define MI_DESKEYLOAD_FAILED 111
#define MI_WRONG_SEL_CNT 114
#define MI_WRONG_TEST_MODE 117
#define MI_TEST_FAILED 118
#define MI_TOC_ERROR 119
#define MI_COMM_ABORT 120
#define MI_INVALID_BASE 121
#define MI_MFRC_RESET 122
#define MI_WRONG_VALUE 123
#define MI_VALERR 124
#define MI_SAKERR 0x46 //added by robbie
#define RegPage 0x00
#define RegCommand 0x01
#define RegFIFOData 0x02
#define RegPrimaryStatus 0x03
#define RegFIFOLength 0x04
#define RegSecondaryStatus 0x05
#define RegInterruptEn 0x06
#define RegInterruptRq 0x07
#define RegControl 0x09
#define RegErrorFlag 0x0A
#define RegCollPos 0x0B
#define RegTimerValue 0x0C
#define RegCRCResultLSB 0x0D
#define RegCRCResultMSB 0x0E
#define RegBitFraming 0x0F
#define RegTxControl 0x11
#define RegCwConductance 0x12
#define RFU13 0x13
#define RegModConductance 0x13 //驱动电导系数寄存器
#define RegCoderControl 0x14
#define RegModWidth 0x15
#define RFU16 0x16
#define RFU17 0x17
#define RegTypeBFraming 0x17 //TypeB帧设置寄存器
#define RegRxControl1 0x19
#define RegDecoderControl 0x1A
#define RegBitPhase 0x1B
#define RegRxThreshold 0x1C
#define RFU1D 0x1D
#define RegBPSKDemControl 0x1D //BPSK解调控制寄存器
#define RegRxControl2 0x1E
#define RegClockQControl 0x1F
#define RegRxWait 0x21
#define RegChannelRedundancy 0x22
#define RegCRCPresetLSB 0x23
#define RegCRCPresetMSB 0x24
#define RFU25 0x25
#define RegMfOutSelect 0x26
#define RFU27 0x27
#define RegFIFOLevel 0x29
#define RegTimerClock 0x2A
#define RegTimerControl 0x2B
#define RegTimerReload 0x2C
#define RegIRqPinConfig 0x2D
#define RFU2E 0x2E
#define RFU2F 0x2F
#define RFU31 0x31
#define RFU32 0x32
#define RFU33 0x33
#define RFU34 0x34
#define RFU35 0x35
#define RFU36 0x36
#define RFU37 0x37
#define RFU39 0x39
#define RegTestAnaSelect 0x3A
#define RFU3B 0x3B
#define RFU3C 0x3C
#define RegTestDigiSelect 0x3D
#define RFU3E 0x3E
#define RegTestDigiAccess 0x3F
#define DEF_FIFO_LENGTH 64
#define PCD_IDLE 0x00
#define PCD_WRITEE2 0x01
#define PCD_READE2 0x03
#define PCD_LOADCONFIG 0x07
#define PCD_LOADKEYE2 0x0B
#define PCD_AUTHENT1 0x0C
#define PCD_CALCCRC 0x12
#define PCD_AUTHENT2 0x14
#define PCD_RECEIVE 0x16
#define PCD_LOADKEY 0x19
#define PCD_TRANSMIT 0x1A
#define PCD_TRANSCEIVE 0x1E
#define PCD_RESETPHASE 0x3F
#define PICC_REQIDL 0x26
#define PICC_REQALL 0x52
#define PICC_ANTICOLL1 0x93
#define PICC_ANTICOLL2 0x95
#define PICC_ANTICOLL3 0x97
#define PICC_AUTHENT1A 0x60
#define PICC_AUTHENT1B 0x61
#define PICC_READ 0x30
#define PICC_WRITE 0xA0
#define PICC_DECREMENT 0xC0
#define PICC_INCREMENT 0xC1
#define PICC_RESTORE 0xC2
#define PICC_TRANSFER 0xB0
#define PICC_HALT 0x50
#define mifare1 1
#define mifarepro 2
#define mifarelight 3
#define unkowncard 4
#define GetRegPage(addr) (0x80 | (addr>>3))
typedef struct {
unsigned char cmd;
char status;
unsigned char nBytesSent;
unsigned char nBytesToSend;
unsigned char nBytesReceived;
unsigned short nBitsReceived;
unsigned char irqSource;
unsigned char collPos;
} MfCmdInfo;
//#define ResetInfo(info) (info.cmd= 0; info.status= MI_OK; info.irqSource = 0;info.nBytesSent = 0; info.nBytesToSend= 0;info.nBytesReceived = 0; info.nBitsReceived = 0;info.collPos= 0;)
#endif
/****************************************************************************
* 名 称:Rc500Init
* 功 能:外部中断的初始化。
* 入口参数:无
* 出口参数:0正常,其它错误码
****************************************************************************/
extern unsigned char Rc500Init(void);
///////////////////////////////////////////////////////////////////////
// 14443-3函数
///////////////////////////////////////////////////////////////////////
/****************************************************************************
* 名 称:fine
* 功 能:寻卡
* 入口参数:req_code 寻卡指令 request code ALL = 0x52 or IDLE = 0x26
agq 返回卡类型
* 出口参数:0正常,其它错误码
****************************************************************************/
extern char fine(unsigned char req_code,unsigned char *atq) ;
/****************************************************************************
* 名 称:CascAnticoll
* 功 能:防碰撞
* 入口参数:bcnt 0
snr 卡序列号
* 出口参数:0正常,其它错误码
****************************************************************************/
extern char CascAnticoll(unsigned char bcnt,unsigned char *snr);
/****************************************************************************
* 名 称:SelectTag
* 功 能:选技卡
* 入口参数:snr 卡序列号
返回值
* 出口参数:0正常,其它错误码
****************************************************************************/
extern char SelectTag(unsigned char *snr, unsigned char *sak);
/****************************************************************************
* 名 称:Fine_Card
* 功 能:寻卡,碰撞,选卡
* 入口参数:CardSN 卡序列号
cardtype 返回卡类型
* 出口参数:0正常
0x10,无卡,
0x11,碰撞失败
0x12,选卡失败
****************************************************************************/
extern unsigned char Fine_Card(unsigned char *CardSN,unsigned char *cardtype);
/****************************************************************************
* 名 称:ReadCard
* 功 能:读卡
* 入口参数:ReadData 卡数据
bank 块号
* 出口参数:0正常,其它错误码
****************************************************************************/
extern unsigned char ReadCard( unsigned char *ReadData,unsigned char bank);
/****************************************************************************
* 名 称:WriteCard
* 功 能:写卡
* 入口参数:WriteData 卡数据
bank 块号
* 出口参数:0正常,其它错误码
****************************************************************************/
extern unsigned char WriteCard(unsigned char *WriteData,unsigned char bank);
/****************************************************************************
* 名 称:M500PiccHalt
* 功 能:终止卡的操作
* 入口参数:无
* 出口参数:0正常,其它错误码
****************************************************************************/
extern char M500PiccHalt(void);
/****************************************************************************
* 名 称:DownloadPassWord
* 功 能:内部效验密码
* 入口参数:bank 所使用的块号
* 出口参数:0正常,其它错误码
****************************************************************************/
extern unsigned char DownloadPassWord(unsigned char bank);
/****************************************************************************
* 名 称:DownloadPassWord2
* 功 能:直接效验密码
* 入口参数:bank 所使用的块号
* 出口参数:0正常,其它错误码
****************************************************************************/
unsigned char DownloadPassWord2(unsigned char *password ,unsigned char bank);
/****************************************************************************
* 名 称:ChangePassWord
* 功 能:修改内部密码
* 入口参数:password 密码
bank 所使用的块号
* 出口参数:0正常,其它错误码
****************************************************************************/
extern unsigned char ChangePassWord(unsigned char *password,unsigned char bank);
///////////////////////////////////////////////////////////////////////
// 14443-4函数
///////////////////////////////////////////////////////////////////////
/****************************************************************************
* 名 称:PiccCMD14443_4
* 功 能:14443-4指令的发送与接收
* 入口参数:senddata 发送的数据
readdata 接收的数据
sendlen 发送的字节数
readlen 接收到的字节数
* 出口参数:0正常,,其它错误码
****************************************************************************/
extern char PiccCMD14443_4(unsigned char *senddata,unsigned char *readdata,unsigned char sendlen,unsigned char *readlen);
/****************************************************************************
* 名 称:Select_3f02()
* 功 能:外部中断EINT3服务函数,取反B1控制口。
* 入口参数:指令执行状态
* 出口参数:0正常,,其它错误码
****************************************************************************/
extern unsigned char Select_3f02(unsigned char *p);
/****************************************************************************
* 名 称:read_ls()
* 功 能:读历吏字节。
* 入口参数:olddata 历吏字节
* 出口参数:0正常,,其它错误码
****************************************************************************/
extern unsigned char read_ls(unsigned char *olddata);
/****************************************************************************
* 名 称:GetCardSN()
* 功 能:取卡序列号
* 入口参数:SN 卡序列号
* 出口参数:0正常,,其它错误码
****************************************************************************/
extern unsigned char GetCardSN(unsigned char *SN);
///////////////////////////////////////////////////////////////////////
// 14443-4函数
// 国家建设部消费协议
///////////////////////////////////////////////////////////////////////
/****************************************************************************
* 名 称:Cash_Withdraw()
* 功 能:消费初始化
* 入口参数:sn 终端编号
money 交易金额
passwordtype 密码类型
p 卡返回的数据
len 卡返回数据的长度
* 出口参数:0正常,,其它错误码
****************************************************************************/
extern unsigned char Cash_Withdraw( unsigned char *sn,//终端编号
unsigned char *money,//交易金额
unsigned char passwordtype,
unsigned char *p,
unsigned char *len);//消费初始?
/****************************************************************************
* 名 称:charCash_Withdraw2()
* 功 能:消费
* 入口参数:je_sn 义易序列号
je_data 交易日期
je_time 交易时间
mac1 MAC1
* 出口参数:0正常,,其它错误码
****************************************************************************/
extern unsigned char charCash_Withdraw2( unsigned char *je_sn,
unsigned char *je_data,
unsigned char *je_time,
unsigned char *mac1
);
/****************************************************************************
* 名 称:GetName()
* 功 能:取姓名
* 入口参数:name 名字
* 出口参数:0正常,,其它错误码
****************************************************************************/
extern unsigned char GetName( unsigned short *name );
/****************************************************************************
* 名 称:RC531_IRQ_Lib()
* 功 能:中断处理程序
* 入口参数:无
* 出口参数:无
内部处理全局变量 MInfo
****************************************************************************/
extern void RC531_IRQ_Lib(void);
//*************************************************************************
//读取IRQ的状态!!!!也可中断判别!!! 返回=1 已经有中断,=0 无!!!
unsigned char Read_RC531_IRQ(void);
/*
S0SPCCR = 128; 设置SPI时钟分频值为128
92.
93. S0SPCR = (0 << 3) | // CPHA = 0, 数据在SCK 的第一个时钟沿采样
94. (1 << 4) | // CPOL = 1, SCK 为低有效
95. (1 << 5) | // MSTR = 1, SPI 处于主模式
96. (0 << 6) | // LSBF = 0, SPI 数据传输MSB (位7)在先
97. (0 << 7); // SPIE = 0, SPI 中断被禁止
98.
*/
//******************************************************************************
#define SPIx_SCK_PIN GPIO_Pin_5
#define SPIx_SCK_SOURCE GPIO_PinSource5
#define SPIx_MISO_PIN GPIO_Pin_6
#define SPIx_MISO_SOURCE GPIO_PinSource6
#define SPIx_MOSI_PIN GPIO_Pin_7
#define SPIx_MOSI_SOURCE GPIO_PinSource7
#define SPIx_NSS_PIN GPIO_Pin_2
#define SPIx_NSS_SOURCE GPIO_PinSource2
//***************************************************************************
void SPI1_IO_Init(void){
GPIO_InitTypeDef GPIO_InitStructure;
/* SPI pin mappings */
GPIO_PinAFConfig(GPIOA, SPIx_SCK_SOURCE, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, SPIx_MOSI_SOURCE, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, SPIx_MISO_SOURCE, GPIO_AF_SPI1);
// GPIO_PinAFConfig(GPIOB, SPIx_NSS_SOURCE, GPIO_AF_SPI1);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
/* SPI SCK pin configuration */
GPIO_InitStructure.GPIO_Pin = SPIx_SCK_PIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* SPI MOSI pin configuration */
GPIO_InitStructure.GPIO_Pin = SPIx_MOSI_PIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* SPI MISO pin configuration */
GPIO_InitStructure.GPIO_Pin = SPIx_MISO_PIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* SPI NSS pin configuration */
// GPIO_InitStructure.GPIO_Pin = SPIx_NSS_PIN;
// GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = SPIx_NSS_PIN | RC531_RSTPD1; //RC531--两个片选
GPIO_Init(GPIOA, &GPIO_InitStructure);
RC531_CS(1);
RC531_RSTPD(1);
//** irq set input
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = RC531_IRQ1; //RC531--irq
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
//*************************************************************************
//读取IRQ的状态!!!!
unsigned char Read_RC531_IRQ(void){
return GPIO_ReadInputDataBit( GPIOA,RC531_IRQ1);
}
//***************************************************************************
void SPI1_Config(void){
SPI_InitTypeDef SPI_InitStructure;
/* Enable the SPI peripheral */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
//RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOC, ENABLE);
SPI1_IO_Init();
/* SPI configuration -------------------------------------------------------*/
//SPI_DeInit(SPI1);
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI1, ENABLE);
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI设置为双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//设置为主SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//设置SPI的数据大小:SPI发送接收8位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//选择了串行时钟的稳态:时钟悬空高
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//数据捕获于第二个时钟沿
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;//Fclk/2
/* Initialize the SPI_FirstBit member */
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial=7;
SPI_Init(SPI1, &SPI_InitStructure);
/* Enable SPI1 */
SPI_Cmd(SPI1, ENABLE);
}
/*******************************************************************************
* Function Name : SPI_ReadWriteByte
* Description : SPI读写一个字节(发送完成后返回本次通讯读取的数据)
* Input : unsigned char TxData 待发送的数
* Output : None
* Return : unsigned char RxData 收到的数
Flash_ReadWriteByte
*******************************************************************************/
unsigned char SPI1_ReadWriteByte(unsigned char TxData){
unsigned char RxData = 0;
//等待发送缓冲区空
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
//发一个字节
SPI_I2S_SendData(SPI1, TxData);
// while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
//等待数据接收
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
//取数据
RxData = SPI_I2S_ReceiveData(SPI1);
return (unsigned char)RxData;
}
/**********************************************************************
** 函数名称: main()
** 功能描述: 系统主函数
** 输 入: 无
** 输 出: 无
** 函数说明: 程序C语言接口
***********************************************************************/
void test_RC531( void ){
unsigned char aa[64];
unsigned char a;
// unsigned short b = 0x1234;
a=Rc500Init();
while(1){
if(Fine_Card(aa,&a)==0){
for( a = 0 ; a < 6 ; a++ ) aa[a] = 0xff;
if((a = DownloadPassWord2(aa,13))==0){
if(WriteCard(aa,13)==0){
if((a = ReadCard(aa,13))==0){ //查看A,AA的值
a=0;
}else{
a=a;
}
M500PiccHalt();
}
}else{
a=a;
}
}
Delay_1us(10000);
}
}
#endif
一周热门 更多>