971626996 发表于 2012-11-29 17:19:10

下面MSp430代码上位机怎么不能接收啊

#include "include.h"
#include "msp430x14x.h"
#include "string.h"
#define nData 10
unsigned char nRxBuff = 0;
unsigned char buf;
unsigned char cBuf;
signed char RXTXstate;                //发送数据计数
unsigned char flags;                    //标志
unsigned char RXErrorFlag;
unsigned char RXflag;                    //缓存中数据指示
unsigned char i_reg;                    //中断寄存器
unsigned char UID;             //UID
unsigned char UU;
unsigned char Data;
unsigned char CollPoss;
unsigned char RevBuffer;      //接收到个数据
unsigned char Rbuf;
unsigned char IDA;
//unsigned char CmdValid=0;
unsigned char   ID=0;// ID=1 读到 15693卡 UIDID=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);
}   
}

void send_cstring(unsigned char *pstr)
{
        while(*pstr != '\0')
        {
          uart_putchar(*pstr++);
        }
}


//****************************************************************
// 功能描述 : 系统主循环函数
// 输入参数 : 无
// 返回参数 : 无
// 说    明 :
//****************************************************************

void main(void)
{
    unsigned char command;
    volatile unsigned int i=0;
//unsigned char command;
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 = ChipStateControl;   // 打开 RF 发射和接收
   command = 0x21;               // RFID模块RF场始能,接收始能
   command = ISOControl;                // ISO15693
    switch(RevBuffer)//默认为15693协议
      {
      case 0x01:          //寻卡
      case 0x24:          //写多重块
      case 0x26:          //重起准备
      case 0x27:          //写AFI
      case 0x29:          //写DSFID         
      case 0x2B:          //获得系统信息
      case 0x2C:          //获得多重块安全状态
      command = 0x02;                      // ISO15693 高速, 单载波, 4出1
      break;
      case 0x20:          //读单一块
      command = 0x01;                      // ISO15693 低速, 单载波, 256出1
       break;
      case 0x21:          //写单一块
      case 0x23:          //读多重块
      command = 0x03;                     // ISO15693 高速, 单载波, 256出1
      break;
      }

      WriteSingle(command, 4);      
      DelayMs(5);       
      DirectCommand(&RevBuffer);   //直接写15693协议
      switch(RevBuffer)
      {
      case 0x01:      //写命令的时候是0X01
          flags = 0x06;
          ReadUID();
          GetUID();
       // putstr(UID,8);      
          break;
   
      case 0x20://读单块,写命令的格式是:20 起始块,最好能够写到6个字节,便于下一次写入命令
      switch(RevBuffer)
      {
      case 0x00:
          ReadSingleBlock(RevBuffer);
      break;
      case 0x01:
          ReadSingleBlockWithAdd(RevBuffer);
          break;
      }   
      putstr(Data,4);      
      break;
      case 0x21://写单块,写命令的格式是:21 起始块 数据,总共6个字节
         WriteSingleBlock(RevBuffer);
         putstr("1111",4);
      break;
      case 0x23://读两块,写命令的格式是:23 起始块 块的数量,最好能够写6个字节,便于下一次写入命令,
      //FIFO为12个字节,所以每次最多读两块,即8个字节
      ReadMultipleBlock(RevBuffer,RevBuffer);//Bsize为1,表示读两块,即读的块数是(Bsize+1)
      putstr(Data,(RevBuffer)*4);
      break;
      case 0x24://写多块,写命令的格式是:24 起始块 块的数量
      WriteMultipleBlock(RevBuffer,RevBuffer);
      putstr("88888888",8);
      break;
      case 0x26://复位准备
      ResetToReday();
      putstr("98979561",8);
      break;
      case 0x27://写AFI,应用族识别符,应用的卡预选准则
      //命令格式为:27 AFI
      WriteAFI(RevBuffer);
      putstr("RevBuffer",4);
      break;
      case 0x29://写DSFID,DSFID指明了应答器存储的数据结构
      //命令格式为:29 DSFID
      WriteDSFID(RevBuffer);
       putstr("RevBuffer",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,RevBuffer);
      putstr(Data,RevBuffer+1);
      
      break;
      //default:
      //putstr("0123456789",10);
      //break;
      }

    /* for(i=0;i<8;i++)
      uart_putchar(UID);
      ID=0;*/

      command = ChipStateControl; // 关闭RF 发射和接收
      command = 0x01;            // RFID模块RF场关闭,接收关闭
      WriteSingle(command, 2);      
      DelayMs(5);
      
      command = 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 = RXBUF0;
         nRxBuff++;
   if(nRxBuff==15)
          nRxBuff=0;
}


   
}



//**********************************************************************************
// 功能描述 : IRQ中断服务程序
// 输入参数 : 无
// 返回参数 : 无
//**********************************************************************************
#pragma vector = PORT2_VECTOR
__interrupt void IRQ(void)               
{
    unsigned char Register;
    stopCounter;                  // 停止超时计数器
    do
    {
      irqCLR;                          //PORT2 interrupt flag clear
      Register = IRQStatus;          
      ReadSingle(Register, 1);          // 读IRQ状态寄存器
      if(*Register == 0xA0)                     // TX active and only 3 bytes left in FIFO
      {       
            goto FINISH;
      }
      InterruptHandlerReader(&Register);
    } while((irqPORT & irqPIN) == irqPIN);
FINISH:
    LPM0_EXIT;
}

qiuchen 发表于 2012-11-30 08:47:38

你先做一个简单的发送程序试试吧,大家都没时间把你的程序看完的。

971626996 发表于 2012-12-9 12:35:17

我做了,可以发送,但是不知道这个程序为什么不行啊,谁能帮帮我啊
页: [1]
查看完整版本: 下面MSp430代码上位机怎么不能接收啊