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

📄 main.c

📁 一个DSP2812的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
         //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 + -