⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rc531.c.txt

📁 C语言的 RC531
💻 TXT
📖 第 1 页 / 共 3 页
字号:
#ifndef _rc531_C_INCLUDED_ 
#define _rc531_C_INCLUDED_ 
//************************************************************************************** 
#include <msp430x13x.h> 
#include "rc531.h" 
#include "globe.h" 
char tagtype[2]; 
char buffer[12]; 
char UID[5]; 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 
//名称: spi_delay // 
//功能: 该函数实现SPI通讯延时 // 
// // 
//输入: // 
// 延时时间 // 
// // 
//输出: // 
// N/A // 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 
void spi_delay (char loop) 
{ 
char j; 
for (j = 0;j < loop; j++) 
{ 
_NOP(); 
} 
return; 
} 

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 
//名称: spi_byte_transceive // 
//功能: 该函数实现SPI通讯的数据收发 // 
// // 
//输入: // 
// 发送数据 // 
// // 
//输出: // 
// 接收数据 // 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 
char spi_byte_transceive(char sendbyte) 
{ 
char i,temp; 
for(i=0;i<8;i++) 
{ 
RC531_SCK_LOW; 
if(sendbyte &amt; 0x80) //位运算,判断最高位是否为1 
{ 
RC531_MOSI_HIGH; 
} 
else 
{ 
RC531_MOSI_LOW; 
} 
sendbyte <<= 1; 
RC531_SCK_HIGH; 
temp <<= 1; 
if(RC531_MISO) 
temp |= 0x01; 
} 
RC531_SCK_LOW; 
_NOP(); 
RC531_MOSI_LOW; 
return (temp); 
} 

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 
//名称: rc531_register_write // 
//功能: 该函数实现通过SPI接口对RC531中一个寄存器写入值 // 
// // 
//输入: // 
// RC531目标寄存器地址和写入值 // 
// // 
//输出: // 
// N/A // 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 
void rc531_register_write(char reg_ad,char reg_data) 
{ 
RC531_SCK_LOW; 
reg_ad <<= 1; 
RC531_NSS_LOW; 
reg_ad &amt;= 0x7F; 
spi_byte_transceive(reg_ad); 
spi_byte_transceive(reg_data); 
RC531_NSS_HIGH; 
return; 
} 

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 
//名称: rc531_register_read // 
//功能: 该函数实现通过SPI接口读取RC531中一个寄存器的值 // 
// // 
//输入: // 
// RC531目标寄存器地址 // 
// // 
//输出: // 
// 目标寄存器的值 // 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 
char rc531_register_read(char reg_ad) 
{ char temp; 
RC531_SCK_LOW; 
_NOP(); 
RC531_NSS_LOW; 
reg_ad <<= 1; 
reg_ad |= 0x80; 
spi_byte_transceive(reg_ad); 
temp=spi_byte_transceive(0x00); 
RC531_NSS_HIGH; 
return (temp); 
} 

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 
//名称: rc531_reset // 
//功能: 该函数实现硬件复位RC531器件 // 
// // 
//输入: // 
// N/A // 
// // 
//输出: // 
// TRUE:复位完成 FALSE:复位失败 // 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 
char rc531_reset(void) 
{ char i; 
RC531_RSTPD_RESET; 
spi_delay(0x2f); 
RC531_RSTPD_WORK; 
spi_delay(0x2f); 
for(i=0;i<RF_TimeOut;i++) 
{ 
if((rc531_register_read(Command))==0x00) 
{ 
return(TRUE); 
} 
spi_delay(0x0f); 
} 
return(FALSE); 
} 

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 
//名称: Rc531_Bus_Sel // 
//功能: 该函数实现对RC531操作的总线方式(SPI方式的)选择 // 
// // 
//输入: // 
// N/A // 
// // 
//输出: // 
// TRUE, SPI总线选择成功 // 
// FALSE, SPI总线选择失败 // 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 
char Rc531_Bus_Sel(void) 
{ // 并行通讯 
//NCS 
RC531_NCS_SEL; 
RC531_NCS_OUT; 
RC531_NCS_LOW; 
//NWR 
RC531_NWR_SEL; 
RC531_NWR_OUT; 
RC531_NWR_HIGH; 
//NRD 
RC531_NRD_SEL; 
RC531_NRD_OUT; 
RC531_NRD_HIGH; 
//ALE 
RC531_ALE_SEL; 
RC531_ALE_OUT; 
//A0 
RC531_A0_SEL; 
RC531_A0_OUT; 
//A1 
RC531_A1_SEL; 
RC531_A1_OUT; 
RC531_A1_LOW; 
//A2 
RC531_A2_SEL; 
RC531_A2_OUT; 
//D0-D7 
RC531_DATA_SEL; 
RC531_DATA_IN; 
//spi 通讯 
//SCK 
RC531_SCK_LOW; 
//MOSI 
RC531_MOSI_LOW; 
//MISO 
RC531_MISO_SEL; 
RC531_MISO_IN; 
//NSS 
RC531_NSS_HIGH; 
//reset 
if(rc531_reset()) 
return(TRUE); 
else 
return(FALSE); 
} 

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 
//名称: rc531_init // 
//功能: 该函数实现RC531器件的初始化并选择SPI通讯方式 // 
// // 
//输入: // 
// N/A // 
// // 
//输出: // 
// N/A // 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 
void rc531_init(void) 
{ 
RC531_Transceive_FLAG_SEL; //FOR TEST 
RC531_Transceive_FLAG_OUT; //FOR TEST 
RC531_Transceive_FLAG_LOW; //FOR TEST 
// IRQ 
RC531_IRQ_SEL; 
RC531_IRQ_IN; 
//RSTPD 
RC531_RSTPD_SEL; 
RC531_RSTPD_OUT; 
RC531_RSTPD_WORK; 
Rc531_Bus_Sel(); //RC531总线选择 
rc531_register_write(0x00,0x00); 
rc531_register_write(TxControl,0x5b); //开启TX1、TX2 
rc531_register_write(TimerClock,0x0b); //151us/per 
rc531_register_write(TimerControl,0x02); //发送结束开定时器,接收开始关定时器 
rc531_register_write(TimerReload,0x42); //10ms定时 
rc531_register_write(InterruptEn,0x7f); //关所有中断 
rc531_register_write(Int_Req,0x7f); 
return; 
} 

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 
//名称: Clear_FIFO // 
//功能: 该函数实现清空RC531中FIFO的数据 // 
// // 
//输入: // 
// N/A // 
// // 
//输出: // 
// TRUE: FIFO被清空 FALSE: FIFO未被清空 // 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 
char Clear_FIFO(void) 
{ 
char i,temp; 
rc531_register_write(Control,0x09); 
for(i=0;i<RF_TimeOut;i++) //检查FIFO是否被清空 
{ 
temp=rc531_register_read(FIFO_Length); 
if(temp==0) 
return(TRUE); 
} 
return(FALSE); 
} 

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 
//名称: Write_FIFO // 
//功能: 该函数实现向RC531的FIFO中写入bytes数据 // 
// // 
//输入: // 
// count, 待写入字节的长度 // 
// buff, 指向待写入数据的指针 // 
// // 
//输出: // 
// N/A // 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 
void Write_FIFO(char count,char *buff) 
{ 
char i; 
RC531_NSS_LOW; 
i=FIFO; 
i<<=1; 
spi_byte_transceive(i); 
for(i=0;i<count;i++) 
spi_byte_transceive(*(buff+i)); 
RC531_NSS_HIGH; 
return; 
} 

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 
//名称: Read_FIFO // 
//功能: 该函数实现从RC531的FIFO中读出x bytes数据 // 
// // 
//输入: // 
// buff, 指向读出数据的指针 // 
// // 
//输出: // 
// N/A // 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 
void Read_FIFO(char * buff) 
{ 
char temp0,temp1; 
char i; 
temp0=rc531_register_read(FIFO_Length); 
if(temp0==0) 
return; 
i=FIFO; 
i<<=1; 
i |=0x80; 
RC531_NSS_LOW; 
spi_byte_transceive(i); 
temp1=FIFO; 
temp1 <<= 1; 
for(i=0;i<(temp0-1);i++) 
*(buff+i)=spi_byte_transceive(temp1); 
*(buff+temp0-1)=spi_byte_transceive(0x00); 
RC531_NSS_HIGH; 
_NOP(); 
return; 
} 

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 
//名称: Command_Send // 
//功能: 该函数实现向RC531发送命令集的功能 // 
// // 
//输入: // 
// count, 待发送命令集的长度 // 
// buff, 指向待发送数据的指针 // 
// Comm_Set, 命令码 // 
// // 
//输出: // 
// TRUE, 命令被正确执行 // 
// FALSE, 命令执行错误 // 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 
char Command_Send(char count,char * buff,char Comm_Set) 
{ 
char j,temp; 
rc531_register_write(Command,Idle); 
Clear_FIFO(); 
Write_FIFO(count,buff); 
rc531_register_write(Command,Comm_Set); //命令执行 
RC531_Transceive_FLAG_HIGH; //FOR TEST 
for(j=0;j<RF_TimeOut;j++) //检查命令执行否 
{ 
temp=rc531_register_read(Command); 
if(temp==0x00) 
{ RC531_Transceive_FLAG_LOW; //FOR TEST 
return(TRUE); 
} 
} 
return(FALSE); 
} 

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 
//名称: Judge_Req // 
//功能: 该函数实现对卡片复位应答信号的判断 // 
// // 
//输入: // 
// *buff, 指向应答数据的指针 // 
// // 
//输出: // 
// TRUE, 卡片应答信号正确 // 
// FALSE, 卡片应答信号错误 // 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 
char Judge_Req(char * buff) 
{ 
char temp1,temp2; 

temp1 = *buff; 
temp2 = *(buff + 1); 

if((temp1 == ATQA_BYTE0) &amt;&amt; (temp2 == ATQA_BYTE1)) 
return(TRUE); 
else 
return(FALSE); 
} 

/********************************************************************************************************/ 
/*名称: Save_UID */ 
/*功能: 该函数实现保存卡片收到的序列号 */ 
/* */ 
/*输入: */ 
/* row: 产生冲突的行 */ 
/* col: 产生冲突的列 */ 
/* length: 接収到的UID数据长度 */ 
/* */ 
/*输出: */ 
/* N/A */ 
/********************************************************************************************************/ 
void Save_UID(char row,char col,char length) 
{ 
char i; 
char temp; 
char temp1; 

if(row==0x00 &amt;&amt; col==0x00) 
for(i=0;i<length;i++) 
UID[i]=buffer[i]; 
else 
{ 
temp=buffer[0]; 
temp1=UID[row-1]; 
switch(col) 
{ 
case 0: 
temp1=0x00; 
row=row+1; 
break; 
case 1: 
temp=temp &amt; 0xFE; 
temp1=temp1 &amt; 0x01; 
break; 
case 2: 
temp=temp &amt; 0xFC; 
temp1=temp1 &amt; 0x03; 
break; 
case 3: 
temp=temp &amt; 0xF8; 
temp1=temp1 &amt; 0x07; 
break; 
case 4: 
temp=temp &amt; 0xF0; 
temp1=temp1 &amt; 0x0F; 
break; 
case 5: 
temp=temp &amt; 0xE0; 
temp1=temp1 &amt; 0x1F; 
break; 
case 6: 
temp=temp &amt; 0xC0; 
temp1=temp1 &amt; 0x3F; 
break; 
case 7: 
temp=temp &amt; 0x80; 
temp1=temp1 &amt; 0x7F; 
break; 
default: 
break; 
} 
buffer[0]=temp; 
UID[row-1]=temp1 | temp; 
for(i=1;i<length;i++) 
{ 
UID[row-1+i]=buffer[i]; 
} 
} 
} 

/********************************************************************************************************/ 
/*名称: Check_UID */ 
/*功能: 该函数实现对收到的卡片的序列号的判断 */ 
/* */ 
/*输入: */ 
/* N/A */ 
/* */ 
/*输出: */ 
/* TRUE: 序列号正确 */ 
/* FALSE: 序列号错误 */ 
/********************************************************************************************************/ 
char Check_UID(void) 
{ 
char temp; 
char i; 

temp=0x00; 
for(i=0;i<5;i++) 
{ 
temp=temp ^ UID[i]; 
} 
if(temp==0) 
return(TRUE); 
return(FALSE); 
} 


/********************************************************************************************************/ 
/*名称: Set_BitFraming */ 
/*功能: 该函数实现对收到的卡片的序列号的判断 */ 
/* */ 
/*输入: */ 
/* row: 产生冲突的行 */ 
/* col: 产生冲突的列 */ 
/* */ 
/*输出: */ 
/* N/A */ 
/********************************************************************************************************/ 
void Set_BitFraming(char row,char col) 
{ 
switch(row) 
{ 
case 0: 
buffer[1]=0x20; 
break; 
case 1: 
buffer[1]=0x30; 
break; 
case 2: 
buffer[1]=0x40; 
break; 
case 3: 
buffer[1]=0x50; 
break; 
case 4: 
buffer[1]=0x60; 
break; 
default: 
break; 
} 

switch(col) 
{ 
case 0: 
rc531_register_write(Bit_Frame,0x00); 
break; 
case 1: 
rc531_register_write(Bit_Frame,0x11); 
buffer[1]=(buffer[1] | 0x01); 
break; 
case 2: 
rc531_register_write(Bit_Frame,0x22); 
buffer[1]=(buffer[1] | 0x02); 
break; 
case 3: 
rc531_register_write(Bit_Frame,0x33); 
buffer[1]=(buffer[1] | 0x03); 
break; 
case 4: 
rc531_register_write(Bit_Frame,0x44); 
buffer[1]=(buffer[1] | 0x04); 
break; 
case 5: 
rc531_register_write(Bit_Frame,0x55); 
buffer[1]=(buffer[1] | 0x05); 
break; 
case 6: 
rc531_register_write(Bit_Frame,0x66); 
buffer[1]=(buffer[1] | 0x06); 
break; 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -