?? rf.c
字號:
//------------------------------------------------------------------------*
//文件名:RF.C *
//功 能:與射頻讀卡芯片通信相關程序。 *
//包 含: *
// (1)RC531的驅動函數 *
// (2)RC531的復位及初始化 *
// (3)RC531的讀卡操作 *
//------------------------------------------------------------------------*
#include "RF.h"
//------------------------------------------------------------------------*
//1.RC531的驅動函數 *
//------------------------------------------------------------------------*
//RFRegRead---------------------------------------------------------------*
//功 能: 讀出給定地址的寄存器的值并返回 *
//參 數: adder 被訪問寄存器的地址 *
//返 回: 讀出的數據 *
//------------------------------------------------------------------------*
INT8U RFRegRead(INT8U addr)
{
INT8U ReData1,ReData2; //接收數據變量
INT8U SndData; //發送數據變量
//處理第一個字節,bit7:MSB=1,bit6~1:addr,bit0:RFU=0
SndData = (addr << 1);
SndData |= (1 << 7);
SndData &= ~(1 << 0);
//SPI1_SS引腳拉低,選中從機
SPI1_P &= ~(1 << SPI1_SS);
//讀取過程
ReData1 = SPI1MASTERCOM(SndData); //發送讀取目的寄存器地址
ReData2 = SPI1MASTERCOM(0x00); //讀取結束,取回寄存器內容
//SPI1_SS引腳拉高,取消選中
SPI1_P |= (1 << SPI1_SS);
return ReData2; //返回接收數據
}
//RFRegWrite--------------------------------------------------------------*
//功 能: 向給定地址的寄存器寫一個值 *
//參 數: adder 被訪問寄存器的地址; Data 寫入的數據 *
//返 回: 無 *
//------------------------------------------------------------------------*
void RFRegWrite(INT8U addr, INT8U Data)
{
INT8U ReData1,ReData2;
INT8U SndAddr;
//處理第一個字節,bit7:MSB=0,bit6~1:addr,bit0:RFU=0
SndAddr = (addr << 1);
SndAddr &= 0x7E;
//SPI1_SS引腳拉低,選中從機
SPI1_P &= ~(1 << SPI1_SS);
//寫入過程
ReData1 = SPI1MASTERCOM(SndAddr); //寫入目標地址
ReData2 = SPI1MASTERCOM(Data); //寫入內容
//SPI1_SS引腳拉高,取消選中
SPI1_P |= (1 << SPI1_SS);
}
//Command_Send------------------------------------------------------------*
//功 能: 向MF RC531發送命令 *
//參 數: Length: 要寫入的字節數 *
// Send_Buf: 待發送數據應放在Send_Buf緩沖區中 *
// comm_set: 命令操作碼 *
//返 回: 1 - 命令執行失敗; 0 - 命令執行成功 *
//------------------------------------------------------------------------*
INT8U Command_Send(INT8U *Send_Buf, INT8U Length, INT8U comm_set)
{
INT8U Data;
INT8U time;
INT8U i,j;
//清空FIFO緩沖區
Clear_FIFO();
//寫命令參數
Write_FIFO(Send_Buf, Length);
//設置延時時間
time = 0xff;
//向command寄存器寫控制命令碼
RFRegWrite(RegCommand, comm_set);
//檢測命令是否被執行
for(i = 0; i < time; i++)
{
Data = RFRegRead(RegCommand); //讀取Command_Reg寄存器
if(Data == 0) //判斷Command_Reg寄存器是否已為0
return 0; //成功
for(j = 0; j < 250; j++); //延時
}
return 1; //失敗
}
//Clear_FIFO--------------------------------------------------------------*
//功 能: 清空RC531的FIFO寄存器 *
//參 數: 無 *
//返 回: 1 - 命令執行失敗; 0 - 命令執行成功 *
//------------------------------------------------------------------------*
INT8U Clear_FIFO(void)
{
INT8U Data;
INT8U i,j;
//清空FIFO緩沖區
Data = RFRegRead(RegControl); //讀取Control寄存器
Data |= 0x01; //Bit0置1清FIFO
RFRegWrite(RegControl, Data); //設置Control寄存器
//判斷FIFO緩沖區是否被清空
for(i = 0; i < 0x10; i++)
{
Data = RFRegRead(RegFIFOLength); //讀取FIFOLength寄存器
if(Data == 0) //判斷FIFOLength寄存器是否已為0
return 0; //成功
for(j = 0; j < 100; j++); //延時
}
return 1; //失敗
}
//Read_FIFO---------------------------------------------------------------*
//功 能: 讀RC531的FIFO寄存器 *
//參 數: *Send_Buf *
//返 回: Length 讀得數據長度 *
// Send_Buf[Length] 讀出的數據置于發送,接收緩沖區中 *
//------------------------------------------------------------------------*
INT8U Read_FIFO(INT8U *Send_Buf)
{
INT8U Length;
INT8U i;
//獲得FIFOLength緩沖區內數據長度
Length = RFRegRead(RegFIFOLength);
//根據緩沖區長度依次讀取數據
for (i = 0; i < Length; i++)
Send_Buf[i] = RFRegRead(RegFIFOData);
return Length;
}
//Write_FIFO--------------------------------------------------------------*
//功 能: 讀RC531的FIFO寄存器 *
//參 數: Length: 要寫入的字節數 *
// Send_Buf: 待發送數據應放在Send_Buf緩沖區中 *
//返 回: 無 *
//------------------------------------------------------------------------*
void Write_FIFO(INT8U *Send_Buf, INT8U Length)
{
INT8U i;
//寫入
for (i = 0; i < Length; i++)
RFRegWrite(RegFIFOData, Send_Buf[i]);
}
//------------------------------------------------------------------------*
//2.RC531的復位及初始化 *
//------------------------------------------------------------------------*
//RFReset-----------------------------------------------------------------*
//功 能: 端口設置和射頻芯片復位 *
//參 數: 無 *
//返 回: 0 - 初始化成功 ;1 - 初始化失敗 *
//------------------------------------------------------------------------*
INT8U RFReset(void)
{
INT8U i;
INT8U data;
//控制端口設置
RF_CTL_D |= (1 << RF_RST); //設置RF_RST為輸出
RF_CTL_D &= ~(1 << RF_IRQ); //設置RF_IRQ為輸入
SPI1Init(); //SPI1初始化(與RC531通信)模擬主機
//RF復位,下降沿復位
RF_CTL_D |= 1 << RF_RST; //高電平復位
for(i = 0; i < 200; i++); //延時,等待高電平穩定
RF_CTL_D &= ~(1 << RF_RST); //初始化RF_RST為低
for(i = 0; i < 5000; i++); //復位后等待一定的時間,必須!
//驗證初始化是否成功
RFRegWrite(RegPage, 0); //線性地址模式
RFRegWrite(0x29, 0x20); //寫$20到寄存器FIFOLevel($29)
data = RFRegRead(0x29); //讀寄存器FIFOLevel($29),驗證寫入是否正確
if (data == 0x20)
return 0; //初始化成功
else
return 1; //初始化失敗
}
//RC531_Init--------------------------------------------------------------*
//功 能: 禁止中斷及清除中斷標志 *
//參 數: 無 *
//返 回: 無 *
//------------------------------------------------------------------------*
void RC531_Init(void)
{
RFRegWrite(RegPage, 0x00); //線性地址模式
RFRegWrite(RegInterruptEn, 0x7f); //禁止所有中斷
RFRegWrite(RegInterruptRq, 0x7f); //中斷標識清零
}
//------------------------------------------------------------------------*
//3.RC531的讀卡操作 *
//------------------------------------------------------------------------*
//RC531_14443ABInit-------------------------------------------------------*
//功 能: 初始化RC531各相關寄存器 *
//參 數: Tagtype - 電子標簽類型 *
// 0 - ISO14443B; 1 - ISO14443A *
//返 回: 無 *
//------------------------------------------------------------------------*
void RC531_14443ABInit(INT8U Tagtype)
{
INT16U i;
//設置線性地址模式
RFRegWrite(RegPage, 0x00);
//根據電子標簽類型進行相應的RC531寄存器初始化
if(Tagtype)
{
//ISO14443A電子標簽
//第2頁 傳送器與編碼器控制
RFRegWrite(RegTxControl, 0x5b); //0x5b, 幅移鍵控ASk 100%
RFRegWrite(RegCwConductance, 0x3f); //0x3f, 設置輸出驅動的電導系數
RFRegWrite(RegModConductance, 0x3f); //0x3f, 調制比 100%
RFRegWrite(RegCoderControl, 0x19); //0x19, TypeA模式,波特率106kbps,米勒編碼
RFRegWrite(RegTypeBFraming, 0x00); //0x00, EGT=0
//第3頁 接收器與解碼器控制
RFRegWrite(RegDecoderControl, 0x08); //0x08, ISO14443A幀,曼徹斯特編碼
RFRegWrite(RegRxThreshold, 0xff); //0xff, 可接收的最小信號強度
RFRegWrite(RegBPSKDemControl, 0x1e); //0x00, 忽略EOF,打開高通濾波
RFRegWrite(RegClockQControl, 0x00); //0x3f, Q時鐘控制
//第4頁 射頻時間和通道冗余
RFRegWrite(RegRxWait, 0x06); //0x06, 設置接收延時
RFRegWrite(RegChannelRedundancy, 0x03); //0x03, TypeA接收冗余校驗
RFRegWrite(RegCRCPresetLSB, 0x63); //0x63, CRC預設值
RFRegWrite(RegCRCPresetMSB, 0x63); //0x63, CRC預設值
}
else
{
//ISO14443B電子標簽
//第2頁 傳送器與編碼器控制
RFRegWrite(RegTxControl, 0x4b); //0x4b, 13.56MHz
RFRegWrite(RegCwConductance, 0x3f); //0x3f, 設置輸出驅動的電導系數
RFRegWrite(RegModConductance, 0x06); //0x06, 幅移鍵控ASk 12%
RFRegWrite(RegCoderControl, 0x20); //0x20, TypeB,波特率106kbps, NRZ編碼
RFRegWrite(RegTypeBFraming, 0x23); //0x23, 定義ISO14443B幀格式
//第3頁 接收器與解碼器控制
RFRegWrite(RegDecoderControl, 0x19); //0x19, ISO14443B幀,BPSK編碼
RFRegWrite(RegRxThreshold, 0x44); //0x44, 可接收的最小信號強度
RFRegWrite(RegBPSKDemControl, 0x3e); //0x3e, 忽略EOF,打開高通濾波
RFRegWrite(RegClockQControl, 0x07); //0x3f, Q時鐘控制
//第4頁 射頻時間和通道冗余
RFRegWrite(RegRxWait, 0x06); //0x06, 設置接收延時
RFRegWrite(RegChannelRedundancy, 0x2c); //0x2c, TypeB接收冗余校驗
RFRegWrite(RegCRCPresetLSB, 0xff); //0xff, CRC預設值
RFRegWrite(RegCRCPresetMSB, 0xff); //0xff, CRC預設值
}
//延時
for(i = 0; i < 1000; i++);
}
//ReadTag-----------------------------------------------------------------*
//功 能: 讀卡函數 *
//參 數: Tagtype - 電子標簽類型(0 - ISO14443B; 1 - ISO14443A) *
//出 口: UIDLen - UID數據長度, UID_Buf[] - UID數據數組 *
//返 回: 1,2,3 - 操作失敗;0 - 操作成功 *
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -