📄 rc531.c
字号:
//**************************************************************************************
#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];
char w;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
//名称: 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 & 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 &= 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,0x0A); //75us/per
rc531_register_write(TimerControl,0x02); //发送结束开定时器,接收开始关定时器
rc531_register_write(TimerReload,0x84); //10ms定时
rc531_register_write(InterruptEn,0x7f); //关所有中断
rc531_register_write(Int_Req,0x7f);
rc531_register_write(RxThreshold,0xF8);
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, 待发送命令集的长度 //
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -