?? trf7960.c
字號:
#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 + -