|
#include "include.h"
#include "msp430x14x.h"
#include "string.h"
#define nData 10
unsigned char nRxBuff = 0;
unsigned char buf[60];
unsigned char cBuf[20];
signed char RXTXstate; //发送数据计数
unsigned char flags; //标志
unsigned char RXErrorFlag;
unsigned char RXflag; //缓存中数据指示
unsigned char i_reg; //中断寄存器
unsigned char UID[8]; //UID
unsigned char UU[40];
unsigned char Data[50];
unsigned char CollPoss;
unsigned char RevBuffer[20]; //接收到个数据
unsigned char Rbuf[30];
unsigned char IDA[5];
//unsigned char CmdValid=0;
unsigned char ID=0; // ID=1 读到 15693卡 UID ID=2读到14443A卡UID
volatile unsigned char IRQ_Status;
unsigned char POLLING;
extern void putstr(unsigned char ch[],unsigned char length);
void delay(int n);
//-----------------------------------------------------
void delay(int n)
{
while(n--);
}
//延时1毫秒
void DelayMs(unsigned int n_ms)
{
unsigned int i ;
while(n_ms --)
{
for(i=0x2ee;i>0;i--);
}
}
void delay_ms(unsigned int n_ms) {
unsigned int ii1, ii0;
for(ii0=n_ms; ii0>0; ii0--) {
ii1 = 0x07FF; // Delay
do (ii1--);
while (ii1 != 0);
}
}
//************************************************************
// 异步串行通信
// 功能描述 : SCI初始化函数
// 输入参数 : 无
// 返回参数 : 无
// 说 明 :
//************************************************************
void Init_Sci(void)
{
P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD
ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD
UCTL0 |= CHAR; // 8-bit character
UTCTL0 |= SSEL0; // UCLK = ACLK
UBR00 = 0x03; // 32k/9600 - 3.41
UBR10 = 0x00; //
UMCTL0 = 0x4A; // Modulation
UCTL0 &= ~SWRST; // Initialize USART state machine
IE1 |= URXIE0; // Enable USART0 RX interrupt
}
//定时器A
void CounterSet(void)
{
TACTL |= TASSEL_2 + ID1 + ID0 + TACLR; //SMCLK, div 8, interrupt enable, timer stoped
TAR = 0;
TACCTL0 |= CCIE; //compare interrupt enable
TACTL &= ~TACLR; //reset the timerA
}
//*************************************************************
// 功能描述 : 获得一个字符
// 输入参数 : 无
// 返回参数 : 一个字符
// 说 明 :
//*************************************************************
unsigned char uart_getchar(void)
{
while (!(IFG1 & URXIFG0)); // USART0 TX buffer ready?
return RXBUF0;
}
//*************************************************************
// 功能描述 : 发送一字节函数
// 输入参数 : 字符
// 返回参数 : 无
// 说 明 :
//*************************************************************
void uart_putchar(unsigned char ch)
{
while((IFG1 & UTXIFG0)==0);//USART1 TX buffer ready?保证发送缓存为0
TXBUF0=ch;
}
//**************************************************************
// 功能描述 : 发送字符串函数
// 输入参数 : 字符数组
// 返回参数 : 无
// 说 明 :
//**************************************************************
void putstr(unsigned char ch[],unsigned char length)
{
unsigned char i;
for(i=0;i<length;i++)
{
uart_putchar(ch[i]);
}
}
void send_cstring(unsigned char *pstr)
{
while(*pstr != '\0')
{
uart_putchar(*pstr++);
}
}
//****************************************************************
// 功能描述 : 系统主循环函数
// 输入参数 : 无
// 返回参数 : 无
// 说 明 :
//****************************************************************
void main(void)
{
unsigned char command[4];
volatile unsigned int i=0;
//unsigned char command[12];
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P6OUT =0xff;
P6DIR = 0Xff; //LED,设置P6为输出
LED2ON; //LED2ON P6OUT &= ~BIT6
BCSCTL1 &= ~XT2OFF; // XT2on 开启高速晶体振荡器
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG)); // OSCFault flag still set?
BCSCTL2 |= SELM_2 + SELS; // MCLK = SMCLK = XT2 (safe)
IRQ_Status = 0;
Init_Sci(); //串口初始化
InitPort(); //端口设置
Initial7960s(); //初始化7960
delay(20);
_EINT(); //开启总中断
while(1)
{
FindTag(0x00);
_BIS_SR(LPM3_bits+GIE);//Enter LPM3 w/interrupt
DelayMs(25);
while((IFG1&UTXIFG0)==0);
if(1==ID) //15693
{
command[0] = ChipStateControl; // 打开 RF 发射和接收
command[1] = 0x21; // RFID模块RF场始能,接收始能
command[2] = ISOControl; // ISO15693
switch(RevBuffer[0])//默认为15693协议
{
case 0x01: //寻卡
case 0x24: //写多重块
case 0x26: //重起准备
case 0x27: //写AFI
case 0x29: //写DSFID
case 0x2B: //获得系统信息
case 0x2C: //获得多重块安全状态
command[3] = 0x02; // ISO15693 高速, 单载波, 4出1
break;
case 0x20: //读单一块
command[3] = 0x01; // ISO15693 低速, 单载波, 256出1
break;
case 0x21: //写单一块
case 0x23: //读多重块
command[3] = 0x03; // ISO15693 高速, 单载波, 256出1
break;
}
WriteSingle(command, 4);
DelayMs(5);
DirectCommand(&RevBuffer[0]); //直接写15693协议
switch(RevBuffer[0])
{
case 0x01: //写命令的时候是0X01
flags = 0x06;
ReadUID();
GetUID();
// putstr(UID,8);
break;
case 0x20://读单块,写命令的格式是:20 起始块,最好能够写到6个字节,便于下一次写入命令
switch(RevBuffer[2])
{
case 0x00:
ReadSingleBlock(RevBuffer[1]);
break;
case 0x01:
ReadSingleBlockWithAdd(RevBuffer[1]);
break;
}
putstr(Data,4);
break;
case 0x21://写单块,写命令的格式是:21 起始块 数据,总共6个字节
WriteSingleBlock(RevBuffer[1]);
putstr("1111",4);
break;
case 0x23://读两块,写命令的格式是:23 起始块 块的数量,最好能够写6个字节,便于下一次写入命令,
//FIFO为12个字节,所以每次最多读两块,即8个字节
ReadMultipleBlock(RevBuffer[1],RevBuffer[2]);//Bsize为1,表示读两块,即读的块数是(Bsize+1)
putstr(Data,(RevBuffer[2])*4);
break;
case 0x24://写多块,写命令的格式是:24 起始块 块的数量
WriteMultipleBlock(RevBuffer[1],RevBuffer[2]);
putstr("88888888",8);
break;
case 0x26://复位准备
ResetToReday();
putstr("98979561",8);
break;
case 0x27://写AFI,应用族识别符,应用的卡预选准则
//命令格式为:27 AFI
WriteAFI(RevBuffer[1]);
putstr("RevBuffer[1]",4);
break;
case 0x29://写DSFID,DSFID指明了应答器存储的数据结构
//命令格式为:29 DSFID
WriteDSFID(RevBuffer[1]);
putstr("RevBuffer[1]",4);
break;
case 0x2B://获取系统信息,返回值的格式说明:
//00 = no error,
//0F=Tag reference field present,Tag memory field present,Tag AFI field present,Tag DSFID field present
//6EADD606000007E0 : Reverse byte ordered.Normal UID byte order is EO 07 00 00 06 D6 AD 6E.
//19 : Data Storage Format ID
//33 : AFI
//3F 03 88 : 3F meaning number of blocks = 64,03 meaning block size = 32 bits,8F defined by tag manufacturer
GetSystemInfo();
putstr(Data,15);
break;
case 0x2C:
//命令格式是:2c 起始块 块的大小
//获得多块的安全状态,返回值格式说明
//00 :00 no tag error,
//00 : 00 security status of block number 00 (block #1),
//00 : 00 security status of block number 01 (block #2),
GetMult_BlkSelStatus(RevBuffer[1],RevBuffer[2]);
putstr(Data,RevBuffer[2]+1);
break;
//default:
//putstr("0123456789",10);
//break;
}
/* for(i=0;i<8;i++)
uart_putchar(UID[i]);
ID=0;*/
command[0] = ChipStateControl; // 关闭RF 发射和接收
command[1] = 0x01; // RFID模块RF场关闭,接收关闭
WriteSingle(command, 2);
DelayMs(5);
command[0] = IRQStatus;
ReadSingle(command, 1); // 清除 IRQs
DelayMs(5);
}
if(2==ID) //14443A
{
//uart_putchar(0x07);
//uart_putchar(0x02);
InitialSettings();//14443A初始化设置
FindTags(0x00);
ID=0;
}
}
}
//**********************************************************************************
// 功能描述 : 接收中断服务程序
// 输入参数 : 无
// 返回参数 : 无
//**********************************************************************************
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerAhandler(void)
{
unsigned char Register;
stopCounter; // 停止接收超时定时器
irqCLR; // 清除中断标志
Register = IRQStatus; // IRQ 状态地址
ReadSingle(&Register, 1); //读状态IRQ状态寄存器
Register = Register & 0xF7; //消除奇偶位
if(Register == 0x00)
{
i_reg = 0x00; // 无任何中断,接收超时
}
else
{
i_reg = 0x01; // 如果有中断发生, 但是已经清除了PORT2的IRQ中断标志,发送: 发送还没有结束
}
LPM0_EXIT;
}
#pragma vector=USART0RX_VECTOR
__interrupt void usart0_rx (void)
{
_BIC_SR_IRQ(LPM3_bits);//Clear LPM3 bits
if(nRxBuff<=15)
{
RevBuffer[nRxBuff] = RXBUF0;
nRxBuff++;
if(nRxBuff==15)
nRxBuff=0;
}
}
//**********************************************************************************
// 功能描述 : IRQ中断服务程序
// 输入参数 : 无
// 返回参数 : 无
//**********************************************************************************
#pragma vector = PORT2_VECTOR
__interrupt void IRQ(void)
{
unsigned char Register[1];
stopCounter; // 停止超时计数器
do
{
irqCLR; //PORT2 interrupt flag clear
Register[0] = IRQStatus;
ReadSingle(Register, 1); // 读IRQ状态寄存器
if(*Register == 0xA0) // TX active and only 3 bytes left in FIFO
{
goto FINISH;
}
InterruptHandlerReader(&Register[0]);
} while((irqPORT & irqPIN) == irqPIN);
FINISH:
LPM0_EXIT;
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
该献的血还是要献的。你不献他不献。难道让我去献? --- 出自坛友:lovejp1981
|