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

📄 trf7960.c

📁 使用了TI的TRF7960和Atmel的52来实现RFID功能(ISO-15693)
💻 C
字号:
#include <reg52.h>
#include <intrins.h>
#include <string.h>
#include "define.h"
#include "var.h"
#include "function.h"



void RFID_TRF7960_Interrupt_Init(void)
{
	IT0 = 1;			/* 使用触发方式 */
	EX0 = 1;			/* 开启外部中断0 */
	PX0 = 1;			/* 设置外部中断0为高优先级 */
	/* 初始化 */
	RFID_TRF7960_SingleCommandWrite(0x03);
	RFID_Delay(20);
	RFID_TRF7960_SingleRegisterWrite(0x00, 0x33);
	RFID_Delay(20);
	
	RFID_TRF7960_SingleRegisterWrite(0x01, 0x02);//iso15693
	RFID_Delay(20);
	RFID_TRF7960_SingleRegisterWrite(0x0D, 0x01);//enable no_resp,disable else
	RFID_Delay(20);
	RFID_TRF7960_SingleRegisterWrite(0x0A, 0x44);
	RFID_Delay(20);
	/* 选择ASK100% */
	RFID_TRF7960_SingleRegisterWrite(0x09, 0x01);
	RFID_Delay(20);
	
}


/*void RFID_TRF7960_ReadFromFIFO(void) interrupt 0
{
	uchar ucIRQStatus;
	uchar ucFIFOLength;
	uchar ucIndex;

	ucIRQStatus = 0;
	ucFIFOLength = 0;
	ucIndex = 0;
	//读取IRQ寄存器
	ucIRQStatus = RFID_TRF7960_SingleRegisterRead(0x0C);

	if(1 == (ucIRQStatus & 0x10))//判断是否CRC错误
	{
		RFID_Buzzer(1);
		return;
	}

	if(1 == (ucIRQStatus & 0x08))//判断是否parity错误
	{
		RFID_Buzzer(2);
		return;
	}

	if(1 == (ucIRQStatus & 0x04))//判断是否frame错误
	{
		RFID_Buzzer(4);
		return;
	}

	if(1 == (ucIRQStatus & 0x20) || 1 == (ucIRQStatus & 0x40))//判断是否接收到第九个字节
	{
		//读取FIFO中有的数据个数
		ucFIFOLength = RFID_TRF7960_SingleRegisterRead(0x1C);
		ucFIFOLength &= 0x0F;

		if(ucFIFOLength > 7)
		{
			RFID_TRF7960_StartBit();
			RFID_TRF7960_SendByte(0x7f);
			for(ucIndex = 0; ucIndex <= ucFIFOLength; ucIndex++)
			{
				aucISORecvBuf[ucISORecvNum + ucIndex] = RFID_TRF7960_RevByte();
			}
			RFID_TRF7960_StopBit_Cont();
			ucISORecvNum += ucFIFOLength;
		}
		if(1 == (ucIRQStatus & 0x40))
		{
			ucISORecvNum = 0;
			RFID_ISO_Divide();
			RFID_ISO_Manager();
		}
	}
}*/


uchar RFID_TRF7960_WriteToFIFO(uchar ucNum)
{
	uchar ucIndex,ucTXLength1,ucTXLength2;
	uchar ucRemain,ucTmp,ucSended;

	ucRemain = ucNum;//剩余未发送的数据的长度
	ucTmp = 0;		//标识FIFO中的字节个数
	ucSended = 0;	//已发送的字节个数
	ucIndex = 0;
	//ucIRQStatus = 0;//IRQ寄存器的状态
	ucTXLength1 = (ucRemain & 0xf0) >> 4;//TXLength1的寄存器
	ucTXLength2 = (ucRemain & 0x0f) << 4;//TXLength2的寄存器
	ucTXLength2 &= 0xf0;//没有不完整的字节

	if(0 == ucRemain)
	{
		return 0;
	}
	
	RFID_TRF7960_ClearFIFO();//对FIFO清零

	EX0 = 0;//关闭外部中断0

	//发送连续的数据
	RFID_TRF7960_StartBit();
	RFID_TRF7960_SendByte(0x91);//trassion with crc这一步一定不能少
	RFID_TRF7960_SendByte(0x3D);
	RFID_TRF7960_SendByte(ucTXLength1);
	RFID_TRF7960_SendByte(ucTXLength2);

	if(ucRemain <= 12)
	{
		ucTmp = ucRemain;
		ucSended = ucRemain;
		ucRemain = 0;
	}
	else
	{
		ucTmp = 12;
		ucRemain = ucRemain -12;
		ucSended = 12;
	}
	
	//先发送ucTmp个字节
	for(ucIndex = 0; ucIndex < ucTmp; ucIndex++)
	{
		RFID_TRF7960_SendByte(aucISOTransBuf[ucIndex]);
	}
	//RFID_TRF7960_StopBit_Cont();
	RFID_TRF7960_StopBit_Cont();//连续的结束符
	
	//如果还有数据没有发送完
	while(ucRemain != 0)
	{
		//读取FIFO中还剩余的数据个数
		ucTmp = RFID_TRF7960_SingleRegisterRead(0x1C);
		ucTmp &= 0x0F;

		if(ucTmp < 6)//判断检测一下,数据是否少于6个
		{
			//再次发送ucTmp个数据
			RFID_TRF7960_StartBit();
			RFID_TRF7960_SendByte(0x3F);
			if(ucRemain < 6)
			{
				ucTmp = ucRemain;
				ucRemain = 0;
			}
			else
			{
				ucTmp = 6;
				ucRemain = ucRemain - 6;
			}
			for(ucIndex = 0; ucIndex < ucTmp; ucIndex++)
			{
				RFID_TRF7960_SendByte(aucISOTransBuf[ucSended + ucIndex]);
			}
			RFID_TRF7960_StopBit_Cont();
			ucSended += ucTmp;
		}
	}
	
	while(IRQ==0);//等待IRQ中断
	
	ucTmp = RFID_TRF7960_ClearFIFO();
	if((ucTmp & 0x80)==0)
	{
    	return(TRF7960_TRANSERR);
	}
	//p01 = 0;

	while(1)
	{
		if(IRQ != 0)
        {   
        	
            ucTmp = RFID_TRF7960_IRQStatus();
            if((ucTmp & 0x01)!=0)
            {
            	RFID_Serial_Trans("4524");
            	return(TRF7960_NOTAGERR);
            }
            if((ucTmp & 0x40)!=0)
            {  
				ucIndex = RFID_TRF7960_ReadFIFO();
				if(0 == aucISORecvBuf[6])
				{
					RFID_Serial_TransSingle('\n');
				}
				else
				RFID_Serial_TransSingle(aucISORecvBuf[6]);
				if(0 == aucISORecvBuf[7])
				{
					RFID_Serial_TransSingle('\\');
				}
				else
				RFID_Serial_TransSingle(aucISORecvBuf[7]);
				RFID_Serial_TransSingle(34);

				//RFID_Serial_TransSingle(ucIndex);
				ucISORecvNum += ucIndex;
				ucIndex = RFID_TRF7960_SingleRegisterRead(0x3d);
				ucIndex = RFID_TRF7960_SingleRegisterRead(0x3e);
				
				if((ucTmp & 0x02)!=0)
				{
					RFID_Serial_Trans("as");
					return(TRF7960_ANTICOLLERR);
				}
				if((ucTmp & 0x04)!=0)
				{
					RFID_Serial_Trans("df");
					return(TRF7960_FRAMINGERR);
				}
				if((ucTmp & 0x08)!=0)
				{
					RFID_Serial_Trans("qw");
					return(TRF7960_PARITYERR);
				}
				if((ucTmp & 0x10)!=0)
				{
					RFID_Serial_Trans("er");
					return(TRF7960_CRCERR);
				}
				else
				{
					//RFID_Serial_TransSingle(ucTmp);
					p01 = 0;
					return(TRF7960_OK);
				}
				RFID_Serial_Trans("aytr");
				return ucTmp;
            }
            else
            {
            	RFID_Serial_Trans("5678");
               return(TRF7960_TRANSERR);
            }
        }
        else
        {    
        	ucTmp = RFID_TRF7960_SingleRegisterRead(0x1C);
			ucTmp &= 0x0F;
			//RFID_Serial_Trans("\nar\n");
			//RFID_Serial_TransSingle(ucTmp);
			//RFID_Serial_TransSingle('\n');
			
            if(ucTmp > 6)
           	{
           		RFID_TRF7960_StartBit();
				RFID_TRF7960_SendByte(0x7f);
				for(ucIndex = 0; ucIndex < 6; ucIndex++)
				{
					aucISORecvBuf[ucISORecvNum + ucIndex] = RFID_TRF7960_RevByte();
				}
				RFID_TRF7960_StopBit_Cont();
				ucISORecvNum += 6;
				RFID_Serial_TransSingle(aucISORecvBuf[0]);
				RFID_Serial_TransSingle(aucISORecvBuf[1]);
				RFID_Serial_TransSingle(aucISORecvBuf[2]);
				RFID_Serial_TransSingle(aucISORecvBuf[3]);
				RFID_Serial_TransSingle(aucISORecvBuf[4]);
				RFID_Serial_TransSingle(aucISORecvBuf[5]);
				
			}
        }
	}
	EX0 = 1;//重新开启外部中断0
}


uchar RFID_TRF7960_ReadFIFO()
{
    uchar ucTmp,i;
	
    ucTmp = RFID_TRF7960_SingleRegisterRead(0x1C);
	ucTmp &= 0x0f;;
    ucTmp++;
  
    RFID_TRF7960_StartBit();
	RFID_TRF7960_SendByte(0x7f);
    for(i = 0; i < ucTmp; i++)
    {
    	aucISORecvBuf[ucISORecvNum + i] = RFID_TRF7960_RevByte();
    }

	RFID_TRF7960_StopBit_Cont();
	
    return(ucTmp);
}



uchar RFID_TRF7960_ClearFIFO()//返回IRQ寄存器
{
	uchar temp;
	RFID_TRF7960_StartBit();
	RFID_TRF7960_SendByte(0x8f);
	RFID_TRF7960_SendByte(0x4C);
	temp = RFID_TRF7960_RevByte();
	RFID_TRF7960_SendByte(0x0);//这里很重要
	RFID_TRF7960_StopBit_Smpl();
    return(temp);
}

uchar RFID_TRF7960_IRQStatus(void)
{
	uchar temp;
	RFID_TRF7960_StartBit();
	RFID_TRF7960_SendByte(0x4C);
	temp = RFID_TRF7960_RevByte();
	RFID_TRF7960_SendByte(0x0);
	RFID_TRF7960_StopBit_Smpl();
    return(temp);
}


/* 高级一点,对寄存器或命令进行操作 */
void RFID_TRF7960_SingleCommandWrite(uchar ucCommand)
{
	/* 因为ucCommand使用5位bit就可以表示了,最大命令为1A
	所以将命令经过与和或以后塞到选择模式的那个字节中 */
	ucCommand &= 0x9f;//先与,提取命令
	ucCommand |= 0x80;//再或,选择模式
	RFID_TRF7960_StartBit();
	RFID_TRF7960_SendByte(ucCommand);
	RFID_TRF7960_StopBit_Smpl();
}


void RFID_TRF7960_SingleRegisterWrite(uchar ucAddress, uchar ucData)
{
	/* 因为ucCommand使用5位bit就可以表示了,
	所以将命令经过与和或以后塞到选择模式的那个字节中 */
	ucAddress &= 0x1f;//先与,提取命令
	//ucAddress |= 0x40;//再或,选择模式
	RFID_TRF7960_StartBit();
	RFID_TRF7960_SendByte(ucAddress);
	RFID_TRF7960_SendByte(ucData);
	RFID_TRF7960_StopBit_Smpl();
}

uchar RFID_TRF7960_SingleRegisterRead(uchar ucAddress)
{
	uchar ucTmp = 0;
	
	/* 和命令一样的,寄存器地址最大为1F,用5为bit足矣 */
	ucAddress &= 0x1f;
	ucAddress |= 0x40;
	RFID_TRF7960_StartBit();
	RFID_TRF7960_SendByte(ucAddress);
	ucTmp = RFID_TRF7960_RevByte();
	RFID_TRF7960_StopBit_Smpl();
	return ucTmp;
}


/* 最基本的五个函数 */
void RFID_TRF7960_StartBit(void)
{
	DATA_CLK_LOW;
	AD = 0x0;
	DATA_CLK_HIGH;
	AD = 0xff;
	DATA_CLK_LOW;
}


void RFID_TRF7960_SendByte(uchar ucByte)
{
	AD = ucByte;
	DATA_CLK_HIGH;
	_nop_();
	DATA_CLK_LOW;
}

uchar RFID_TRF7960_RevByte(void)
{
	uchar ucTmp = 0;
	AD = 0xFF;
	DATA_CLK_HIGH;
	ucTmp = AD;
	DATA_CLK_LOW;
	return ucTmp;
}

void RFID_TRF7960_StopBit_Smpl(void)
{
	DATA_CLK_LOW;
	AD = 0xFF;
	DATA_CLK_HIGH;
	AD = 0x0;
	DATA_CLK_LOW;
}

void RFID_TRF7960_StopBit_Cont(void)
{
	DATA_CLK_LOW;
	AD7_LOW;
	AD7_HIGH;
	AD7_LOW;
}































⌨️ 快捷键说明

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