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

📄 15693.c

📁 我里面有比较详细的7960的PDF
💻 C
字号:
#include "include.h"

//*************************************************************************************************
// 功能描述 : 时隙计数使能
// 输入参数 : 无
// 返回参数 : 无
// 说    明 : 
//*************************************************************************************************
void EnableSlotCounter(void)
{
    unsigned char buf[2];
    buf[1] = IRQMask;	
    buf[0] = IRQMask;
    ReadSingle(&buf[1], 1);
    buf[1] |= BIT0;	
    WriteSingle(&buf[0], 2);
}

//*************************************************************************************************
// 功能描述 : 禁止时隙计数
// 输入参数 : 无
// 返回参数 : 无
// 说    明 : 
//*************************************************************************************************
void DisableSlotCounter(void)
{
    unsigned char buf[2];
    buf[1] = IRQMask;	 
    buf[0] = IRQMask;
    ReadSingle(&buf[1], 1);
    buf[1] &= 0xfe;	 
    WriteSingle(&buf[0], 2);
}

//*************************************************************************************************
// 功能描述 : 清点命令
// 输入参数 : 无
// 返回参数 : 无
// 说    明 : 
//*************************************************************************************************
void InventoryRequest()              
{
    unsigned char i = 1,command, found = 0;
    unsigned int size;                          // 请求命令数据帧大小	
    unsigned char NoSlots = 2;                  // 时隙总数,默认1 时隙(NoSlots = 时隙数 + 1)
    unsigned int n = 0;

    if((flags & BIT5) == 0x00)                  // 判断时隙类型  
    {						 
        NoSlots = 17;		// 16 时隙 
        EnableSlotCounter();
    }
	
    size = 3;                                   //长度 = flag + command + lenght		

    buf[0] = 0x8f;                              // 复位
    buf[1] = 0x91;                              // 传送带CRC		
    buf[2] = 0x3d;                              // 连续写,从1D开始	
    buf[3] = (char) (size >> 8);                // 发送的长度
    buf[4] = (char) (size << 4);                //
    // 按15693命令格式写入FIFO
    buf[5] = flags;	                // 写FIFO ISO15693 flags
    buf[6] = 0x01;	                // 15693 之清点命令	 
    buf[7] = 0x00;                              // 掩码长度		

    command = IRQStatus;
    ReadSingle(&command, 1);

    CounterSet();	                // TimerA设置 
    countValue = count1ms * 20;		// 20ms 
	
    RAWwrite(&buf[0], 8);	                // 写 FIFO
    irqCLR;		                // 清除已经存在的IRQ中断标志
    irqON;
	
    i_reg = 0x01;                               // 当前状态为RX状态
    startCounter;		//开启时钟A,增计数模式
    LPM0;			//等待发送完成 

    for(i = 1; i < NoSlots; i ++)               // 1 或 16 时隙 
    {								
        RXTXstate = 1;	                // 接收数据保存从buf[1]开始
        CounterSet();		// TimerA设置
        countValue = count1ms * 20;             //20ms 
        startCounter;		// start timer up mode 

        n = 0;
        LPM0;

        while(i_reg == 0x01)                    // 等待RX完成 
        {						
            n++;
            if(n == 0xFFF0)
            {
                i_reg = 0x00;
                RXErrorFlag = NOERROR;
                break;
            }
        }

        if(i_reg == 0xFF)
        {			//接收到 UID 
            found = 1;
        }

        command = Reset;		// FIFO 在下个时隙前必须复位
        DirectCommand(&command);

        if((NoSlots == 17) && (i < 16))         // 发送EOF(next slot)  
        {					
            command = StopDecoders;
            DirectCommand(&command);
            command = RunDecoders;
            DirectCommand(&command);
            command = TransmitNextSlot;
            DirectCommand(&command);
        }
        else if((NoSlots == 17) && (i == 16))  // 所以时隙发送完成,停止时隙计数 
        {					
            DisableSlotCounter();
        }
        else if(NoSlots == 2)
            break;
    }			
    if(found)
    {				
        LED15693ON;
        for(char i = 0;i < 8;i++)                   //提取接收缓存中的数据
        {
            UID[i] = buf[10 - i];         
        }
    }
    else
    {
        LED15693OFF;
        for(char i = 0;i < 8;i++)                   
        {
            UID[i] = 0;         
        }        
    }
    irqOFF;
}		

//*************************************************************************************************
// 功能描述 : 获取UID
// 输入参数 : 无
// 返回参数 : 无
// 说    明 : 
//*************************************************************************************************
void GetUID()
{
    unsigned char   command[10];
    
    command[0] = ChipStateControl;          // 打开 RF 发射和接收 
    command[1] = 0x21;                      // RFID模块RF场始能,接收始能
    command[2] = ISOControl;	            // ISO15693 
    command[3] = 0x02;                      // ISO15693 高速, 单载波, 4出1
    WriteSingle(command, 4);
    DelayMs(5);
   
    command[0] = ChipStateControl;
    ReadSingle(command, 1);	                // 清除 IRQs 

    command[0] = ISOControl;
    ReadSingle(command, 1);	                // 清除 IRQs  

    flags = 0x06;                               //选择16个时隙
    InventoryRequest();	                // 发送清点命令

    command[0] = ChipStateControl;	// 关闭 RF 发射 
    command[1] = 0x01;
    WriteSingle(command, 2);
    DelayMs(1);
    command[0] = IRQStatus;
    ReadSingle(command, 1);	                // 清除 IRQs 
}

⌨️ 快捷键说明

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