📄 fesc_main.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 + -