📄 main.c
字号:
//NAND FLASH WRITE
if(SaveData == 0x33)
{
MemReadAndWrite(SourceAddr, ZONE6_BASE, DataBuff,NUM, WRITE );
SourceAddr += NUM;
}
//读数据
if(SaveData == 0xAA)
{
if((0xFFFF - Addr)>= NUM)
{
FM25L512_Read(Addr,NUM,DataBuff);
Addr += NUM;
}
else
{
Addr = 0;
FM25L512_Read(Addr,NUM,DataBuff);
}
for(i=0;i< NUM;i++)
{
fInputSignal[i] = DataBuff[i];
}
}
//NAND FLASH READ
if(SaveData == 0xCC)
{
MemReadAndWrite(SourceAddr, ZONE6_BASE, DataBuff,NUM, READ );
SourceAddr += NUM;
for(i=0;i< NUM;i++)
{
fInputSignal[i] = DataBuff[i];
}
}
//CAN1 TX
if(SaveData == 0x00880000)
{
SJA1000_DATA_SEND(CAN1, DataBuff, NUM);
}
//CAN2 TX
if(SaveData == 0x00885500)
{
SJA1000_DATA_SEND(CAN2, DataBuff, NUM);
}
//CAN 传输
temp = NUM;
if((temp % 2) != 0)
temp = temp-1;
for(i=0;i< temp;)
{
//邮箱数据域改变许可---------------------------------------------
EALLOW;
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CDR = 1;
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
EDIS;
ECanaMboxes.MBOX0.MSGID.all += 1;
//写入邮箱数据
ECanaRegs.CANMC.bit.MBNR = 0x00;
p = (Uint32 *)&fInputSignal[i++];
ECanaMboxes.MBOX0.MDL.all = *p;//邮箱的低位数据
p = (Uint32 *)&fInputSignal[i++];
ECanaMboxes.MBOX0.MDH.all = *p;//邮箱的高位数据
ECanaRegs.CANMC.bit.MBNR = 0x01;
ECanaMboxes.MBOX1.MDL.all = Addr;//fm25l512 address
ECanaMboxes.MBOX1.MDH.all = *SourceAddr;//NAND FLASH ADDR
//邮箱数据域改变不许可
EALLOW;
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CDR = 0;
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
EDIS;
// 开始传输
ECanaRegs.CANTRS.all = 0x00000003; // Set TRS for all transmit mailboxes
while(ECanaRegs.CANTA.all != 0x00000003) // Wait for all TAn bits to be set..
{
FEED_WATCHDOG;
}
ECanaRegs.CANTA.all = 0x0000FFFF; // Clear all TAn
}
MessageTransmitedCount++;
Sample_Over = 0;
ECanaMboxes.MBOX0.MSGID.all = 0x90880000;
for(i=0;i< NUM;i++)
{
fInputSignal[i] = 0;
}
adclo = 0;
// 重新初始化下一个ADC序列
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // 重设 SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // 清除SEQ1中断位
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 获得PIE中断组
EnableInterrupts();
}
LoopCount++;
}
}
/****************************************************************
AD中断服务程序
****************************************************************/
interrupt void adc_isr(void)
{
//AD采样8路通道A
Uint16 ADINA0 = 0,ADINA1 = 0,ADINA2 = 0,ADINA3 = 0,ADINA4 = 0,ADINA5 = 0,ADINA6 = 0,ADINA7 = 0;
//AD采样8路通道B
Uint16 ADINB0 = 0,ADINB1 = 0,ADINB2 = 0,ADINB3 = 0,ADINB4 = 0,ADINB5 = 0,ADINB6 = 0,ADINB7 = 0;
// Uint16 adclook = 0;
FEED_WATCHDOG;
//######16路AD同时采样#####################################################
ADINA0 = AdcRegs.ADCRESULT0 >>4;//ADINA0
ADINB0 = AdcRegs.ADCRESULT1 >>4;//ADINB0
ADINA1 = AdcRegs.ADCRESULT2 >>4;//ADINA1
ADINB1 = AdcRegs.ADCRESULT3 >>4;//ADINB1
ADINA2 = AdcRegs.ADCRESULT4 >>4;//ADINA2
ADINB2 = AdcRegs.ADCRESULT5 >>4;//ADINB2
ADINA3 = AdcRegs.ADCRESULT6 >>4;//ADINA3
ADINB3 = AdcRegs.ADCRESULT7 >>4;//ADINB3
ADINA4 = AdcRegs.ADCRESULT8 >>4;//ADINA4
ADINB4 = AdcRegs.ADCRESULT9 >>4;//ADINB4
ADINA5 = AdcRegs.ADCRESULT10 >>4;//ADINA5
ADINB5 = AdcRegs.ADCRESULT11 >>4;//ADINB5
ADINA6 = AdcRegs.ADCRESULT12 >>4;//ADINA6
ADINB6 = AdcRegs.ADCRESULT13 >>4;//ADINB6
ADINA7 = AdcRegs.ADCRESULT14 >>4;//ADINA7
ADINB7 = AdcRegs.ADCRESULT15 >>4;//ADINB7
//#########电压值计算############################################################
fInputSignal[0] = ((float32)ADINA0) * 3.0/4095.0-adclo; //220V交流1
fInputSignal[1] = ((float32)ADINA1) * 3.0/4095.0-adclo;//220V交流2
fInputSignal[2] = ((float32)ADINA2) * 3.0/4095.0-adclo;//220V交流3
fInputSignal[3] = ((float32)ADINA3) * 3.0/4095.0-adclo;//220V交流4
fInputSignal[4] = ((float32)ADINA4) * 3.0/4095.0-adclo;//220V交流5
fInputSignal[5] = ((float32)ADINA5) * 3.0/4095.0-adclo;//220V交流6
fInputSignal[6] = ((float32)ADINA6) * 3.0/4095.0-adclo;//30A交流1
fInputSignal[7] = ((float32)ADINA7) * 3.0/4095.0-adclo;//30A交流2
fInputSignal[8] = ((float32)ADINB0) * 3.0/4095.0-adclo;//30A交流3
fInputSignal[9] = ((float32)ADINB1) * 3.0/4095.0-adclo;//30A交流4
fInputSignal[10] = ((float32)ADINB2) * 3.0/4095.0-adclo;//DC280V-1
fInputSignal[11] = ((float32)ADINB3) * 3.0/4095.0-adclo;//DC280V-2
fInputSignal[12] = ((float32)ADINB4) * 3.0/4095.0-adclo;//DC280V-3
fSwitch1[AdIntCount] = ((float32)ADINB5) * 3.0/4095.0-adclo;//DC-OUT1
fSwitch2[AdIntCount] = ((float32)ADINB6) * 3.0/4095.0-adclo;//DC-OUT2
fSwitch3[AdIntCount] = ((float32)ADINB7) * 3.0/4095.0-adclo;//DC-OUT3
//#if DEBUG
// view[AdIntCount] = ((float32)ADINA0) * 3.0/4095.0-adclo; //母线输入电压
//#endif
//#####################################################################
Sample_Over = 0;
AdIntCount++;
while(AdIntCount == 16)
{
// PieCtrlRegs.PIECRTL.bit.ENPIE = 0;
PieCtrlRegs.PIEIER1.bit.INTx6 = 0; //ADINT
EvaRegs.T1CON.bit.TENABLE = 0; //计数器不使能
Sample_Over = 0x55;
AdIntCount = 0;
FEED_WATCHDOG;
return;
}
// 重新初始化下一个ADC序列
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // 重设 SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // 清除SEQ1中断位
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 获得PIE中断组
EvaRegs.T1CON.bit.TENABLE = 0; //计数器不使能
// PieCtrlRegs.PIECRTL.bit.ENPIE = 0;
return;
}
//=================频率采集中断程序===================================
interrupt void Xint1_isr()
{
Uint32 temp;
if(FreqCounter == 0)
{
StartCpuTimer0();
}
FreqCounter++;
if(FreqCounter == 2)
{
StopCpuTimer0();
temp = ReadCpuTimer0Period() - ReadCpuTimer0Counter();
FreqValue = FREQ_PARA * (CPU_FREQ / temp);
ReloadCpuTimer0();
FreqCounter = 0;
}
FEED_WATCHDOG;
PieCtrlRegs.PIEIFR1.bit.INTx4 = 0;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 获得PIE中断组
return;
}
//============CAN2 中断服务程序============
interrupt void Xint2_isr()
{
unsigned char TempData;
TempData = SJA1000_READ(CAN2, REG_INTERRUPT);
if((TempData & 0x01) == 0x01)
{
SJA1000_DATA_RECEIVE(CAN2, ReceiveDataBuf_CAN2, 13);
SaveData = ((Uint32)ReceiveDataBuf_CAN2[1]<<24)|((Uint32)ReceiveDataBuf_CAN2[2]<<16)|((Uint32)ReceiveDataBuf_CAN2[3]<<8)| (Uint32)ReceiveDataBuf_CAN2[4];
SaveData = SaveData>>3;
}
if((TempData & 0x02) == 0x02)
{
CAN2TXCounter++;
}
if((TempData & 0x80) == 0x80)
{
Init_SJA1000_Soft(CAN2);
}
FEED_WATCHDOG;
PieCtrlRegs.PIEIFR1.bit.INTx5 = 0;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 获得PIE中断组
return;
}
//===============CAN1 中断服务程序=============
interrupt void Xint13_isr()
{
unsigned char TempData;
TempData = SJA1000_READ(CAN1, REG_INTERRUPT);
if((TempData & 0x01) == 0x01)
{
SJA1000_DATA_RECEIVE(CAN1, ReceiveDataBuf_CAN1, 13);
SaveData = ((Uint32)ReceiveDataBuf_CAN1[1]<<24)|((Uint32)ReceiveDataBuf_CAN1[2]<<16)|((Uint32)ReceiveDataBuf_CAN1[3]<<8)| (Uint32)ReceiveDataBuf_CAN1[4];
SaveData = SaveData>>3;
}
if((TempData & 0x02) == 0x02)
{
CAN1TXCounter++;
}
if((TempData & 0x80) == 0x80)
{
Init_SJA1000_Soft(CAN1);
}
FEED_WATCHDOG;
// IFR = 0;
return;
}
/***********************************************************************
THE END
***********************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -