搜索
bottom↓
回复: 2

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

[复制链接]

出0入0汤圆

发表于 2012-11-29 17:19:10 | 显示全部楼层 |阅读模式
#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周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-11-30 08:47:38 | 显示全部楼层
你先做一个简单的发送程序试试吧,大家都没时间把你的程序看完的。

出0入0汤圆

 楼主| 发表于 2012-12-9 12:35:17 | 显示全部楼层
我做了,可以发送,但是不知道这个程序为什么不行啊,谁能帮帮我啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-2 05:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表