📄 trf7960.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 + -