📄 main.c
字号:
/****************************************Copyright (c)**************************************************
** 河南恩湃电力技术有限公司
** 测 控 部
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: MAIN.C
**创 建 人: sqiang
**最后修改日期: 2007年11月5日
**描 述:
**发送数据格式: CAN通道号(1byte)+CAN帧信息(1byte)+CAN标识符(4byte)+ 数据(8 byte)+发送命令(CMD)=15byte
** CAN通道号 <4 : 0=CAN1; 1=CAN2; 2=CAN3;
** 3=CAN4;
** CAN帧信息格式 : 位偏移 7 6 5 4 3210
** 功能 FF RTR x x DLC
** FF =0标准帧; =1扩展帧;
** RTR=0数据帧; =1远程帧;
** DLC <=8 表示要发送的字节数
**
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: sqiang
** 版 本: v1.0
** 日 期: 2007年11月5日
** 描 述: 原始版本
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:隔刀程序
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"
#include "math.h"
#include "stdio.h"
#include "stdlib.h"
/*Can 通讯 变量*/
//uint8 Can_Locoal_Addr[4] = {0x00,0x00,0x07,0x48}; //Can 控制器地址233
//uint8 Can_Locoal_Addr[4] = {0x00,0x00,0x04,0x88}; //Can 控制器地址145
uint8 Can_Locoal_Addr[4] = {0x00,0x00,0x00,0x38}; //Can 控制器地址7
uint8 Can_Cmd = 0x01; //Can命令字
uint8 Can_syn[8] = {0xeb,0x90,0xeb,0x90,0xeb,0x90,0xeb,0x90}; //同步帧
uint8 Can_ctl[8] = {0x06,0x18,0x00,0x00,0x00,0x00,0x00,0x00}; //控制帧 数据类型0x06 数据长度 18 00
uint8 Can_Switch_Data[8] = {0x07,0x00,0x08,0x00,0x00,0x00,0x00,0x00};//控制帧 数据类型0x07 数据长度 18 00
typedef union _SampleData_
{
uint16 Word;
struct
{
uint8 low; /*低位*/
uint8 high; /*高位*/
}byte;
}SampleData1,*P_SampleData;
typedef struct _SwitchData_
{
uint16 time;
uint8 state;
}lxswitchdata;
lxswitchdata switch_data[6];
uint16 switch_flag;
uint16 timecount;
uint8 Locoal_Addr;
SampleData1 Calc_Data[3000];
uint8 Can_ctl_Switch_State[8] = {0x11,0x00,0x03,0x00,0x00,0x00,0x00,0x00}; //控制帧 数据类型0x11 数据长度 00 03
extern SampleData1 A_Channel_Data[12]; //A通道采样数据存放 0:高字节, 1:低字节
extern SampleData1 B_Channel_Data[12]; //B通道采样数据存放 0:高字节, 1:低字节
extern UINT8 rcv_bufa[20]; // UART0数据接收缓冲区
extern uint8 rcv_count;
extern UINT8 rcv_new; // 接收新数据标志
extern uint8 uart1test;
extern UINT8 KRScan(void);
extern void ConfigAFReg (void);
extern uint16 CRC_16(uint8 * aData, uint16 aSize );
extern uint16 udf_crc(uint8 *data, uint32 size, uint16 crc);
extern uint16 crc16(uint16 crc, uint8 *buffer, uint16 len) ;
extern uint16 modbusCRC16(uint8 *puchMsg, uint16 usDataLen);
extern uint16 crc16r(uint8 *ptr, uint16 len);
extern uint16 crc_gen(uint8 data[],uint16 num);
extern uint16 CRC16b(uint8 *Array,uint16 Len);
extern uint16 WNCRC16(uint16 usStartValue, uint16 usPolynomial,uint8 *pby, uint16 ilen);
extern void BuildTable16a(uint16 aPoly, uint16 Table_CRC[256]);
extern void BuildTable16(uint16 aPoly, uint16 Table_CRC[256]);
extern uint16 CRC_16a(uint8 * aData,SampleData1 * bData, uint16 aSize, uint16 bSize );
extern uint16 CRC_16b(uint16 Data,SampleData1 * bData);
const UINT8 HelloArmCan[]={"Wellcome to using ZLG ARMLPC2XXX CAN test program!\n",};
const UINT8 CanErr[]={"CAN Chun Err!",};
const uint8 ComErr[]={"COM Err!",};
const UINT8 cCANChunl[]="CAN:";
const UINT8 cCANFif[]="FIF:";
const UINT8 cCANFid[]="FID:";
const UINT8 cCANData[]="Dat:";
UINT8 SRBuf[15],STBuf[100]; //
stcTxBUF CTbuf; // Can 发送缓冲区
stcRxBUF CRBuf; // Can 接收缓冲区
UINT32 CanSendFlag=0; //
UINT32 UartStatus=0,RcvCounter=0,TransCounter=0;
UINT8 Data_Update;
uint8 calc_flag;
uint16 StartSampleDot;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/* FFT计算变量*/
//double Result_FFT[10]; // 10组 fft计算结果 ,初相角
///////////////**** 其他全局变量定义////////////////////////////////////////////////////////////////////////////
UINT8 bb; //AD 通道选择
uint16 Calc_Count;
#define wireless
/************************************************************************************************************************
**函数原型 : void nop()
**参数说明 : 无
**返回 值 : void
**说 明 : 该函数用于 执行一次空操作
***********************************************************************************************************************/
void nop()
{
__asm
{
NOP
}
}
float calcL(int16 i[12])
{
float um;
float ui=0,ur=0;
//float re;
ui=0.866*(i[1]-i[5]-i[7]+i[11])+(i[2]-i[4]-i[8]+i[10])/2-i[6]+i[0]; //cos
ur=(i[3]-i[9])+(i[1]+i[5]-i[7]-i[11])/2+(i[2]+i[4]-i[8]-i[10])*0.866; //sin
um=sqrt(ur*ur+ui*ui);
//re=(2*um/12);
return (2*um/12);
}
void WDT_Init(void)
{
WDTC = 0x4000000; // 设置看门狗定时器参数
WDMOD = 0x03; // 设置看门狗模式:中断且复位
WDFEED = 0xAA; // 第一次喂狗启动WDT
WDFEED = 0x55;
}
void FeedWDT(void)
{
uint32 fd;
fd=VICIntEnable;
VICIntEnClr|=0x00ffffff;
WDFEED=0xaa; WDFEED=0x55;
VICIntEnable=fd;
}
/*
************************************************************************************************************************
**函数原型 : void UartComPol(void)
**参数说明 :
**返回 值 :
**说 明 : 该函数用于解析RS232数据到CAN数据的协议
************************************************************************************************************************
*/
#define SOF 0x12
#define CRC 0x00
#define SOF_STATUS 00
#define DATA_STATUS 01
#define CRC_STATUS 02
#define DebugCom 02
void mprintf(uint8 *tp,uint8 len,uint8 com)
{
int ii;
const uint8 *dp;
if(com==1)
{
for(ii=0;ii<len;ii++)
{
SendByte(*tp);
tp++;
if(*tp == NULL)
break;
}
}
else if(com==2)
{
for(ii=0;ii<len;ii++)
{
Uart1SendByte(*tp);
tp++;
if(*tp == NULL)
break;
}
}
else
{
dp=&ComErr[0];
while(*dp != NULL)
{
Uart1SendByte(*dp);
};
}
}
void printfa(uint8 *tp,uint8 com)
{
const uint8 *dp;
if(com==1)
{
while(*tp != NULL)
{
SendByte(*tp);
tp++;
};
}
else if(com==2)
{
while(*tp != NULL)
{
Uart1SendByte(*tp);
tp++;
};
}
else
{
dp=&ComErr[0];
while(*dp != NULL)
{
Uart1SendByte(*dp);
dp++;
};
}
}
void printstr(char *codec,uint8 com)
{
//uint8 *tp;
//tp=&codec[0];
if(com==1)
{
while(*codec != NULL)
{
SendByte(*codec);
codec++;
};
}
else if(com==2)
{
while(*codec != NULL)
{
Uart1SendByte(*codec);
codec++;
};
}
else
{
Uart1SendByte('C');
Uart1SendByte('o');
Uart1SendByte('m');
Uart1SendByte(' ');
Uart1SendByte('E');
Uart1SendByte('r');
Uart1SendByte('r');
}
}
void UartComPol(void)
{
switch(UartStatus)
{
case SOF_STATUS:
if((UINT8)uU0RBR.Word == SOF)
{
UartStatus++;
}
break;
case DATA_STATUS:
SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word;
if(RcvCounter >14)
{
RcvCounter=0;
UartStatus++;
}
break;
case CRC_STATUS:
if((UINT8)uU0RBR.Word == CRC)
{
CanSendFlag =1; //使能CAN发送
}
UartStatus=0;
break;
default:
UartStatus=0;
CanSendFlag =0;
RcvCounter=0;
break;
}
}
/*
************************************************************************************************************************
**函数原型 : void CanHexToRs232ASCII(UINT8 *Buf,UINT8 iBYTE)
**参数说明 :
**返回 值 :
**说 明 :将HEX格式的CAN数据转换为RS232ASCII码格式
************************************************************************************************************************
*/
void CanHexToRs232ASCII(UINT8 *Buf,UINT8 iBYTE)
{
UINT8 i= iBYTE >> 4;
if(i<0x0A)
{
*Buf = 0x30 +i; //数字0--9
}
else
{
*Buf = 0x37 +i; //字母A--Z(大写)
}
i = iBYTE &0x0F;
if(i<0x0A)
{
*(Buf+1) = 0x30 +i;
}
else
{
*(Buf+1) = 0x37 +i;
}
}
void myledInit (void)
{
//PINSEL1 = PINSEL1 & (~0xc0000000); // P0.15 LED2,
PINSEL2 = PINSEL2 & (~0x08); // P1[25:16]连接GPIO , P1.16 LED1 , P1.20 LED3
IO0DIR = IO0DIR | LED1; // 设置LED0控制口为输出
IO1DIR = IO1DIR | LED4 | LED3; // 设置LED1控制口为输出
}
void IntputInit(void)
{
//PINSEL0 = PINSEL0 & (~0xff00000); //P0.10,P0.11,P0.12,P0.13
//PINSEL1 = PINSEL1 & (~0xc003c00); //P0.21,P0.22,P0.23
PINSEL2 = PINSEL2 & (~0x08); // P1[25:16]连接GPIO
IO0DIR = IO0DIR & (~Sk2)&(~Sk3)&(~Sk4)&(~Sk6)&(~SI1)&(~SI2)&(~SI6); //设置控制口为输入
IO1DIR = IO1DIR & (~Sk1)&(~Sk5)&(~Sk7)&(~Sk8)&(~SI3)&(~SI4)&(~SI5); //设置控制口为输入
}
void OutputInit(void) //sleep ctrl2 reset cs1 sh1
{
//PINSEL1 = PINSEL1 & (~0x3000000c); //P0.17,P0.30
PINSEL2 = PINSEL2 & (~0x08); // P1[25:16]连接GPIO
IO0DIR = IO0DIR|(1<<17)|(1<<18)|(1<<19)|(1<<30); //设置控制口为输出 reset cs1 s/h1 ctrl2
IO1DIR = IO1DIR|(1<<21); //设置控制口为输出 sleep
IO1SET = 1<<21;
IO0SET = 1<<17;
}
/*
************************************************************************************************************************
**函数原型 : UINT32 RS232DataToCan(void)
**参数说明 :
**返回 值 : 0;成功发送;1;发送失败
**说 明 :将接收到的232数据发送到CAN
************************************************************************************************************************
*/
UINT32 RS232DataToCan(void)
{
UINT32 status=0,i;
if(SRBuf[0] > 5)
{
status =1;
}
else
{
CTbuf.TxFrameInfo.Bits.PRIO_BIT = SRBuf[0]; //CAN通道号
CTbuf.TxFrameInfo.Bits.FF_BIT =(SRBuf[1]&0x80) >> 7; //帧格式
CTbuf.TxFrameInfo.Bits.RTR_BIT = (SRBuf[1]&0x40)>> 6; //帧类型
CTbuf.TxFrameInfo.Bits.DLC_BIT = SRBuf[1]&0x0f; //数据长度
for(i=0;i<4;i++)
{
*((UINT8 *)&CTbuf.TxCANID.Word +i)=SRBuf[5-i];
}
memcpy((UINT8 *)&CTbuf.CANTDA,&SRBuf[6],4);
memcpy((UINT8 *)&CTbuf.CANTDB,&SRBuf[10],4);
status = CANSendData(SRBuf[0],SRBuf[14],&CTbuf); //SRBuf[0]:通道号。SRBuf[14]:发送命令(1,单次发送)
}
return status;
}
/*
************************************************************************************************************************
**函数原型 : void CanDataToRs232(void)
**参数说明 :
**返回 值 :
**说 明 :将接收收到的CAN数据发送到RS232
************************************************************************************************************************
*/
void CanDataToRs232(void)
{
UINT8 i;
UINT8 TempBuf[13];
UINT8 temp = 0;
TransCounter = 0;
////////////////////////////////////////////
memcpy(STBuf,cCANChunl,sizeof(cCANChunl));
TransCounter += sizeof(cCANChunl)-1; //覆盖掉字符串尾的"\0"
CanHexToRs232ASCII(&STBuf[TransCounter],00);
TransCounter += 2;
STBuf[TransCounter++]=0x0D; //回车
STBuf[TransCounter++]=0x0A; //换行
///////////////////////////////////////////
TempBuf[0]=(UINT8)CRBuf.CANRcvFS.Bits.DLC_BIT | ((UINT8)CRBuf.CANRcvFS.Bits.FF_BIT << 7)|
((UINT8)CRBuf.CANRcvFS.Bits.RTR_BIT << 6);
for(i=0;i<4;i++)
{
TempBuf[1+i]=*((UINT8 *)&CRBuf.RxCANID + 3-i);
}
for(i=0;i<4;i++)
{
TempBuf[5+i]=*((UINT8 *)&CRBuf.CANRDA+i);
}
for(i=0;i<4;i++)
{
TempBuf[9+i]=*((UINT8 *)&CRBuf.CANRDB+i);
}
//Frame Infomation
memcpy(&STBuf[TransCounter],cCANFif,sizeof(cCANFif));
TransCounter += sizeof(cCANFif)-1;
CanHexToRs232ASCII(&STBuf[TransCounter],TempBuf[0]);
TransCounter += 2;
STBuf[TransCounter++]=0x0D;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -