⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi_135.c.bak

📁 基于MSP430的电表终端上的CT检测程序
💻 BAK
字号:
//spi控制程序
//spi 协议:  70 08 读当前CT状态(430返回one_CT_state与two_CT_state两个值
//           70 09 启动初始化
//           70 07 启动检测
#include "msp430x13x.h"
extern unsigned char SpiTimeOverCount;
extern unsigned char MonotonyJudgeEN;//电流频率控制位
extern void clr_wdt(void);
extern void write_flash(void);
unsigned char SPIDataBuff[10];
unsigned char SPI_INT;         //SPI中断标志
unsigned char ReceiveStart;      //接收到头字节标志
unsigned char ReceiveEnd;       //接收到结束字节标志
unsigned char ReceiveAllData;    //接收到一个完整数据包标志
unsigned int  ReceiveBuffCount;   //SPI接收数据指针
unsigned char SPIRByteCheckout;   //SPI接收数据校验字
unsigned char SPITByteCheckout;   //SPI发送数据校验字
unsigned int  SPIRdataLong;       //主机发送的SPI数据包的长度,ReceiveBuffCount不能大于此数据
unsigned char ScendDataLongL;     //须发送的数据的长度
unsigned char ScendDataLongH;
unsigned int  SPIRTdataLong;       //本机发送的SPI数据包的长度,ReceiveBuffCount不能大于此数据
unsigned char ScendDataState;     //须发送的数据当前的状态
                                  //0x00:没有数据可以返回,需等待,数据长度无效
                                  //0x01:接收0x01命令的数据出错需重发,数据长度无效
                                  //0x02:数据准备好可以读取,数据长度有效.
unsigned char CRD;                //SPI发送校验字和
unsigned char EnableTUARTdata;    //Uart数据发送使能
extern void UARTReceiveDataCheck (void);
/*unsigned char testdata[]={
                          0x68, 0x3F, 0x00, 0x01, 0x68, 0x88, 0x11,
                          0x22, 0x35, 0x44, 0x0A, 0x0C, 0x61, 0x02,
                          0x01, 0x01, 0x03, 0x51, 0x15, 0x30, 0x12,
                          0x05, 0x84, 0x38, 0x00, 0x85, 0x10, 0x00,
                          0x60, 0x15, 0x00, 0x89, 0x12, 0x00, 0x00,
                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                          0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
                          0x10, 0x00, 0x10, 0x00, 0x10, 0x50, 0x23,
                          0x30, 0x23, 0x90, 0x22, 0x78, 0x00, 0x07,
                          0x01, 0x91, 0x00, 0xEE, 0xEE, 0x16};
*/


//CT 功能定义区//
unsigned char StartSaveCtdata;   //启动保存三相数据标志  1:保存三相数据  0:不保存
unsigned char start_CT_check;    //启动CT检测标志
extern unsigned char temp_H,temp_M,temp_L;
extern unsigned char temp_aH,temp_aM,temp_aL,temp_bH,temp_bM,temp_bL,temp_cH,temp_cM,temp_cL;
extern long  CT_current_A,CT_current_B,CT_current_C;
extern unsigned char two_CT_state;       //二次CT状态字
extern unsigned int BCD_to_HEX(unsigned char H,unsigned char M,unsigned char L);
unsigned char WriteCurrentSB;   //2410写入电流标志
extern unsigned int flash_data_buff[10];
#define study_state flash_data_buff[6]
#define LMD_state flash_data_buff[7]   //灵敏度调整
#define DEY_state flash_data_buff[8]   //延时修改
#define bc_state flash_data_buff[3]    //频率减去值
#define ZB_state flash_data_buff[9]   //电流屏蔽
extern unsigned int kl_count_a,kl_count_b,kl_count_c;
extern unsigned int dl_count_a,dl_count_b,dl_count_c;

unsigned char LMD_WRITE=0;       //灵敏度百分比1》1%  2》2%
unsigned char DEY_WRITE;
void InitSPI(void)            //SPI总线初始化程序
                                //配置为从机四线制通讯
{
 P3SEL|=0x0f;                    //开启P3.0~P3.3的第二功能(复用为SPI总线)
 UCTL0=CHAR+SYNC+SWRST;          //8位数据,SPI从模式,
// UxTCTL                       //不用配置,SPI数据上升沿输出,输入数据在下降沿初锁存
 U0ME=USPIE0;
 UCTL0&=~SWRST;
 IE1 |=URXIE0;
 _EINT();
 U0TXBUF=0x00;
 ReceiveStart=0;
 SPI_INT=0;
 SpiTimeOverCount=0;
}
void SPIReset (void)
{
  if((SpiTimeOverCount>1)&&(SPI_INT==1))
  {
    InitSPI();
  }

}

void scend_spi_data (unsigned char spi_data)
{ unsigned int TimeOut=0;   //超时计时器
  while(((IFG1&UTXIFG0)==0)&&(TimeOut<500))
  {
  clr_wdt();
  TimeOut++;      //超时计时
  }
  if(TimeOut<500)                      //发送超时判断!
  {U0TXBUF=spi_data;CRD=CRD+spi_data;}
  else InitSPI();
}

/*命令说明:
           命令字       终端指令                         说明
           0x01       echo XX > ptct_start           改变程序输出的频率数据状态,AA:输出为原始值,BB:输出为 原始值-基准值  
                                                     每次设置后须5秒才能对输出数据进行更新 程序默认为 BB.
                                                                               
      0x02 0x03 0x04  echo XX > ptct_seti            写入三相频率指令,在PROC下手动执行时"XX"是无效数据, 写入的电流是随机值
           0x05       echo XX > ptct_setct           改变1.2A以上频率补偿值, XX 为十六进制格式  频率补偿值=XX*100 Hz
           0x06       echo XX > ptct_setpt           改变检测延时次数,程序默认为70次  XX 为十六进制格式 大小不超过 150
           0x07       echo XX > ptct_param           设置检测灵敏度值  灵敏度为一个百分数, XX 为十六进制格式 大小不超过 99
           0x08       echo XX > ptct_result          无效命令
           0x09       echo XX > ptct_study           启动自学习指令,XX可为任意数,每执行一次就启动一次自学习,

           0x81       more ptct_start                返回一个字节  终端程序给430写入电流次数的计数器值, 大于3后会清0
      0x82 0x83 0x84  more ptct_seti                 返回三个字节  依次为当前三相的检测频率
           0x85       more ptct_setct                返回三个字节  1Byte:程序版本号  2Byte:当前频率的补偿值  3Byte: 无效
           0x86       more ptct_setpt                返回三个字节  1Byte:当前检测延时次数 2/3Byte:AC相的开路有效检测计数器值
           0x87       more ptct_param                返回三个字节  依次为ABC三相的短路路有效检测计数器值
           0x88       more ptct_result               返回二个字节  1Byte: CT一次侧开路与短路状态 2Byte : CT二次侧开路与短路状态
           0x89       more ptct_study                返回一个字节  终端总共学习的次数,每学习一次此值会加1,大于20则归0

*/

void SPICTOrder(void)
{
 unsigned char order;
 order=SPIDataBuff[1];
 if(SPIDataBuff[0]==0x70)
 {
   switch (order)
  {
     case 0x81 :  scend_spi_data(ZB_state);

     case 0x01 :  ZB_state=SPIDataBuff[2];           //echo x > ptct_start  //去掉1A以上减频率的操作
                  clr_wdt();
                  write_flash();
                  clr_wdt();
                  break;

     case 0x02 :  if(start_CT_check<3)             //echo XXXXXXXX > ptct_seti  写入电流值
                  CT_current_A=BCD_to_HEX(SPIDataBuff[2],SPIDataBuff[3],SPIDataBuff[4]);
                  break;

     case 0x03 :  if(start_CT_check<3)
                  CT_current_B=BCD_to_HEX(SPIDataBuff[2],SPIDataBuff[3],SPIDataBuff[4]);
                  break;

     case 0x04 :  if(start_CT_check<3)
                  {
                   CT_current_C=BCD_to_HEX(SPIDataBuff[2],SPIDataBuff[3],SPIDataBuff[4]);
                   start_CT_check++;
                   WriteCurrentSB=1;
                  }
                  break;

     case 0x05 :  bc_state=SPIDataBuff[2];     //echo xx > ptct_setct  改变频率补偿值
                  clr_wdt();
                  write_flash();
                  clr_wdt();
                  break;

     case 0x06 :  DEY_WRITE=SPIDataBuff[2];     //echo xx > ptct_setpt //改变延时检测长度
                  DEY_state=DEY_WRITE;
                  clr_wdt();
                  write_flash();
                  clr_wdt();
                  break;

     case 0x07 :  LMD_WRITE=SPIDataBuff[2];   //echo xx > ptct_param
                  break;
     case 0x08 :  scend_spi_data(two_CT_state);       //二次CT状态字
                  scend_spi_data(0x00);       //一次CT状态字只能为0
                  break;
     case 0x09 :  StartSaveCtdata=0x01;      //echo 1 > ptct_study;
                  break;


    case 0x88 :   scend_spi_data(two_CT_state);       //二次CT状态字  //more ptct_result
                  scend_spi_data(0x00);       //一次CT状态字只能为0
                  break;

     case 0x82 :                               //more ptct_seti
                  scend_spi_data(temp_aH);
                  scend_spi_data(temp_aM);
                  scend_spi_data(temp_aL);
                  break;

     case 0x83 :
                  scend_spi_data(temp_bH);
                  scend_spi_data(temp_bM);
                  scend_spi_data(temp_bL);
                  break;

     case 0x84 :
                  scend_spi_data(temp_cH);
                  scend_spi_data(temp_cM);
                  scend_spi_data(temp_cL);
                  break;
     case 0x85 :  scend_spi_data(0x52);    //more ptct_setct
                  scend_spi_data(bc_state);
                  
                  break;
     case 0x87 :  scend_spi_data(dl_count_a);  //more ptct_param
                  scend_spi_data(dl_count_b);  //输出ABC相的短路计算值
                  scend_spi_data(dl_count_c);

     case 0x86 :  scend_spi_data(DEY_WRITE); //more ptct_setpt
                  scend_spi_data(kl_count_a);//输出AC相的开路计数值
                  scend_spi_data(kl_count_c);

     case 0x89 :  scend_spi_data(study_state); //more ptct_study
                  break;
     default   :
                  break;

    }
  }

}


#pragma vector=USART0RX_VECTOR
__interrupt void SPI0_rx (void)
{ //unsigned char Buff;//,temp1;
  //Buff=U0RXBUF;
   SPI_INT=1;
   if((U0RXBUF==0x70)&&(ReceiveStart==0))
   {ReceiveBuffCount=0;
    ReceiveStart=1;
    SpiTimeOverCount=0;
   }
   if(ReceiveStart==1)
   {
    SPIDataBuff[ReceiveBuffCount]=U0RXBUF;
    ReceiveBuffCount++;
   }
   if((ReceiveStart==1)&&(ReceiveBuffCount>4)&&((SPIDataBuff[1]&0xf0)==0x00))
   {
   ReceiveStart=0;
   ReceiveEnd=1;
   SPICTOrder();
   ReceiveBuffCount=0;
   SpiTimeOverCount=0;
   }
   if ((ReceiveStart==1)&&(ReceiveBuffCount>1)&&(((SPIDataBuff[1]&0x80)==0x80)||(SPIDataBuff[1]==0x08)||(SPIDataBuff[1]==0x01)||(SPIDataBuff[1]==0x09)))
   {
   ReceiveStart=0;
   ReceiveEnd=1;
   SPICTOrder();
   ReceiveBuffCount=0;
   SpiTimeOverCount=0;
   }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -