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

📄 rc531.c

📁 采用TI公司MSP430来控制RC531的源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
//**************************************************************************************
#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 + -