📄 rc531.c.txt
字号:
#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 + -