📄 main.c
字号:
/*******************************************************************************
Copyright (c) 2005,2006 北京中盛华旭电子科技有限公司(VSUNTEK, Ltd.)
FileName: TESTTerminal.C
Author: 王在东
Date: 2008.05.25
Version: 1.0
Description:主函数完成信号的采集发送,中断处理等 .
History:
<Author>wzd
<Date>
<Ver>
<Desc>
Todo:
*******************************************************************************/
#define GLOBAL_Q 27 /* Set the Local Q value */
#include "DSP281x_Device.h" // DSP281x Headerfile Include File
#include "DSP281x_Examples.h" // DSP281x Examples Include File
#include "SJA1000T.h"
//#include "stdio.h"
#define F2812 1
#define NUM 62
#define FREQ_PARA 4
#define DEBUG 0
long GlobalQ = GLOBAL_Q;
//===================timer struct================
struct DS1390Timer{
Uint16 Mssec ;
Uint16 Sec ; //秒
Uint16 Minute ; //分
Uint16 Hour ; //小时
Uint16 Day ; //星期
Uint16 Data ; //日
Uint16 Mouth ; //月
Uint16 Year ; //年
};
struct DS1390Timer Clock;
//#pragma CODE_SECTION(InitXintf,"ramfuncs");
// RAM Count - This counter will be stored in RAM, to compare with that stored
// in XINTF.
//#pragma DATA_SECTION(RamInterruptCount,"ramdata");
// 中断服务程序原型
interrupt void adc_isr(void);
interrupt void Xint1_isr(void);
interrupt void Xint2_isr(void);
interrupt void Xint13_isr(void);
//interrupt void Timerint_isr(void);
// 本程序中的全局变量
Uint32 MessageTransmitedCount = 0;
Uint32 LoopCount = 0;
Uint32 AdIntCount = 0;
Uint32 Sample_Over = 0;
float32 fInputSignal[NUM];
float32 fSwitch1[16],fSwitch2[16],fSwitch3[16];
Uint32 OnOff_Value = 0;
Uint32 Addr = 0;
Uint32 DataBuff[NUM];
Uint32 *SourceAddr;
unsigned char ReceiveDataBuf_CAN1[13];
unsigned char ReceiveDataBuf_CAN2[13];
Uint32 CAN1TXCounter;
Uint32 CAN2TXCounter;
float32 RunTime = 0;
float32 FreqValue = 0;
Uint32 SaveData = 0;
Uint32 FreqCounter = 0;
//电压转换偏移量
float32 adclo = 0.02;
//float32 view[16];
// eCAN 控制寄存器读/写访问要用 32-bits.
// 定义一个32位临时寄存器
struct ECAN_REGS ECanaShadow;
main()
{
Uint16 i,temp;
Uint32 *p;
// Uint32 temp;
//初始化系统控制
InitSysCtrl();
//CPU中断不使能
DINT;
//初始化PIE控制寄存器
InitPieCtrl();
// 不使能CPU中断,清除CPU中断标志
IER = 0x0000;
IFR = 0x0000;
// 初始化PIE中断向量表
InitPieVectTable();
//初始化外部存储接口
InitXintf();
//初始化外部中断
InitXIntrupt();
//初始化GPIO
InitGpio();
GpioDataRegs.GPBSET.all = 0xFFFF;
// 初始化AD
InitAdc();
InitSci();
InitSpi();
// 指向AD中断服务程序
EALLOW; // This is needed to write to EALLOW protected register
// SysCtrlRegs.SCSR = BIT2;
PieVectTable.ADCINT = &adc_isr;
PieVectTable.XINT1 = &Xint1_isr;
PieVectTable.XINT2 = &Xint2_isr;
PieVectTable.XINT13 = &Xint13_isr;
//PieVectTable.TINT0 = &Timerint_isr;
EDIS; // This is needed to disable write to EALLOW protected registers
// TimerCount = 0;
//初始化eCAN
InitECan();
FEED_WATCHDOG;
Init_SJA1000_HardWare();
Init_SJA1000_Soft(CAN1);
Init_SJA1000_Soft(CAN2);
InitCpuTimers();
EnableInterrupts();
IER |= (M_INT1 | M_INT13 | M_INT9); // 使能CPU中断1,13,9
EINT; // 使能全局中断 INTM
ERTM; // 使能全局实时中断 DBGM
LoopCount = 0;
MessageTransmitedCount = 0;
SourceAddr = ZONE2_BASE;
// 配置 EVA
EvaRegs.T1CNT = 0x0; //定时器初值
EvaRegs.T1CMPR = 0x0008; // 设置计数器T1比较值
EvaRegs.T1PR = 0x00FF; // 设置计数器周期
EvaRegs.GPTCONA.bit.T1TOADC = 1; // 使能EVASOC
EvaRegs.T1CON.all = 0x1002; // 使能 timer 1 比较 (upcount mode)
//EvaRegs.EXTCONA.bit.EVSOCE = 1;
//CAP set up
// EvaRegs.CAPCONA.all = 0x36FC;
// EvbRegs.CAPCONB.all = 0x26C0;
//初始化时钟
Clock.Year = 0x08;
Clock.Mouth = 0x06;
Clock.Data = 0x01;
Clock.Day = 0x01;
Clock.Hour = 0x00;
Clock.Minute = 0x00;
Clock.Sec = 0x00;
Clock.Mssec = 0x00;
SCK1_L;
CS1_H;
CS1_L;
SPI1_WriteByte(0x8D); // write memory command
SPI1_WriteByte(0x18);
SCK1_L;
CS1_H;
DS1390_Write(0x80,8,Clock);
// 等待ADC中断
while(1)
{
WORK_INDICATION;
FEED_WATCHDOG;
// switch select
if(AdIntCount < 16)
{
BusLine_Direct_Set(OUTPUT);
SWITCH1_CS_L;
SWITCH2_CS_L;
SWITCH3_CS_L;
BUS_LINE = (BUS_LINE & 0xFF00)| AdIntCount;
SWITCH1_CS_H;
SWITCH2_CS_H;
SWITCH3_CS_H;
EvaRegs.T1CON.bit.TENABLE = 1; //计数器使能
}
else
AdIntCount = 0;
//CAN 接收邮箱判断
if(ECanaRegs.CANRMP.bit.RMP31 == 1 ) // Wait for all RMPn to be set..
{
ECanaRegs.CANRMP.all = 0xFFFF0000; // Clear all RMPn bits and start
SaveData = ECanaMboxes.MBOX31.MDL.all;
}
//CAN 接收信息丢失判断
if(ECanaRegs.CANRML.bit.RML31 == 1)
{
ECanaShadow.CANOPC.all = ECanaRegs.CANOPC.all;
ECanaShadow.CANOPC.bit.OPC31 = 1;
ECanaRegs.CANOPC.all = ECanaShadow.CANOPC.all;
}
//采集完成数据发送
if(Sample_Over == 0x55)
{
PieCtrlRegs.PIECRTL.bit.ENPIE = 0;
FEED_WATCHDOG;
//开关量信息采集
BusLine_Direct_Set(INPUT);
ON_OFF_CS_L;
OnOff_Value = BUS_LINE & 0x00FF;
ON_OFF_CS_H;
BusLine_Direct_Set(OUTPUT);
//读系统时钟
while(1)
{
DS1390_Read(0,8,(Uint16 *)&Clock);
bcd2ascii((unsigned char)Clock.Sec);
scia_xmit(':');
bcd2ascii((unsigned char)Clock.Minute);
scia_xmit(':');
bcd2ascii((unsigned char)Clock.Hour);
scia_xmit(':');
bcd2ascii((unsigned char)Clock.Data);
scia_xmit('/');
bcd2ascii((unsigned char)Clock.Mouth);
scia_xmit('/');
bcd2ascii((unsigned char)Clock.Year);
scia_xmit(0x0A);
scia_xmit(0x0D);
}
RunTime = bcd2decimal(Clock.Hour) + bcd2decimal(Clock.Minute)/60;
for(i=0;i<16;i++)
{
fInputSignal[i+13] = fSwitch1[i];
fInputSignal[i+29] = fSwitch2[i];
}
for(i=0;i<8;i++)
{
fInputSignal[i+44] = fSwitch3[i];
temp = OnOff_Value & 0x01;
OnOff_Value = OnOff_Value >> 1;
fInputSignal[i+52] = temp;
}
fInputSignal[60] = FreqValue;
fInputSignal[61] = RunTime;
//故障数据判断
temp = JudgeFault(fInputSignal);
temp = ((temp & 0x01)<<6)|((temp & 0x40)>>6)|((temp & 0x02)<<4)|((temp & 0x20)>>4)|((temp & 0x04)<<2)|((temp & 0x10)>>2)|(temp & 0x08);
BusLine_Direct_Set(OUTPUT);
LED1_CS_L;
BUS_LINE = (BUS_LINE & 0xFF00)| temp;
LED1_CS_H;
for(i=0;i< NUM;i++)
{
DataBuff[i] = (Uint32)fInputSignal[i];
}
//存储数据
if(SaveData == 0x55)
{
if((0xFFFF - Addr)>= NUM)
{
FM25L512_Write(Addr,NUM,DataBuff);
Addr += NUM;
}
else
{
Addr = 0;
FM25L512_Write(Addr,NUM,DataBuff);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -