📄 spi_135.c.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 + -