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

📄 fesc_main.c

📁 MPC5554处理器的初始化例程
💻 C
字号:
/**************************************************************************/
/* FILE NAME: main.c                       COPYRIGHT (c) Freescale 2004   */
/*                                                All Rights Reserved     */
/* DESCRIPTION:                                                           */
/* This file caps the MPC5500cfg initialization with the interrupt and    */
/* exception blink program.                                               */
/**************************************************************************/
/* 0.1   AlexGong                      从template提供的文件中去掉无用代码 */
/**************************************************************************/

#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <stdarg.h>
#include "mpc5554.h"             /* registers and bits fields definition */
#include "mpc5500_usrccdcfg.h"   /* mpc5500_ccdcfg.h included */

/* FESC header */
#include "FESC_5554_PIN_assignment.h"
#include "FESC_5554_SPIComm.h"
#include "FESC_5554_SXC.h"
#include "FESC_5554_global_var.h"
#include "FESC_5554lib.h"

#include "FESC_5554_general.c"
#include "FESC_5554_ESCI.c"
#include "FESC_5554_FSPI.c"
#include "FESC_5554_SXC.c"
#include "FESC_5554_EMIOS.c"
#include "FESC_5554_Term.c"
#include "FESC_5554_IRQ.c"
#include "FESC_5554_daemon.c"
#include "FESC_5554_SPIComm.c"
#include "FESC_5554lib.c"

uint8_t   din[14];
uint8_t   cin[8];
uint8_t   cout[20];
uint8_t   dout[2];
uint16_t  freq_temp;
uint16_t  freq_temp_array[6];


int main (void)
{   init_EMIOS();
	  init_ESCI();
	  init_IRQ();
    init_EMIOS_GEN_SSP_LOOP_IRQ();
    init_EMIOS_GEN_SPI_master_DAEMON_IRQ();
    init_GloVar();
    
    
    printp(send_c_ESCIA,"\n\r5554 Init Done, Hard_Sync test running\n\r");
    EnableIRQ();

	hs_test_cnt = 0;
	while(1)
	{ hs_test_cnt++;
	  set_led(PIN_EMIOS20,(hs_test_cnt&0x01));
	  if(hs_test_cnt ==10000) hs_test_cnt = 0;
	}
}
/********************************************/
/*                 main( )                  */
/********************************************/
int mainaa (void)
 {  
    uint8_t   i, j;
    
    FESC_5554_init();
    printp(send_c_ESCIA,"\n\r5554 Init Done, Start SSP Loop \n\r");
    EnableIRQ();

    ssp_delay_period = 50;
    
   //---------初始竞争主备的过程--------------------- 
{    
    //----------------------------------------------------
    /////假设对系不存在
    Mate_CB.alive = 0;   
    ////等待足够长的时间,保证对系可以刷新其Mate_CB结构
    ////同时重复向对系刷自己的信息
    set_sys_tick(100+ssp_delay_period);
    mate_board_write();  
    while(sys_tick) {}  
    set_sys_tick(100+ssp_delay_period);
    mate_board_write();  
    while(sys_tick) {}  
        
    /////检查对系状态
		if(Mate_CB.alive == 1)  //mate alive
		{
			  if(Mate_CB.role == role_president) 
       {
    	   Self_CB.role = role_visepresident; 
       }
       //竞争
       else if(Mate_CB.role == role_voting) 
       {
       	   if     (Mate_CB.lid > Self_CB.lid) Self_CB.role = role_visepresident;  
       	   else if(Mate_CB.lid < Self_CB.lid) Self_CB.role = role_president;
       	   else    printp(send_c_ESCIA_dpb,"ERROR: same lid \n\r");                 
       }
    }	
    else
   	{	 Self_CB.role = role_president; 
		}
		//-------------------------------------------------
		
		Mate_CB.ssp_loop_start_flag = 0;
	  Mate_CB.alive = 0;
	  //备系要在合适的时机切入运行
    if(Self_CB.role == role_visepresident)  
    {  set_sys_tick(300);
  	   while((Mate_CB.ssp_loop_start_flag==0)&&(sys_tick)){}
  	   if(Mate_CB.alive==0) printp(send_c_ESCIA_dpb,"ERROR: persident silent!:\n\r");
    }
}  	 
  	
  			
//////////////////////////////////////			     
for(;;)
{
  set_led(LED_MCU_STATUS,SSP_MB_LED_ON);

 //修改这部分代码需要极度小心
{  
	////主系同步流程
	if(Self_CB.role == role_president)
	{  //A:主系开始,通知备系
		 Self_CB.lid++;
		 Self_CB.ssp_loop_start_flag = 1;
   	 mate_board_write();
   	 while(SBP_Buf[6].isFinished ==0){}
   	 {SXC_master_verify(6); 
   	 	if(SBP_Buf[6].returnStat != SBP_RTSTUS_OK) 
   	 	{	mate_board_write();//主系重传1
   	 	  printp(send_c_ESCIA_dpb,"主系重传1\n\r");
   	 	}
   	 }
   	 while(SBP_Buf[6].isFinished ==0){}
   	 {SXC_master_verify(6); 
   	 	if(SBP_Buf[6].returnStat != SBP_RTSTUS_OK) 
   	 	{ mate_board_write();//主系重传2
   	 	  printp(send_c_ESCIA_dpb,"主系重传2\n\r");
   	 	}
   	 }
   	 //B:等待备系开始
   	 set_sys_tick(10);
  	 while((Mate_CB.ssp_loop_start_flag==0)&&(sys_tick)){} 
	   if(Mate_CB.alive ==1)
	   { 
     }
     else //mate dead,clean the draff
	   {  init_SBP_Buf(7);
	      SBP_Buf[7].iRxBufferLen   = 0;
        SBP_Buf[7].isFinished     = 0;    //acctivate
		    SXC.CH[7].SXC_CR.B.PACKET_START   = 1;
		    SXC.CH[7].SXC_CR.B.PACKET_CNT_CLR = 1;
	   	}
	   	//C:假设对系下个周期要硌屁
	   	Mate_CB.ssp_loop_start_flag = 0;
	    Mate_CB.alive = 0; 
	    set_sys_tick(3);while(sys_tick) {}//主系晚跑几个ms,让备系先跑完,进入等待
  }

////备系同步流程
  if(Self_CB.role == role_visepresident)
  {  //A:等待主系开始 
  	 set_sys_tick(25);       
  	 while((Mate_CB.ssp_loop_start_flag==0)&&(sys_tick)){}   //wait till president is ready for next loop
  	 if(Mate_CB.alive == 1)
  	 {
  	    Self_CB.lid  = Mate_CB.lid;
     }
     else
     {
     	  printp(send_c_ESCIA_dpb,"主系失效,备系转主\n\r");
     	  Self_CB.role = role_president;
     	  Self_CB.lid++;
   	 }
   	 //B:备系开始,通知主系
   	 Self_CB.ssp_loop_start_flag = 1;
   	 mate_board_write();
     while(SBP_Buf[6].isFinished ==0){}
   	 {SXC_master_verify(6); 
   	 	if(SBP_Buf[6].returnStat != SBP_RTSTUS_OK) 
   	 	{ mate_board_write();//备系重传1
   	 	  printp(send_c_ESCIA_dpb,"备系重传1\n\r");
   	 	}
   	 }
   	 while(SBP_Buf[6].isFinished ==0){}
   	 {SXC_master_verify(6); 
   	 	if(SBP_Buf[6].returnStat != SBP_RTSTUS_OK) 
   	 	{ mate_board_write();//备系重传2
   	 	  printp(send_c_ESCIA_dpb,"备系重传2\n\r");
   	 	}
   	 }  	 
   	 //C:假设对系下个周期要硌屁
     Mate_CB.ssp_loop_start_flag = 0;
     Mate_CB.alive = 0;  
  }

}
  
  
  //设定应用程序运行周期
  set_sys_tick(100);   
//--------刷新LED指示灯----------
{
     if(Self_CB.role == role_president)   //主机闪烁
     {set_led(LED_ROLE0,SSP_MB_LED_TOGGLE);
     	set_led(LED_ROLE1,SSP_MB_LED_TOGGLE);
     }
     if(Self_CB.role == role_visepresident) //备机常亮
     {set_led(LED_ROLE0,SSP_MB_LED_ON);
     	set_led(LED_ROLE1,SSP_MB_LED_ON);
     }
	   set_led(LED_2OO2,SSP_MB_LED_TOGGLE);
     refresh_SPI_Indicate_LED();
     printp(send_c_ESCIA_dpb,"== SSP LOOP [%d:%5d] ==\n\r",Self_CB.role,Self_CB.lid);
}    
     
//----------应用程序----------------     
{     
    //------------读输入板---------------
   general_ioc_board_read(B_IL);
   general_ioc_board_read(B_IR);
    
    //处理输入板数据
	  for(i=0;i<14;i++) din[i] = 0;
	  for(i=0;i<6;i++)  freq_temp_array[i]=0;
	  
	  if((SBP_Buf[B_IL].returnStat==SBP_RTSTUS_OK)&&(SBP_Buf[B_IL].iRxBufferLen==14)) 
    {  
       for(i=0;i<6;i++)
       {   freq_temp = SBP_Buf[B_IL].RxBuffer[  i*2];//高字节在前
       	   freq_temp <<= 8;
       	   freq_temp +=SBP_Buf[B_IL].RxBuffer[1+i*2];
           freq_temp_array[i] = freq_temp;
           din[  i*2] = SBP_Buf[B_IL].RxBuffer[  i*2];
         	 din[1+i*2] = SBP_Buf[B_IL].RxBuffer[1+i*2];
       }
       din[12] |= SBP_Buf[B_IL].RxBuffer[12];
       din[13] |= SBP_Buf[B_IL].RxBuffer[13];
    }
    if((SBP_Buf[B_IR].returnStat==SBP_RTSTUS_OK)&&(SBP_Buf[B_IR].iRxBufferLen==14))  
    {   
       for(i=0;i<6;i++)
       {   freq_temp = SBP_Buf[B_IR].RxBuffer[  i*2];//高字节在前
       	   freq_temp <<= 8;
       	   freq_temp +=SBP_Buf[B_IR].RxBuffer[1+i*2];
           if(freq_temp > freq_temp_array[i])
           { din[  i*2] = SBP_Buf[B_IR].RxBuffer[  i*2];
           	 din[1+i*2] = SBP_Buf[B_IR].RxBuffer[1+i*2];
           }	
       }
       din[12] |= SBP_Buf[B_IR].RxBuffer[12];
       din[13] |= SBP_Buf[B_IR].RxBuffer[13];
    }


    //----------读通信板--------------------------
    general_ioc_board_read(B_CL);
    general_ioc_board_read(B_CR);
    //处理通信输入的数据
      for(i=0;i<8;i++) cin[i] = 0;
      if((SBP_Buf[B_CL].returnStat==SBP_RTSTUS_OK)&&(SBP_Buf[B_CL].iRxBufferLen==8))
      {
    	   for(i=0;i<8;i++) cin[i] |= SBP_Buf[B_CL].RxBuffer[i]; 
    	}
    	if((SBP_Buf[B_CR].returnStat==SBP_RTSTUS_OK)&&(SBP_Buf[B_CR].iRxBufferLen==8))
      {
    	   for(i=0;i<8;i++) cin[i] |= SBP_Buf[B_CR].RxBuffer[i]; 
    	}
    	
    //-----------写开出板-------------------	
      //准备开出板数据
      dout[0] = cin[0]; 
      dout[1] = cin[1];
      //写
      general_ioc_board_write(B_OL,dout,2);
      general_ioc_board_write(B_OR,dout,2);	
      	
    //-----------写通信板-----------------
      //准备通信板数据
      for(i=0;i<14;i++)  cout[   i] = din[  i];
      for(i=0;i<6;i++)   cout[14+i] = cin[2+i];
      //写
      general_ioc_board_write(B_CL,cout,20);
      general_ioc_board_write(B_CR,cout,20);

}      

     //ioc_fail_check();
     set_led(LED_MCU_STATUS,SSP_MB_LED_OFF);
     //等待应用程序周期结束
     while(sys_tick) {} 
     
//------------延迟--------------      
     set_sys_tick(ssp_delay_period);    
	   while(sys_tick) {}
     TermActivityScan(); 

/*--------END of SSP LOOP ----------------*/
}/*       END of SSP loop                 */



}/*END of main            */






⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -