📄 6301.c
字号:
/******************** (C) COPYRIGHT 2003 SHHIC ********************
* File Name : 6301.h
* Author : wuyuhuai
* Date First Issued : 05/29/2007
* Description : This file contains all the functions prototypes for the
* TIM software library.
* History:
* 29/05/2007 : V1.0
p1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 P1.8 P1.9 P1.10 P1.11 P1.12 P1.13 P1.14 P1.15
| | | | | | | | | | |
D0 D1 D2 D3 D4 D5 D6 D7 DATA_CLK EN2 EN
===============================================================================*/
#include "6301.h"
#include "71x_lib.h"
/*
=======================================================================================================================
=======================================================================================================================
*/
void DelayMs(unsigned int n_ms)
{
u16 i,j;
for(j=1;j<=n_ms;j++)
for(i=0;i<2275; i++);
}
// 1.2ms delay
//***** P1.[0:11] out_PP Init [P1.10:EN]=1
void InitIO(void)
{
}
static void Delay10Us(void)
{
for(int i = 0; i<19; i++);
}
static void DelayUs(int timervalue)
{
int i,j;
for(j=0;j<timervalue;j++)
for(i = 0; i <2; i++);
}
// ***** get data from TRF7963
char Data_Input()
{
u8 Read_data;
CMOS_INPUT;
Read_data =GPIO_ByteRead(GPIO1,GPIO_LSB);
Delay10Us();
return Read_data;
}
// ***** paralell out put data to TRF7963 P1.[0:7]
char Data_Output(char data)
{
PP_OUTPUT;
GPIO_ByteWrite(GPIO1,GPIO_LSB,data);
Delay10Us();
return data;
}
// **** Init [P1.8:DATA_CLK]=0
void CLK_Low(void)
{
GPIO_BitWrite(GPIO1,8,0x00);// Init [P1.8:DATA_CLK]=0
Delay10Us();
Delay10Us();
}
// **** Init [P1.8:DATA_CLK]=1
void CLK_High(void)
{
GPIO_BitWrite(GPIO1,8,0x01);// Init [P1.8:DATA_CLK]=1
Delay10Us();
}
// **** 在CLK高电平时 P1.[0:7] 上升沿
// a1 d1 a2 d2 start
void Start_Condition(void)
{
// start condition
CLK_High();
Data_Output(0x00);
Data_Output(0xFF);
CLK_Low();
}
// **** 在CLK高电平时 P1.[0:7] 下降沿
// a1 d1 a2 d2 stop
void Stop_Condition(void)
{
// stop condition
CLK_High();
Data_Output(0xFF);
Data_Output(0x00);
CLK_Low();
}
// a1 d1 d2 d3 d4 stop
void Stop_Continue(void)
{
// stop continue condition
CLK_Low();
Data_Output(0x00);
Data_Output(0xFF);
Data_Output(0x00);
}
//***** MCU send cmd to TRF7963
void TRF7963_cmd(char cCmd)
{
// start condition
Start_Condition();
// send cmd
Data_Output(cCmd|TRF7963_CMD); // 置 bit7=1
CLK_High();
CLK_Low();
// stop condition
Stop_Condition();
}
//**** MCU continous read
int TRF7963_gets(char cAddr, char *cData, int length)
{
int i;
// start continue condition
Start_Condition();
// send addr
Data_Output(cAddr | TRF7963_READ | TRF7963_CON_MODE); // 置 bit6=1 bit5=1
CLK_High();
CLK_Low();
// get data
for (i=0; i<length; i++)
{
CLK_High();
cData[i] = Data_Input();
CLK_Low();
}
// stop continue condition
Stop_Continue();
return i;
}
//***** MCU single send cAddr+ cData
//put cmd to TRF7963
//chip status control register
void TRF7963_putc(char cAddr, char cData)
{
// start condition
Start_Condition();
CLK_Low();
// addr
Data_Output(cAddr); // 在数据传输时 CLK产生一个下降沿
CLK_High();
CLK_Low();
// put data
Data_Output(cData);
CLK_High();
CLK_Low();
// stop condition
Stop_Condition();
}
//**** MCU continous write
// cFIFO_start means the address of cData, or else 0
// 地址含在cData内
int TRF7963_puts(char *cData, int length, char cFIFO_start, char bDelay)
{
int i;
// start continue condition
Start_Condition();
for (i=0; i<length; i++)
{
Data_Output(cData[i]);
CLK_High();
CLK_Low();
}
// stop continue condition
/*if(bDelay)
{
DelayMs(20);
}*/
Stop_Continue();
return i;
}
void InitTRF7963(void)
{
//EN |---
// __|
//EN2 |---
// ___|
//DATA-CLK
// --------
// EN high
//GPIO_BitWrite(GPIO1,10,0x01); // Init [P1.10:EN]=1
// EN2 high
// GPIO_BitWrite(GPIO1,9,0x01); // Init [P1.9:EN2]=1
// DATA_CLK output
GPIO_BitWrite(GPIO1,8,0x00); // Init [P1.8:DATA_CLK]=0
//Data_Input();
TRF7963_cmd(0x03);// TRF7963 soft init command Table 5-30
TRF7963_putc(0, 0x21); //RF output active,Receiver enable
//RF driver at 4 W
//AGC off
//RF output active
TRF7963_putc(1, 0x0C); //ISO14443B bit rate 106 kbps
TRF7963_putc(9, 0x16); //ASK 8.5%
//SYS_CLK 3.3MHz
}
// MCU single read from cAddr reg
// get data from TRF7963
char TRF7963_getc(char cAddr)
{
char cTmp;
// start condition
Start_Condition();
// addr
Data_Output(cAddr|TRF7963_READ);
CLK_High();
CLK_Low();
// get data
CLK_High();
cTmp = Data_Input();
CLK_Low();
// stop condition
Stop_Condition();
return cTmp;
}
/*TRF7963 function*/
//Get DATA FROM FIFO
int GetFIFOData(char *cBuf)
{
char cTmp, length;
length = 0;
// Read FIFO status register to determine number of bytes in FIFO
cTmp = TRF7963_getc(0x1C);
if(cTmp & 0x10) //FIFO overflow
{
return -1;
}
cTmp &= 0x0F; //how many bytes in the FIFO CTmp+1=num
// Read data from FIFO
if (cTmp)
{
TRF7963_gets(0x1F, cBuf+length, cTmp+1);
length += cTmp+1;
}
TRF7963_cmd(0x0F); //reset FIFO content and FIFO status register
// Any broken bytes in FIFO
cTmp = TRF7963_getc(0x1C); //再次读 FIFO status register
cTmp &= 0x0F;
if (cTmp)
{
TRF7963_gets(0x1F, cBuf+length, cTmp+1);
length += cTmp+1;
}
// reset FIFO
TRF7963_cmd(0x0F);
return length;
}
//TIM2 上升沿外部捕获 中断
void Init_IRQ(void)
{
EIC_IRQChannelConfig(T2TIMI_IRQChannel, ENABLE); //debug
EIC_IRQChannelPriorityConfig(T2TIMI_IRQChannel, 1); //debug
TIM_ICAPModeConfig(TIM2,TIM_CHANNEL_A,TIM_RISING);
TIM_ITConfig(TIM2,TIM_ICA_IT,ENABLE);
}
//****** Set P1.14 for interrupt
void Set_XTI(void)
{
GPIO_Config(GPIO1, 0x4000, GPIO_IN_TRI_TTL); // Set P1.14 for interrupt
XTI_Init(); // Initialize the XTI
XTI_LineModeConfig(XTI_Line8, XTI_RisingEdge); // Set Line 8 edge
XTI_LineConfig(XTI_Line8, ENABLE); // Enable the External interrupts on line 8
XTI_ModeConfig(XTI_Interrupt, ENABLE);
EIC_IRQChannelPriorityConfig(XTI_IRQChannel,3); // Set the XTI IRQ Channel priority to 3
EIC_IRQChannelConfig(XTI_IRQChannel,ENABLE); // Enable XTI IRQ Interrupts
EIC_IRQConfig( ENABLE ); // Enable interrupts
}
//***** 在 void XTI_IRQHandler(void) 对 IRQ_Status 赋值
int WaitforSignal(char cMask, int ms)
{
int i=0;
u8 Data_Length[3];
while (1)
{
if (IRQ_Status&cMask)
{
Data_Length[0]=IRQ_Status;
IRQ_Status = 0;
Data_Length[1]=IRQ_Status;
return 0;
}
else if (IRQ_Status)
{
Data_Length[2]=IRQ_Status;
i = IRQ_Status;
IRQ_Status = 0;
return i;
}
else if (i++ == ms)
{
break;
}
DelayMs(1);
}
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -