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

📄 trf7960.c

📁 用TI公司MSP430控制TRF7960设计TYPEA源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#ifndef _TRF_7960_C_INCLUDED_
#define _TRF_7960_C_INCLUDED_
#include "msp430x12x.h"
#include "TRF7960.h"
char buffer[12];
char rec_length;
char tagtype[2];
char UID[5];
void spi_delay (char loop)
{
  char j;
  for (j = 0x00;j < loop; j++);
  return;
}

//SPI(without ss)
void start_bit (void)
{       SPI_CLK_LOW;
	//_NOP();
	SPI_OUT_LOW;
	//_NOP();
	SPI_CLK_HIGH;
	//_NOP();
	SPI_OUT_HIGH;   
	//_NOP();
	SPI_CLK_LOW;	
}

void stop_bit (void)
{
        SPI_CLK_LOW;
	//_NOP();
	SPI_OUT_HIGH;	
	//_NOP();
	SPI_CLK_HIGH;
	//_NOP();
	SPI_OUT_LOW;	
	//_NOP();
	SPI_CLK_LOW;
}

void byte_send(char sendbyte)
{
  char i,temp;
  //SPI_CLK_LOW;
  temp = sendbyte & 0x80;
  for(i=0;i<8;i++)
  { 
    if(temp)
     { SPI_OUT_HIGH;
     }
    else
     { SPI_OUT_LOW;
     }
    //_NOP();
    SPI_CLK_HIGH;
    //_NOP();
    sendbyte<<=1;
    temp = sendbyte & 0x80;
    SPI_CLK_LOW;
  }
}

char spi_receive(void)
{
  char i,temp=0;
    //SPI_CLK_LOW;
  for(i=0;i<8;i++)
  {
    //_NOP();
    SPI_CLK_HIGH;
    temp<<=1;
    if(SPI_IN)
    {  
      temp|=0x01;
    } 
    else
    {  
     temp&=0xfe;
    }     
    SPI_CLK_LOW;
  }
  return(temp);
}

void single_command_send(char command_code)
{ 
   command_code &= 0x9f;
   command_code |= 0x80;   
   start_bit();
   byte_send(command_code);
   stop_bit();
   return;
}

char single_register_read(char reg_ad)
{ 
   char i;
   reg_ad &=0x1F;
   reg_ad |=0x40;
   start_bit();
   byte_send(reg_ad);
   i=spi_receive();
   stop_bit();   
   return(i);
}

void single_register_write(char reg_ad,char reg_data)
{  
   reg_ad &=0x1F;
   start_bit();
   byte_send(reg_ad);
   byte_send(reg_data);
   stop_bit();

   return;
}
//char FIFO_level(void)
//{ char i;
 // i=single_register_read(0x1C);
  
char FIFO_length( void )
{ char i;
   start_bit();
   byte_send(0x5c);
   i=spi_receive();
   stop_bit();  
   i &= 0x0F;
  return(i);
}

char Clear_FIFO(void)
{  char temp;
   start_bit();
   byte_send(0x8F);
   byte_send(0x4C);
   temp=spi_receive();
   byte_send(0x00);
   stop_bit();
   return(temp);
}
char Read_FIFO(char * buff)
{
   char temp,i;
   temp=FIFO_length();
   temp++;
  
      start_bit();
       byte_send(0x7f);
      //for(i=0;i<temp;i++)
       for(i=0;i<5;i++)
      *(buff+i)=spi_receive();
       stop_bit();
       return(temp);
   
}
    
char IRQ_status( void )
{ 
   char temp;
   SPI_RX_HIGH;
   start_bit();
   byte_send(0x4C);
   temp=spi_receive();
   byte_send(0x00);
   stop_bit();
   SPI_RX_LOW;  
   return(temp);
}

void softinit(void)
{  // char temp; 
    single_command_send(0x03);             //soft init
     spi_delay(0x50); 
     single_register_write(0x0B,0x06);      //3.3V    
     spi_delay(0x20); 
     single_register_write(0x09,0x21);    //CL_SYS 6.78MHz 100%OOK
     spi_delay(0x20);  
     single_register_write(0x00,0x23);//0x21);      //active mode,rf_on,5V system]
     spi_delay(0x20); 
     single_register_write(0x01,0x88);//0x08);      //ISO14443A,bit rate 106kbit/S,rx_crc
     spi_delay(0x20);
     //single_register_write(0x07,0x30);    //no response delay time 37.76*48=1812us
     //delay(0x20); 
     //single_register_write(0x0D,0x3f);      //no_resp   
     single_register_write(0x0D,0x01);       //enable no_resp,disable else
     spi_delay(0x20);
     //temp=single_register_read(0x03);
    // temp |= 0x08;
     //single_register_write(0x03,temp);
     //temp=single_register_read(0x03);
     return;       
}


char data_transceive(char byte_count,char broken_bit,char any_crc,char * buff)
{      
  char j,temp,sended,remain_send;
  char TxLengthByte1,TxLengthByte2; 
  
  Clear_FIFO();
  sended=0x00;
  rec_length=0;  
  remain_send = byte_count;
  TxLengthByte1 = (byte_count & 0xf0)>>4;
  TxLengthByte2 = (byte_count & 0x0f)<<4; 
  if(broken_bit != 0)
  { 
        broken_bit = broken_bit <<1;
        broken_bit &= 0x0E;
        broken_bit |= 0x01;
        TxLengthByte2 |= broken_bit;
        remain_send++;
  }
  if(remain_send==0)
     return(0x00);
  if(remain_send==1)
       remain_send++;
  if(TRF_7960_IRQ != 0)
     return(0x01);
  else
  {
     start_bit();
     //byte_send(0x8f);//reset
     //byte_send(0x90);//transmit without crc
     byte_send(any_crc);//transmit withCRC
     byte_send(0x3D);// length to 1d,1e
     byte_send(TxLengthByte1);    //1d
     byte_send(TxLengthByte2);    //1e
     SPI_TX_HIGH;
     if(remain_send<=12)
     {
       temp=remain_send;
       remain_send=0;
       
     }
     else
     {
       temp=12;
       remain_send=remain_send-12;
       sended=12;
     }
     for(j=0;j<temp;j++)
       byte_send(*(buff+j));
     stop_bit();
     if(remain_send==0)
       SPI_TX_LOW;
     while(remain_send!=0) 
     {
        temp=FIFO_length();
        if(temp<6)
        {
           start_bit();
           byte_send(0x3f);
           if(remain_send<=6)
           {
              temp=remain_send;
              remain_send=0;
              
           }
           else
           {
              temp=6;
              remain_send=remain_send-6;
            }
            for(j=0;j<temp;j++)
              byte_send(*(buff+j+sended));
            stop_bit();
            if(remain_send==0)
            SPI_TX_LOW;
            sended=sended+6;
        }
     }  
     while(TRF_7960_IRQ==0)
             {    _NOP();     }
     temp=Clear_FIFO();
           if((temp & 0x80)==0)
              return(TRF7960_TRANSERR);
     while(1)
     {
            
       
        if(TRF_7960_IRQ!=0)
        {   
            temp=IRQ_status();
            if((temp & 0x01)!=0)
              return(TRF7960_NOTAGERR);
            if((temp & 0x40)!=0)
            {  
              j=Read_FIFO(buffer+rec_length);
              rec_length += j;
              j=single_register_read(0x3d);
              j=single_register_read(0x3e);
               /*if((temp & 0x20)!=0)
               {
                  start_bit();
                  byter_send(0x7f);
                  for(j=0;j<8;j++)
                   *(buff+j+rec_length)=spi_receive();
                  stop_bit();
               }*/
               if((temp & 0x02)!=0)
                  return(TRF7960_ANTICOLLERR);
               if((temp & 0x04)!=0)
                  return(TRF7960_FRAMINGERR);
               if((temp & 0x08)!=0)
                  return(TRF7960_PARITYERR);
               if((temp & 0x10)!=0)
                  return(TRF7960_CRCERR);
  
               else
                  return(TRF7960_OK);
              return(temp);
            }
            else
               return(TRF7960_TRANSERR);
        }
        else
        {    temp=FIFO_length();
              if(temp>6)
              {  start_bit();
                 byte_send(0x7f);
                 for(j=0;j<6;j++)
                   *(buff+j+rec_length)=spi_receive();
                  stop_bit();
                  rec_length +=6;
              }
                 
        }
    }
  }            
}  

void initial_7960 (void)
{   
    //初始化interface
    
    SPI_CLK_SEL;
    SPI_CLK_OUT;
    SPI_CLK_LOW;
        
    SPI_IN_SEL;
    SPI_IN_IN; 
       
    SPI_OUT_SEL;
    SPI_OUT_OUT;
    SPI_OUT_LOW;
    
    SPI_STROBE_SEL;
    SPI_STROBE_IN ;

⌨️ 快捷键说明

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