📄 main.c
字号:
#include <msp430x44x.h>
#define uchar unsigned char
//====================================================================
#define si P6IN&BIT0 //P6.6 12
#define sck(a) a?(P6OUT |=BIT1):(P6OUT &=~BIT1)//p6.5 13
#define so(a) a?(P6OUT |=BIT2):(P6OUT &=~BIT2)//p6.4 14
#define cs(a) a?(P6OUT |=BIT3):(P6OUT &=~BIT3)//p6.3 15
#define rst1702(a) a?(P6OUT |=BIT4):(P6OUT &=~BIT4)//p6.2 23
#define led(a) a?(P6OUT |=BIT5):(P6OUT &=~BIT5)//p6.5 LED
//;==============================================
//;FM1702SL控制寄存器定义
//;==============================================
#define Page_Reg 0x00 //选择寄存器组
#define Command_Reg 0x01 //指令寄存器
#define FIFO_Reg 0x02 //64ByteFIFO输入输出寄存器
#define FIFOLength_Reg 0x04 //当前FIFO内的Byte数
#define SecondaryStatus_Reg 0x05 //各种状态标示位寄存器
#define InterruptEn_Reg 0x06 //中断使能/禁止控制寄存器
#define InterruptRq_Reg 0x07 //中断请求标示寄存器
#define Control_Reg 0x09 //各种控制标示寄存器
#define ErrorFlag_Reg 0x0A //上一条指令结束后错误标示
#define BitFraming_Reg 0x0F //调整面向BIT 的特格式
#define TxControl_Reg 0x11 //发射器控制寄存器
#define CwConductance_Reg 0x12 //选折发射脚TX1和TX2的发射天线阻抗
#define RxControl2_Reg 0x1E //发射器控制寄存器
#define ChannelRedundancy_Reg 0x22 //选择数据效验种类格式模式
#define RxWait_Reg 0x21 //选择发射发射的时间间隔
//;==============================================
//;FM1702SL发送命令代码
//;==============================================
#define WriteEE 0x01 //从FIFO惠存反读取数据并写入闪存中
#define LoadKeyE2 0x0B //将密钥从闪存复制到key中
#define Transmit 0x1A //发送FIFO缓存数据
#define Transceive 0x1E //发送FIFO缓存数据,发送完后自动激活接收电路
#define Authent1 0x0C //执行cryptorsuanfa 算法的认证过程的第一步
#define Authent2 0x14 //执行cryptorsuanfa 算法的认证过程的第二步
uchar rf_over;
char ack,retc,m,buff[48],Card_UID[5];
char mm[6]={0xff,0xff,0xff,0xff,0xff,0xff};
////===============================================
//以下为FM1702读写的子程序
//===============================================
char SPIRead(char SpiAddress,char *ramadr,char width);
char SPIWrite(char SpiAddress,char *ramadr,char width);
char SPI_Init();
char FM1702SL_Init();
char Clear_FIFO();
char Write_FIFO(char *ramadr,char width);
char Read_FIFO(char *ramadr);
char Request();
char Command_Send(char comm,char *ramadr,char width);
char Get_UID();
char Select_Tag();
char Load_Key(char n,char *ramadr);
char Load_Key_EE(char n);
char Authentication(char n);
char rdbuff(char sq,char n);
char Read_Block(char n); //
char Write_Block(char *ramadr,char n);
///+++++++++++++++++card++++++++++++++++++++++++///
//void wiegend(char *ramadr,char n);
void inisub();
void rddel();
void delay50us();
void delay1ms(unsigned int n);
main()
{
WDTCTL=WDTPW+WDTHOLD; //禁止看门狗
inisub();//初始化端口
//led(1);
while(1)
{
delay1ms(40);
rst1702(0);
delay1ms(20);
retc=SPI_Init();
if(retc) goto cardsub_end1;//错误
retc=FM1702SL_Init();
if(retc) goto cardsub_end1;
retc=Request();
if(retc)
{rf_over=0;
//led(1);
goto cardsub_end1;}
if(rf_over) goto cardsub_end1;
retc=Get_UID();
if(retc)
{delay1ms(10);
retc=Get_UID();
}
if(retc) goto cardsub_end1;
retc=Select_Tag();
led(1);
if(retc)goto cardsub_end1;
//**********寻卡结束********************//
retc=Load_Key(0x80,mm);//加载购电区的密钥
if(retc)goto cardsub_end1;//待定
retc=Load_Key_EE(0x80);//加载购电区的密钥
if(retc)goto cardsub_end1;//待定
//***********开始卡操作******************//Load_Key Load_Key_EE
retc=rdbuff(0x7,0x4);//读块0
if(retc){goto cardsub_end1;}
retc=Write_Block(buff,0x4);
if(retc){goto cardsub_end1;}
rf_over=1;
led(0);
cardsub_end1:
rst1702(1);
}
}
////////////////////延时////////////////////
void rddel()
{ _NOP();
_NOP();
_NOP();
_NOP();
_NOP();
}
/////////////////////////////////////////////////////////////////
void delay1ms(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<150;j++); // 按一指令1us来计算
}
}
//////////////////////////////////////////////////////////////////
void delay50us()
{int i;
for (i=3;i>0;i--)
rddel();
}
////////////////初始化//////////////////////////////////
void inisub()
{
P6DIR=0x00;
P6DIR |=BIT1; // P6.1为SCK输出
P6DIR |=BIT2; // P6.2为SI输出
P6DIR |=BIT3; // P6.3为SPI-CS输出
P6DIR |=BIT4; // P6.4为RST1702输出
P6DIR |=BIT5; // P6.5为LED指示灯输出
P6DIR &=~BIT0; // P6.0为信号输入 FM1702为SO输出
P6SEL = 0;
}
////////////////SPI读//////////////////////////////////////
char SPIRead(char SpiAddress,char *ramadr,char width)
{ char i,j,adrtemp;
adrtemp=SpiAddress;
if((adrtemp&0xc0)==0)
{adrtemp=((adrtemp<<1)|0x80);
cs(0);
for(i=0;i<8;i++)
{if((adrtemp<<i)&0x80)
so(1);
else so(0);
sck(1);
_NOP();
_NOP();
_NOP();
_NOP();
sck(0);
// adrtemp=adrtemp<<1;
}
for(j=0;j<width;j++)
{if(j!=width-1) adrtemp=(SpiAddress|0x40)<<1;
else adrtemp=0;
ramadr[j]=0;
for(i=0;i<8;i++)
{if((adrtemp<<i)&0x80)
so(1);
else so(0);
sck(1);
ramadr[j]=ramadr[j]<<1;
if(si)ramadr[j]+=0x1;
sck(0);
// adrtemp=adrtemp<<1;
}
}
cs(1);
return(0);
}
else return(1);
}
//=======================================================
//SPI写入程序
//入口:
//SpiAddress: 要写到FM1702SL内的寄存器地址[0x01~0x3f]
//*ramadr 要写入的数据在Ram中的首地址
//width: 要写入的字节数
//出口: 0:成功,1:失败
//作者: 张
//====================================================
char SPIWrite(char SpiAddress,char *ramadr,char width)
{char i,j,adrtemp;
adrtemp=SpiAddress;
if((adrtemp&0xc0)==0)
{adrtemp=((adrtemp<<1)&0x7e);
cs(0);
for(i=0;i<8;i++)
{if((adrtemp<<i)&0x80)
so(1);
else so(0);
sck(1);
_NOP();
_NOP();
_NOP();
sck(0);
// adrtemp=adrtemp<<1;
}
for(j=0;j<width;j++)
{adrtemp= ramadr[j];
for(i=0;i<8;i++)
{if((adrtemp<<i)&0x80)
so(1);
else so(0);
sck(1);
_NOP();
_NOP();
_NOP();
sck(0);
// adrtemp=adrtemp<<1;
}
}
cs(1);
return(0);
}
else return(1);
}
char SPI_Init()
{
char acktemp,temp[1];
acktemp=SPIRead(Command_Reg,temp,1);
if(acktemp) return(1);
if(temp[0]) return(1);
else
{ temp[0]=0x80;
acktemp=SPIWrite(Page_Reg,temp,1);
if(acktemp) return(1);
acktemp=SPIRead(Command_Reg,temp,1);
if(acktemp) return(1);
if(temp[0]) return(1);
acktemp=SPIWrite(Page_Reg,temp,1);
if(acktemp) return(1);
return(0);
}
}
char FM1702SL_Init()
{char acktemp,temp[1];
temp[0]=0x7f;
acktemp=SPIWrite(Interru tEn_Reg,temp,1);
if(acktemp) return(1);
temp[0]=0x7f;
acktemp=SPIWrite(InterruptRq_Reg,temp,1);
if(acktemp) return(1);
temp[0]=0x5b;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -