This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320F28374S: can通信

Part Number: TMS320F28374S

#include "main.h"
float AdcIgrid[3] = {0};
float AdcVgrid[3] = {0};
float AdcItrack[3] = {0};
float AdcVdc = 0;
float AdcResults[12]={0};
float TEMPResults[4]={0};
float receivedV_CMD = 0.0f;

uint16_t modbus485_flag = 0;
uint16_t scictr = 0;
uint16_t check_Vdctime;


void main(void)
{
    InitSysCtrl();//sysclk = 200MHz

    DINT;
    InitPieCtrl();
    IER = 0x0000;  //Disable CPU interrupts
    IFR = 0x0000;  //clear all CPU interrupt flags
    InitPieVectTable();

    ConfigPie();

    InitCpuTimers();
    ConfigCpuTimer(&CpuTimer0, 200, 20000);//20ms  freq:200Mhz period:50us
    ConfigCpuTimer(&CpuTimer1, 200, 2000);//2ms
    ConfigCpuTimer(&CpuTimer2, 200, 20000);//20ms

    ConfigGpio();
    ConfigAdc();
    ConfigEpwm();
//    ConfigSci();
    ConfigSciModbus();
    ConfigCAN();


    //user init function
    StateUpdate_GlobalParaInit();  //disable epwm,safe restart set,set to idle state
    Init_Sample_Para();        //sample flag,counter,realvalue initial
    Init_Protection_Para();


    EINT;  // Enable Global interrupt INTM
    ERTM;  // Enable Global realtime interrupt DBGM


    //StartCpuTimer0();
    StartCpuTimer1();
    StartCpuTimer2();


    while (1)
    {
        ScanKey();

        LightBeepCMD();
//        CAN_SendSystemState(Sys_Current_State);
//        CAN_SendCurrentData(Sample_CalcResult.Itrack_Ave);
        // �򻯲��Դ���
        static uint32_t counter = 0;
        if(counter++ % 100 == 0) {  // ÿ100��ѭ������һ��
            uint16_t testData[2] = {0xAA55, counter};
            GpioDataRegs.GPCTOGGLE.bit.GPIO89 = 1;  // ����ָʾ��
            CAN_SendData(16, 0x123, testData, 2);
            GpioDataRegs.GPCTOGGLE.bit.GPIO89 = 1;  // ����ָʾ��
        }

        if (modbus485_flag == 1)
        {
            modbus485_flag = 0;
            Deal_Modbus485();

        }





    }


}
void ConfigPie(void)//�����
{
    EALLOW;
    PieVectTable.TIMER0_INT = &CpuTimer0_ISR;
    PieVectTable.TIMER1_INT = &CpuTimer1_2ms_ISR;
    PieVectTable.TIMER2_INT = &CpuTimer2_20ms_ISR;
    PieVectTable.ADCD1_INT = &Adcd_ISR;
    PieVectTable.SCIA_RX_INT = &SciaModbusRxFifo_ISR;
    PieVectTable.CANA0_INT = &CAN_ISR;
    EDIS;

    PieCtrlRegs.PIEIER1.bit.INTx7 = 1;//cputimer0
    PieCtrlRegs.PIEIER1.bit.INTx6 = 1;//adcd
    PieCtrlRegs.PIEIER9.bit.INTx3 = 1;//scia rx
    PieCtrlRegs.PIEIER9.bit.INTx1 = 1;//can int

    IER |= M_INT1;//cputimer0 adcd
    IER |= M_INT13;//cputimer1
    IER |= M_INT14;//cputimer2

    IER |= M_INT9;//scia rx
}

void ConfigGpio(void)
{
    EALLOW;
    //output
    //led88
    GpioCtrlRegs.GPCPUD.bit.GPIO88 = 1;    //PUD DISl:1��ENABLE:0
    GpioCtrlRegs.GPCDIR.bit.GPIO88 = 1;   //1:OUT;0:IN
    GpioCtrlRegs.GPCMUX2.bit.GPIO88 = 0;   //GPIO
    GpioDataRegs.GPCCLEAR.bit.GPIO88 = 1;  //DATA CLEAR


    //led89
    GpioCtrlRegs.GPCPUD.bit.GPIO89 = 1;
    GpioCtrlRegs.GPCDIR.bit.GPIO89 = 1;
    GpioCtrlRegs.GPCMUX2.bit.GPIO89 = 0;
    GpioDataRegs.GPCCLEAR.bit.GPIO89 = 1;


    //led90
    GpioCtrlRegs.GPCPUD.bit.GPIO90 = 1;
    GpioCtrlRegs.GPCDIR.bit.GPIO90 = 1;
    GpioCtrlRegs.GPCMUX2.bit.GPIO90 = 0;
    GpioDataRegs.GPCCLEAR.bit.GPIO90 = 1;


    //ACContactor_Ctrl
    GpioCtrlRegs.GPBPUD.bit.GPIO44 = 1;
    GpioCtrlRegs.GPBDIR.bit.GPIO44 = 1;
    GpioCtrlRegs.GPBMUX1.bit.GPIO44 = 0;
    GpioDataRegs.GPBCLEAR.bit.GPIO44 = 1;
    //fan ctrl
    GpioCtrlRegs.GPBPUD.bit.GPIO63 = 1;
    GpioCtrlRegs.GPBDIR.bit.GPIO63 = 1;
    GpioCtrlRegs.GPBMUX2.bit.GPIO63 = 0;
    GpioDataRegs.GPBCLEAR.bit.GPIO63 = 1;


    //Light_Yellow
    GpioCtrlRegs.GPCPUD.bit.GPIO64 = 1;
    GpioCtrlRegs.GPCDIR.bit.GPIO64 = 1;
    GpioCtrlRegs.GPCMUX1.bit.GPIO64 = 0;
    GpioDataRegs.GPCCLEAR.bit.GPIO64 = 1;

    //Light_Green
    GpioCtrlRegs.GPCPUD.bit.GPIO65 = 1;
    GpioCtrlRegs.GPCDIR.bit.GPIO65 = 1;
    GpioCtrlRegs.GPCMUX1.bit.GPIO65 = 0;
    GpioDataRegs.GPCCLEAR.bit.GPIO65 = 1;


    //Light_Red
    GpioCtrlRegs.GPCPUD.bit.GPIO66 = 1;
    GpioCtrlRegs.GPCDIR.bit.GPIO66 = 1;
    GpioCtrlRegs.GPCMUX1.bit.GPIO66 = 0;
    GpioDataRegs.GPCCLEAR.bit.GPIO66 = 1;
    //IGBT
    GpioCtrlRegs.GPBPUD.bit.GPIO60 = 1;
    GpioCtrlRegs.GPBDIR.bit.GPIO60 = 1;
    GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 0;
    GpioDataRegs.GPBCLEAR.bit.GPIO60 = 1;
    //RELAY
    GpioCtrlRegs.GPBPUD.bit.GPIO59 = 1;
    GpioCtrlRegs.GPBDIR.bit.GPIO59 = 1;
    GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 0;
    GpioDataRegs.GPBCLEAR.bit.GPIO59 = 1;

    //����
    GpioCtrlRegs.GPBPUD.bit.GPIO58 = 1;
    GpioCtrlRegs.GPBDIR.bit.GPIO58 = 1;
    GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 0;
    GpioDataRegs.GPBCLEAR.bit.GPIO58 = 1;


    //TEMP0
    GpioCtrlRegs.GPCPUD.bit.GPIO68 = 1;
    GpioCtrlRegs.GPCDIR.bit.GPIO68 = 1;
    GpioCtrlRegs.GPCMUX1.bit.GPIO68 = 0;
    GpioDataRegs.GPCCLEAR.bit.GPIO68 = 1;

    //TEMP1
    GpioCtrlRegs.GPCPUD.bit.GPIO69 = 1;
    GpioCtrlRegs.GPCDIR.bit.GPIO69 = 1;
    GpioCtrlRegs.GPCMUX1.bit.GPIO69 = 0;
    GpioDataRegs.GPCCLEAR.bit.GPIO69 = 1;



    //input
    //key reset
    GpioCtrlRegs.GPAPUD.bit.GPIO8 = 1;    //1:DISABLE;0:ENABLE
    GpioCtrlRegs.GPADIR.bit.GPIO8 = 0;    //1:OUT;0:IN
    GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 0;   //0:GPIO
    GpioDataRegs.GPACLEAR.bit.GPIO8 = 1;  //1:CLEAR
    //key start
    GpioCtrlRegs.GPAPUD.bit.GPIO9 = 1;
    GpioCtrlRegs.GPADIR.bit.GPIO9= 0;
    GpioCtrlRegs.GPAMUX1.bit.GPIO9 = 0;
    GpioDataRegs.GPACLEAR.bit.GPIO9 = 1;
    //key stop
    GpioCtrlRegs.GPDPUD.bit.GPIO99 = 1;
    GpioCtrlRegs.GPDDIR.bit.GPIO99 = 0;
    GpioCtrlRegs.GPDMUX1.bit.GPIO99 = 0;
    GpioDataRegs.GPDCLEAR.bit.GPIO99 = 1;
    //ac contactor return
    GpioCtrlRegs.GPAPUD.bit.GPIO5 = 1;
    GpioCtrlRegs.GPADIR.bit.GPIO5 = 0;
    GpioCtrlRegs.GPAMUX1.bit.GPIO5 = 0;
    GpioDataRegs.GPACLEAR.bit.GPIO5 = 1;

    // Track Temp check
    GpioCtrlRegs.GPBPUD.bit.GPIO62 = 1;
    GpioCtrlRegs.GPBDIR.bit.GPIO62 = 0;
    GpioCtrlRegs.GPBMUX2.bit.GPIO62 = 0;
    GpioDataRegs.GPBCLEAR.bit.GPIO62 = 1;

    // IGBT check
    GpioCtrlRegs.GPBPUD.bit.GPIO61 = 1;
    GpioCtrlRegs.GPBDIR.bit.GPIO61 = 0;
    GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 0;
    GpioDataRegs.GPBCLEAR.bit.GPIO61 = 1;


    //Itrack hardware protection signal from CPLD(PRO2)
    GpioCtrlRegs.GPBMUX1.bit.GPIO43 = 0;
    GpioCtrlRegs.GPBDIR.bit.GPIO43 = 0; // gpio input
    GpioCtrlRegs.GPBPUD.bit.GPIO43 = 1; //disable pull-up
    GpioCtrlRegs.GPBQSEL1.bit.GPIO43 = 3; //async input mode
    GpioDataRegs.GPBSET.bit.GPIO43 = 1;

    //Vdc hardware protection signal from CPLD(PRO1)
    GpioCtrlRegs.GPCMUX1.bit.GPIO67 = 0;
    GpioCtrlRegs.GPCDIR.bit.GPIO67 = 0; // gpio input
    GpioCtrlRegs.GPCPUD.bit.GPIO67 = 1; //disable pull-up
    GpioCtrlRegs.GPCQSEL1.bit.GPIO67 = 3; //async input mode
    GpioDataRegs.GPCDAT.bit.GPIO67 = 1;
    //pro3
//    GpioCtrlRegs.GPBPUD.bit.GPIO43 = 1;
//    GpioCtrlRegs.GPBDIR.bit.GPIO43= 0;
//    GpioCtrlRegs.GPBMUX1.bit.GPIO43 = 0;
//    GpioDataRegs.GPBCLEAR.bit.GPIO43=1;
    //����GPIO
//    GpioCtrlRegs.GPAPUD.bit.GPIO22 = 1;
//    GpioCtrlRegs.GPADIR.bit.GPIO22 = 1;
//    GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 0;
//    GpioDataRegs.GPACLEAR.bit.GPIO22 = 1;

    EALLOW;
    //config gpio87 for scib rx

    GpioCtrlRegs.GPCPUD.bit.GPIO87 = 1;
    GpioCtrlRegs.GPCDIR.bit.GPIO87 = 0;
    GpioCtrlRegs.GPCMUX2.bit.GPIO87 = 0;
    GpioDataRegs.GPCCLEAR.bit.GPIO87 = 1;
//    GpioDataRegs.GPCDAT.bit.GPIO87 = 0;

    //config gpio86 for scib tx
    GpioCtrlRegs.GPCPUD.bit.GPIO86 = 1;
    GpioCtrlRegs.GPCDIR.bit.GPIO86 = 1;
    GpioCtrlRegs.GPCMUX2.bit.GPIO86 = 0;
    GpioDataRegs.GPCCLEAR.bit.GPIO86 = 1;

    //config gpio86 for scib re
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
    GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1;//disable pull-up
    GpioDataRegs.GPASET.bit.GPIO0 = 1; //zhujifasong
    EDIS;


    EALLOW;
    //config gpio25 for MOSI send
    GpioCtrlRegs.GPAPUD.bit.GPIO25 = 1;
    GpioCtrlRegs.GPADIR.bit.GPIO25 = 1;
    GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 0;
    GpioDataRegs.GPACLEAR.bit.GPIO25 = 1;

    //config gpio25 for MISO receive
    GpioCtrlRegs.GPAPUD.bit.GPIO22 = 1;
    GpioCtrlRegs.GPADIR.bit.GPIO22 = 0;
    GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 0;
    GpioDataRegs.GPACLEAR.bit.GPIO22 = 1;
//    GpioDataRegs.GPADAT.bit.GPIO22 = 0;

////    config gpio70 for CAN TX
//    GpioCtrlRegs.GPCPUD.bit.GPIO71 = 1;
//    GpioCtrlRegs.GPCDIR.bit.GPIO71 = 0;
//    GpioCtrlRegs.GPCMUX1.bit.GPIO71 = 0;
//    GpioDataRegs.GPCCLEAR.bit.GPIO71 = 1;
//
//    //config gpio70 for CAN RX
//    GpioCtrlRegs.GPCPUD.bit.GPIO70 = 1;
//    GpioCtrlRegs.GPCDIR.bit.GPIO70 = 0;
//    GpioCtrlRegs.GPCMUX1.bit.GPIO70 = 0;
//    GpioDataRegs.GPCCLEAR.bit.GPIO70 = 1;

    EDIS;


    EDIS;
}
#define TIMER_TBPRD  1250  // Period register
Uint32 CMPANUM = 625;        // CMPA
Uint32 CMPBNUM = 470;        // CMPB
Uint32 CMPANUMSCR = 0;        // CMPA1
Uint32 CMPBNUMSCR = 0;        // CMPB1
#define DB_DURATION  160  //160 3.2us//100*20ns=2us;D=48%


void ConfigEpwm(void)
{
#ifdef CODE_MASTER
    EALLOW;
    SyncSocRegs.SYNCSELECT.bit.SYNCOUT = 0x2; //select epwm7 sync signal to syncout
    //config gpio24 for output xbar1
    GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 1;//mux: output xbar1
    GpioCtrlRegs.GPAPUD.bit.GPIO24 = 1; //disable pull-up
    GpioCtrlRegs.GPADIR.bit.GPIO24 = 1;//output

    //config gpio25 for output xbar2
    GpioCtrlRegs.GPAPUD.bit.GPIO25 = 1; //disable pull-up
    GpioCtrlRegs.GPADIR.bit.GPIO25 = 1;//output
    GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 1;//mux: output xbar2


    //config output xbar1 for external sync out
    OutputXbarRegs.OUTPUT1MUX0TO15CFG.bit.MUX14 = 0x3; //select external sync out
    OutputXbarRegs.OUTPUT1MUXENABLE.bit.MUX14 = 0x1; //enable xbar mux
    //config output xbar2 for external sync out
    OutputXbarRegs.OUTPUT2MUX0TO15CFG.bit.MUX14 = 0x3; //select external sync out
    OutputXbarRegs.OUTPUT2MUXENABLE.bit.MUX14 = 0x1; //enable xbar mux
    EDIS;
#endif
#ifdef CODE_SLAVE
    EALLOW;
    //Config Gpio23 for syncin
    GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO23 = 0; // gpio input
    GpioCtrlRegs.GPAPUD.bit.GPIO23 = 1; //disable pull-up
    GpioCtrlRegs.GPAQSEL2.bit.GPIO23 = 0; //sync input mode
    //config input xbar5 to link gpio23 and EXTSYNCIN1
    InputXbarRegs.INPUT5SELECT = 23;//select gpio 23
    //select external sync for epwm7
    SyncSocRegs.SYNCSELECT.bit.EPWM7SYNCIN = 0x5; //select EXTSYNCIN1
    EDIS;
#endif
    InitEPwm6Gpio();  //epwm.c,EPWM IO INIT         ,100MHz by default
    InitEPwm7Gpio();
    InitEPwm8Gpio();

    //pro3��disable TZ
    EALLOW;
    ////Config Gpio42 PRO3 for ~TZ1
    GpioCtrlRegs.GPBMUX1.bit.GPIO42 = 0;
    GpioCtrlRegs.GPBDIR.bit.GPIO42 = 0; // gpio input
    GpioCtrlRegs.GPBPUD.bit.GPIO42 = 1; //disable pull-up
    GpioCtrlRegs.GPBQSEL1.bit.GPIO42 = 2; //6 Samples Qualification
    GpioCtrlRegs.GPBCTRL.bit.QUALPRD1 = 10; //qualification window = 2 * (PRD1 * 2) * 5ns * 5(Samples) = 1us
    //input xbar
    InputXbarRegs.INPUT1SELECT = 42;//select gpio 42
    EDIS;

//    //pro4
//    EALLOW;
//    //Config Gpio42 PRO3 for ~TZ1
//    GpioCtrlRegs.GPBMUX1.bit.GPIO47 = 0;
//    GpioCtrlRegs.GPBDIR.bit.GPIO47 = 0; // gpio input
//    GpioCtrlRegs.GPBPUD.bit.GPIO47 = 1; //disable pull-up
//    GpioCtrlRegs.GPBQSEL1.bit.GPIO47 = 3; //async input mode
//    //input xbar
//    InputXbarRegs.INPUT1SELECT = 47;//select gpio 47
//    EDIS;




    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;//turn off epwm clk,turn on after config

    // Setup TBCLK
    EPwm6Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count upDOWM
    EPwm6Regs.TBPRD = TIMER_TBPRD;                 // Set timer period
    EPwm6Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable phase loading
    EPwm6Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable phase loading

    EPwm6Regs.TBPHS.bit.TBPHS = 0x0000;            // Phase is 0
    EPwm6Regs.TBCTR = 0x0000;                      // Clear counter
    EPwm6Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // Clock ratio to SYSCLKOUT
    EPwm6Regs.TBCTL.bit.CLKDIV = TB_DIV2;          //tbclk = 100M / 2 = 50M
//  EPwm6Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;

    EPwm7Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count upDOWM
    EPwm7Regs.TBPRD = TIMER_TBPRD;                 // Set timer period
#ifdef CODE_MASTER
    EPwm7Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable phase loading
#endif
#ifdef CODE_SLAVE
    EPwm7Regs.TBCTL.bit.PHSEN = TB_ENABLE;        // Enable phase loading
    EPwm7Regs.TBCTL.bit.PHSDIR = 1;               //count up after sync
#endif
    EPwm7Regs.TBPHS.bit.TBPHS = 0x0000;            // Phase is 0
    EPwm7Regs.TBCTR = 0x0000;                      // Clear counter
    EPwm7Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // Clock ratio to SYSCLKOUT
    EPwm7Regs.TBCTL.bit.CLKDIV = TB_DIV2;
    EPwm7Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;




    EPwm8Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count upDOWM
    EPwm8Regs.TBPRD = TIMER_TBPRD;                 // Set timer period
    EPwm8Regs.TBCTL.bit.PHSEN = TB_ENABLE;        // Enable phase loading
    EPwm8Regs.TBPHS.bit.TBPHS = 1180;            // Phase is 170 , under initial condition
    EPwm8Regs.TBCTL.bit.PHSDIR = 0;               //count down after sync
    EPwm8Regs.TBCTR = 0x0000;                      // Clear counter
    EPwm8Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // Clock ratio to SYSCLKOUT
    EPwm8Regs.TBCTL.bit.CLKDIV = TB_DIV2;
//  EPwm8Regs.TBCTL.bit.SYNCOSEL=TB_CTR_ZERO;

    // Setup shadow register load on ZERO

    EPwm6Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
    EPwm6Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    EPwm6Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    EPwm6Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

    EPwm7Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
    EPwm7Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    EPwm7Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    EPwm7Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

    EPwm8Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
    EPwm8Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    EPwm8Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    EPwm8Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

    // Set Compare values
    //
    EPwm6Regs.CMPA.bit.CMPA = CMPANUMSCR;      // Set compare A value
    EPwm6Regs.CMPB.bit.CMPB = CMPBNUMSCR;      // Set Compare B value

    EPwm7Regs.CMPA.bit.CMPA = CMPANUM;      // Set compare A value

//    EPwm7Regs.CMPC = 1180;// Phase is 170 , under initial condition


    EPwm8Regs.CMPA.bit.CMPA = CMPANUM;      // Set compare A value
    EPwm8Regs.CMPB.bit.CMPB = CMPBNUM;      // Set Compare B value

    // Set actions

    //EPWM6B:0-5V EPWM6A:0-20mA, choose one
    EPwm6Regs.AQCTLA.bit.CAU = AQ_CLEAR;            // Clear PWM2A on Period
    EPwm6Regs.AQCTLA.bit.CAD = AQ_SET;              // Set PWM2A on event A,
                                                    // up count
    EPwm6Regs.AQCTLB.bit.CAU = AQ_CLEAR;            // Clear PWM2B on Period
    EPwm6Regs.AQCTLB.bit.CAD = AQ_SET;              // Set PWM2B on event B,

    EPwm7Regs.AQCTLA.bit.CAU = AQ_CLEAR;            // Clear PWM2A on Period
    EPwm7Regs.AQCTLA.bit.CAD = AQ_SET;              // Set PWM2B on event B,


    EPwm8Regs.AQCTLA.bit.CAU = AQ_CLEAR;            // Clear PWM2A on Period
    EPwm8Regs.AQCTLA.bit.CAD = AQ_SET;              // Set PWM2A on event A,
    EPwm8Regs.AQCTLA.bit.CBD = AQ_SET;              // Set PWM2A on event A,





    // Active Low complementary PWMs - setup the deadband

//    EPwm6Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
//    EPwm6Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
//    EPwm6Regs.DBCTL.bit.IN_MODE = DBA_RED_DBB_FED;
//    EPwm6Regs.DBRED.bit.DBRED = DB_DURATION;
//    EPwm6Regs.DBFED.bit.DBFED = DB_DURATION;


    EPwm7Regs.DBCTL.bit.IN_MODE = DBA_ALL;   //A:UP EDGE;B:FALL EDGE DBA_RED_DBB_FED
    EPwm7Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;  //11:TOTAL ENABLE;00:DISABLE
    EPwm7Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;      //10:only B invert
    EPwm7Regs.DBRED.bit.DBRED = DB_DURATION;     //UP DELAY
    EPwm7Regs.DBFED.bit.DBFED = DB_DURATION;     //FALL DELAY



    EPwm8Regs.DBCTL.bit.IN_MODE = DBA_ALL;
    EPwm8Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
    EPwm8Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
    EPwm8Regs.DBRED.bit.DBRED = DB_DURATION;
    EPwm8Regs.DBFED.bit.DBFED = DB_DURATION;
    EPwm8Regs.DBCTL.bit.OUTSWAP = 3;


    //ADC trig setting
    EPwm7Regs.ETSEL.bit.SOCASEL = ET_CTR_PRDZERO;      //SOC event choose
    EPwm7Regs.ETSEL.bit.SOCAEN = 1;                  //enable SOCA
    EPwm7Regs.ETPS.bit.SOCAPRD = 1;                  //1-3times trig ADC

//    EPwm7Regs.ETSEL.bit.SOCBSEL = ET_CTR_PRDZERO;
//    EPwm7Regs.ETSEL.bit.SOCBEN = 1;
//    EPwm7Regs.ETPS.bit.SOCBPRD = 1;

    //TZ SETTING
    //EPwm6Regs.TZSEL.bit.CBC1 = 1;//select TZ1 cbc
    EPwm6Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
    EPwm6Regs.TZCTL.bit.TZB = TZ_FORCE_LO;
    //EPwm6Regs.TZCLR.bit.CBCPULSE = 0; //cbc clear when CTR = 0
    //EPwm6Regs.TZCLR.bit.OST = 1;
    EPwm6Regs.TZFRC.bit.OST = 1; //force oneshot TZ at start



    EPwm7Regs.TZSEL.bit.CBC1 = 1;//select TZ1 cbc
    EPwm7Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
    EPwm7Regs.TZCTL.bit.TZB = TZ_FORCE_LO;
    EPwm7Regs.TZCLR.bit.CBCPULSE = 0; //cbc clear when CTR = 0
    //EPwm7Regs.TZCLR.bit.OST = 1;
    EPwm7Regs.TZFRC.bit.OST = 1;

    EPwm8Regs.TZSEL.bit.CBC1 = 1;//select TZ1 cbc
    EPwm8Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
    EPwm8Regs.TZCTL.bit.TZB = TZ_FORCE_LO;
    EPwm8Regs.TZCLR.bit.CBCPULSE = 0; //cbc clear when CTR = 0
    //EPwm8Regs.TZCLR.bit.OST = 1;
    EPwm8Regs.TZFRC.bit.OST = 1;
    EDIS;

    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    EDIS;
}
void ConfigAdc(void)
{
    EALLOW;

    AdcaRegs.ADCCTL2.bit.PRESCALE = 6; //set ADCCLK divider to 200M/4=50M
    AdcbRegs.ADCCTL2.bit.PRESCALE = 6;
    AdccRegs.ADCCTL2.bit.PRESCALE = 6;
    AdcdRegs.ADCCTL2.bit.PRESCALE = 6;

    //12 bit single mode
    AdcSetMode(ADC_ADCA, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);
    AdcSetMode(ADC_ADCB, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);
    AdcSetMode(ADC_ADCC, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);
    AdcSetMode(ADC_ADCD, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);

    //Set pulse positions to late
    AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;  //1:EOC convert�O0: AFTER SAMPLE
    AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;
    AdccRegs.ADCCTL1.bit.INTPULSEPOS = 1;
    AdcdRegs.ADCCTL1.bit.INTPULSEPOS = 1;

    //power up the ADC
    AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;   //ADC power up
    //delay for 1ms to allow ADC time to power up
    DELAY_US(1000);  //delay 1ms then power up
    AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;
    DELAY_US(1000);
    AdccRegs.ADCCTL1.bit.ADCPWDNZ = 1;
    DELAY_US(1000);
    AdcdRegs.ADCCTL1.bit.ADCPWDNZ = 1;
    DELAY_US(1000);

    Uint16 acqps;

    //
    // Determine minimum acquisition window (in SYSCLKS) based on resolution
    //
    if(ADC_RESOLUTION_12BIT == AdcaRegs.ADCCTL2.bit.RESOLUTION)
    {
        acqps = 14; //75ns
    }
    else //resolution is 16-bit
    {
        acqps = 63; //320ns
    }
    //ADCINA0 VgridA
    AdcaRegs.ADCSOC0CTL.bit.CHSEL     = 0;
    AdcaRegs.ADCSOC0CTL.bit.ACQPS     = acqps;
    AdcaRegs.ADCSOC0CTL.bit.TRIGSEL   = 17;

    //ADCINB0 VgridC
    AdcbRegs.ADCSOC0CTL.bit.CHSEL     = 0;
    AdcbRegs.ADCSOC0CTL.bit.ACQPS     = acqps;
    AdcbRegs.ADCSOC0CTL.bit.TRIGSEL   = 17;

    //ADCINC2 IgridA
    AdccRegs.ADCSOC0CTL.bit.CHSEL     = 2;
    AdccRegs.ADCSOC0CTL.bit.ACQPS     = acqps;
    AdccRegs.ADCSOC0CTL.bit.TRIGSEL   = 17;

    //ADCIND1 IHbridge
    AdcdRegs.ADCSOC0CTL.bit.CHSEL     = 1;
    AdcdRegs.ADCSOC0CTL.bit.ACQPS     = acqps;
    AdcdRegs.ADCSOC0CTL.bit.TRIGSEL   = 17;


    //ADCINB2 VgridB
    AdcbRegs.ADCSOC1CTL.bit.CHSEL     = 2;
    AdcbRegs.ADCSOC1CTL.bit.ACQPS     = acqps;
    AdcbRegs.ADCSOC1CTL.bit.TRIGSEL   = 17;

    //ADCINC3 IgridB
    AdccRegs.ADCSOC1CTL.bit.CHSEL     = 3;
    AdccRegs.ADCSOC1CTL.bit.ACQPS     = acqps;
    AdccRegs.ADCSOC1CTL.bit.TRIGSEL   = 17;

    //ADCIND2 Itrack
    AdcdRegs.ADCSOC1CTL.bit.CHSEL     = 2;
    AdcdRegs.ADCSOC1CTL.bit.ACQPS     = acqps;
    AdcdRegs.ADCSOC1CTL.bit.TRIGSEL   = 17;


    //ADCINB3 Vdc
    AdcbRegs.ADCSOC2CTL.bit.CHSEL     = 3;
    AdcbRegs.ADCSOC2CTL.bit.ACQPS     = acqps;
    AdcbRegs.ADCSOC2CTL.bit.TRIGSEL   = 17;

    //ADCINC4 IgridC
    AdccRegs.ADCSOC2CTL.bit.CHSEL     = 4;     //SOC0 will convert pin C4
    AdccRegs.ADCSOC2CTL.bit.ACQPS     = acqps; //sample window is 100 SYSCLK cycles
    AdccRegs.ADCSOC2CTL.bit.TRIGSEL   = 17;     //trigger on ePWM7 SOCA/C

    //ADCIND3 Itrack
    AdcdRegs.ADCSOC2CTL.bit.CHSEL     = 3;
    AdcdRegs.ADCSOC2CTL.bit.ACQPS     = acqps;
    AdcdRegs.ADCSOC2CTL.bit.TRIGSEL   = 17;

    //ADCIN15 Vref
    AdcaRegs.ADCSOC15CTL.bit.CHSEL     = 15;
    AdcaRegs.ADCSOC15CTL.bit.ACQPS     = acqps;
    AdcaRegs.ADCSOC15CTL.bit.TRIGSEL   = 17;

    //ADCIND4 TempIGBT
    AdcdRegs.ADCSOC3CTL.bit.CHSEL     = 4;
    AdcdRegs.ADCSOC3CTL.bit.ACQPS     = acqps;
    AdcdRegs.ADCSOC3CTL.bit.TRIGSEL   = 17;

    //TEMP ���
    AdcdRegs.ADCSOC0CTL.bit.CHSEL     = 0;
    AdcdRegs.ADCSOC0CTL.bit.ACQPS     = acqps;
    AdcdRegs.ADCSOC0CTL.bit.TRIGSEL   = 17;

    //ADC interrupt
    AdcdRegs.ADCINTSEL1N2.bit.INT1SEL = 3;  //end of SOC3 will set INT1 flag
    AdcdRegs.ADCINTSEL1N2.bit.INT1E   = 1;  //enable INT1 flag
    AdcdRegs.ADCINTFLGCLR.bit.ADCINT1 = 17;  //make sure INT1 flag is cleared

    EDIS;
}
void ConfigSciModbus()
{
    EALLOW;
    //config gpio85 for scia rx
    GpioCtrlRegs.GPCMUX2.bit.GPIO85 = 1;
    GpioCtrlRegs.GPCGMUX2.bit.GPIO85 = 1;
    GpioCtrlRegs.GPCQSEL2.bit.GPIO85 = 3;//async input mode
    GpioCtrlRegs.GPCPUD.bit.GPIO85 = 1;//disable pull-up

    //config gpio84 for scia tx
    GpioCtrlRegs.GPCMUX2.bit.GPIO84 = 1;
    GpioCtrlRegs.GPCGMUX2.bit.GPIO84 = 1;
    GpioCtrlRegs.GPCPUD.bit.GPIO84 = 1;//disable pull-up
    //config gpio83 for scia re
    GpioCtrlRegs.GPCMUX2.bit.GPIO83 = 0;
    GpioCtrlRegs.GPCDIR.bit.GPIO83 = 1;
    GpioCtrlRegs.GPCPUD.bit.GPIO83 = 1;//disable pull-up
    GpioDataRegs.GPCCLEAR.bit.GPIO83 = 1;//clear gpio to rx
    EDIS;




    //low speed clk = sysclk/4 by default
    EALLOW;
    ClkCfgRegs.LOSPCP.bit.LSPCLKDIV = 1;//low speed clk = sysclk/2 = 100M
    EDIS;

    //config scib
    SciaRegs.SCICCR.bit.STOPBITS = 0; //1 stop bit
    SciaRegs.SCICCR.bit.PARITY = 0; //0 for odd, 1 for even parity
    SciaRegs.SCICCR.bit.PARITYENA = 0; //disable parity
    SciaRegs.SCICCR.bit.LOOPBKENA = 0; //disable loop back
    SciaRegs.SCICCR.bit.SCICHAR = 7; //8 data bit

    SciaRegs.SCICTL1.bit.RXERRINTENA = 1; //disable rx err int
    SciaRegs.SCICTL1.bit.SWRESET = 0; //reset sci, later need to re-enable by write 1 here
    SciaRegs.SCICTL1.bit.SLEEP = 0; //disable sleep mode
    SciaRegs.SCICTL1.bit.TXWAKE = 0; //no need to use tx feature for addr frame
    SciaRegs.SCICTL1.bit.RXENA = 1; //enable rx
    SciaRegs.SCICTL1.bit.TXENA = 1; // enable tx

    SciaRegs.SCICTL2.bit.RXBKINTENA = 0; //disable rxbk int for both rxrdy and brkdt
    SciaRegs.SCICTL2.bit.TXINTENA = 0; //disable  tx int for txrdy

    //config sci fifo
    SciaRegs.SCIFFTX.bit.SCIRST = 1;//sci not reset
    SciaRegs.SCIFFTX.bit.SCIFFENA = 1; //enable fifo
    SciaRegs.SCIFFTX.bit.TXFIFORESET = 0;// reset tx fifo pointer and hold
    SciaRegs.SCIFFTX.bit.TXFFINTCLR = 1; //clear the fifo int flag
    SciaRegs.SCIFFTX.bit.TXFFIENA = 0; //disable fifo int
    SciaRegs.SCIFFTX.bit.TXFFIL = 0;//fifo int level = 0

    SciaRegs.SCIFFRX.bit.RXFFOVRCLR = 1;//clear fifo overflow flag
    SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1; //clear fifo int flag
    SciaRegs.SCIFFRX.bit.RXFIFORESET = 0;// reset rx fifo pointer and hold
    SciaRegs.SCIFFRX.bit.RXFFIENA = 1;//enable fifo int
    SciaRegs.SCIFFRX.bit.RXFFIL = 8;//fifo int level = 0x11111 by default


    //SCI Baud = LSPCLK / ((BRR + 1) *8) = 100M / ((1301 + 1) *8) = 38400.0 bps, BRR = 324
    //4800 2603 0xa2b
    //9600 515h
    SciaRegs.SCIHBAUD.all = 0x5;
    SciaRegs.SCILBAUD.all = 0x15;
    SciaRegs.SCIFFTX.bit.TXFIFORESET = 1;// re-enable tx fifo
    SciaRegs.SCIFFRX.bit.RXFIFORESET = 1;// re-enable rx fifo
    SciaRegs.SCICTL1.bit.SWRESET = 1;
}
void ConfigSci()
{
    EALLOW;
    //config gpio87 for scib rx

    GpioCtrlRegs.GPCPUD.bit.GPIO87 = 1;
    GpioCtrlRegs.GPCDIR.bit.GPIO87 = 0;
    GpioCtrlRegs.GPCMUX2.bit.GPIO87 = 0;
    GpioDataRegs.GPCCLEAR.bit.GPIO87 = 1;

    //config gpio86 for scib tx
    GpioCtrlRegs.GPCPUD.bit.GPIO86 = 1;
    GpioCtrlRegs.GPCDIR.bit.GPIO86 = 1;
    GpioCtrlRegs.GPCMUX2.bit.GPIO86 = 0;
    GpioDataRegs.GPCCLEAR.bit.GPIO86 = 1;

    //config gpio86 for scib re
    GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
    GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1;//disable pull-up
    GpioDataRegs.GPASET.bit.GPIO0 = 1;
    EDIS;
    //low speed clk = sysclk/4 by default
    EALLOW;
    ClkCfgRegs.LOSPCP.bit.LSPCLKDIV = 1;//low speed clk = sysclk/2 = 100M
    EDIS;

    //config scib
    ScibRegs.SCICCR.bit.STOPBITS = 0; //1 stop bit
    ScibRegs.SCICCR.bit.PARITY = 0; //0 for odd, 1 for even parity
    ScibRegs.SCICCR.bit.PARITYENA = 0; //disable parity
    ScibRegs.SCICCR.bit.LOOPBKENA = 0; //disable loop back
    ScibRegs.SCICCR.bit.SCICHAR = 7; //8 data bit

    ScibRegs.SCICTL1.bit.RXERRINTENA = 0; //disable rx err int
    ScibRegs.SCICTL1.bit.SWRESET = 0; //reset sci, later need to re-enable by write 1 here
    ScibRegs.SCICTL1.bit.SLEEP = 0; //disable sleep mode
    ScibRegs.SCICTL1.bit.TXWAKE = 0; //no need to use tx feature for addr frame
    ScibRegs.SCICTL1.bit.RXENA = 1; //enable rx
    ScibRegs.SCICTL1.bit.TXENA = 1; // enable tx

    ScibRegs.SCICTL2.bit.RXBKINTENA = 0; //disable rxbk int for both rxrdy and brkdt
    ScibRegs.SCICTL2.bit.TXINTENA = 0; //disable  tx int for txrdy

    //config sci fifo
    ScibRegs.SCIFFTX.bit.SCIRST = 1;//sci not reset
    ScibRegs.SCIFFTX.bit.SCIFFENA = 1; //enable fifo
    ScibRegs.SCIFFTX.bit.TXFIFORESET = 0;// reset tx fifo pointer and hold
    ScibRegs.SCIFFTX.bit.TXFFINTCLR = 1; //clear the fifo int flag
    ScibRegs.SCIFFTX.bit.TXFFIENA = 0; //disable fifo int
    ScibRegs.SCIFFTX.bit.TXFFIL = 0;//fifo int level = 0

    ScibRegs.SCIFFRX.bit.RXFFOVRCLR = 1;//clear fifo overflow flag
    ScibRegs.SCIFFRX.bit.RXFFINTCLR = 1; //clear fifo int flag
    ScibRegs.SCIFFRX.bit.RXFIFORESET = 0;// reset rx fifo pointer and hold
    ScibRegs.SCIFFRX.bit.RXFFIENA = 0;//disable fifo int
    ScibRegs.SCIFFRX.bit.RXFFIL = 4;//fifo int level = 0x11111 by default


    //SCI Baud = LSPCLK / ((BRR + 1) *8) = 100M / ((1301 + 1) *8) = 38400.0 bps, BRR = 324
    //4800 2603 0xa2b
    ScibRegs.SCIHBAUD.all = 0xA;
    ScibRegs.SCILBAUD.all = 0x2b;
    ScibRegs.SCIFFTX.bit.TXFIFORESET = 1;// re-enable tx fifo
    ScibRegs.SCIFFRX.bit.RXFIFORESET = 1;// re-enable rx fifo
    ScibRegs.SCICTL1.bit.SWRESET = 1;

}
void Sci_SendByte(char a)
{
    //set 485 RE
    GpioDataRegs.GPASET.bit.GPIO0 = 1;
    while (ScibRegs.SCIFFTX.bit.TXFFST != 0) {}
    ScibRegs.SCITXBUF.bit.TXDT = a;
    //ScibRegs.SCITXBUF.all = a;
}

void Sci_SendData2Vofa()
{
    float scisysstate = (float)Sys_Current_State;
    uint16_t* pResult = (uint16_t*)&(Sample_CalcResult.Itrack_Ave);//send sample calc value
    uint16_t i = 0;
    for (i = 0; i < 24; i++, pResult++)
    {
        Sci_SendByte(*pResult & 0xFF);
        Sci_SendByte(*pResult >> 8);
    }
    pResult = (uint16_t*)&scisysstate;
    for (i = 0; i < 2; i++, pResult++)//send sysstate
    {
        Sci_SendByte(*pResult & 0xFF);
        Sci_SendByte(*pResult >> 8);
    }
    pResult = (uint16_t*)&Vdc_Ctrl_Filter.Out;
    for (i = 0; i < 2; i++, pResult++)//send sysstate
    {
        Sci_SendByte(*pResult & 0xFF);
        Sci_SendByte(*pResult >> 8);
    }
    pResult = (uint16_t*)&Vdc_Ctrl_PI.Error;
    for (i = 0; i < 2; i++, pResult++)//send sysstate
    {
        Sci_SendByte(*pResult & 0xFF);
        Sci_SendByte(*pResult >> 8);
    }
    pResult = (uint16_t*)&Vdc_Ctrl_PI.PI_Out;
    for (i = 0; i < 2; i++, pResult++)//send sysstate
    {
        Sci_SendByte(*pResult & 0xFF);
        Sci_SendByte(*pResult >> 8);
    }
    Sci_SendByte(0x00);
    Sci_SendByte(0x00);
    Sci_SendByte(0x80);
    Sci_SendByte(0x7f);
}

//canͨ��
void ConfigCAN(void)
{

    EALLOW;

    // ����GPIO70����CAN RX
    GpioCtrlRegs.GPCPUD.bit.GPIO70 = 1;    // ��������
    GpioCtrlRegs.GPCDIR.bit.GPIO70 = 0;    // ����
    GpioCtrlRegs.GPCMUX1.bit.GPIO70 = 3;   // ����ΪCANRXA����

    // ����GPIO71����CAN TX
    GpioCtrlRegs.GPCPUD.bit.GPIO71 = 1;    // ��������
    GpioCtrlRegs.GPCDIR.bit.GPIO71 = 1;    // ���
    GpioCtrlRegs.GPCMUX1.bit.GPIO71 = 3;   // ����ΪCANTXA����

    EDIS;

    EALLOW;

    // ����CANʱ��
    CpuSysRegs.PCLKCR10.bit.CAN_A = 1;

    EDIS;

    // �ȴ�����׼����
    while(CanaRegs.CAN_CTL.bit.Init != 1) {}

    EALLOW;

    // �����ʼ��ģʽ
    CanaRegs.CAN_CTL.bit.Init = 1;
    CanaRegs.CAN_CTL.bit.CCE = 1;

    // ����CANλ��ʱ
    // ����ϵͳʱ��100MHz��Ŀ�겨����1Mbps
    // Tq = (BRP+1)/100MHz = 100ns (BRP=0)
    // ͬ����=1Tq, ʱ���1=4Tq, ʱ���2=3Tq, ��ʱ��=8Tq
    CanaRegs.CAN_BTR.bit.BRP = 19 ;
    CanaRegs.CAN_BTR.bit.TSEG1 = 15;
    CanaRegs.CAN_BTR.bit.TSEG2 = 2;
    CanaRegs.CAN_BTR.bit.SJW = 1;

    // �˳���ʼ��ģʽ
    CanaRegs.CAN_CTL.bit.Init = 0;
    CanaRegs.CAN_CTL.bit.CCE = 0;

    EDIS;

    // �ȴ���ʼ�����
    while(CanaRegs.CAN_CTL.bit.Init == 1) {}

    // ��ʼ����Ϣ����16���ڷ��͵�������
        EALLOW;
        CanaRegs.CAN_IF1CMD.bit.MSG_NUM = 16;
        CanaRegs.CAN_IF1ARB.bit.ID = 0x101;    // ��������ID
        CanaRegs.CAN_IF1ARB.bit.Xtd = 0;       // ��׼ID
        CanaRegs.CAN_IF1ARB.bit.Dir = 0;       // ���ͷ���
        CanaRegs.CAN_IF1ARB.bit.MsgVal = 1;    // ��Ϣ��Ч
        CanaRegs.CAN_IF1MCTL.bit.DLC = 4;      // ���ݳ���4�ֽ�
        CanaRegs.CAN_IF1MCTL.bit.TxIE = 1;     // ʹ�ܷ����ж�
        EDIS;

        // ��ʼ����Ϣ����17���ڷ���ϵͳ״̬
        EALLOW;
        CanaRegs.CAN_IF1CMD.bit.MSG_NUM = 17;
        CanaRegs.CAN_IF1ARB.bit.ID = 0x102;    // ϵͳ״̬ID
        CanaRegs.CAN_IF1ARB.bit.Xtd = 0;       // ��׼ID
        CanaRegs.CAN_IF1ARB.bit.Dir = 0;       // ���ͷ���
        CanaRegs.CAN_IF1ARB.bit.MsgVal = 1;    // ��Ϣ��Ч
        CanaRegs.CAN_IF1MCTL.bit.DLC = 2;      // ���ݳ���2�ֽ�
        CanaRegs.CAN_IF1MCTL.bit.TxIE = 1;     // ʹ�ܷ����ж�
        EDIS;

        EALLOW;
        CanaRegs.CAN_IF2CMD.bit.MSG_NUM = 0;   // ѡ������0
        CanaRegs.CAN_IF2ARB.bit.ID = 0x123;    // ���ý���ID
        CanaRegs.CAN_IF2ARB.bit.Xtd = 0;       // ��׼֡
        CanaRegs.CAN_IF2ARB.bit.Dir = 1;       // ���շ���
        CanaRegs.CAN_IF2MCTL.bit.DLC = 4;      // Ԥ�ڽ���4�ֽ�
        CanaRegs.CAN_IF2MCTL.bit.RxIE = 1;     // ʹ�ܽ����ж�
        EDIS;



}
// ����ֱ����ѹ����
void CAN_SendData(uint16_t msgNum, uint32_t id, uint16_t* data, uint16_t length)
{
    EALLOW;
    // ������Ϣ����
    CanaRegs.CAN_IF1CMD.bit.MSG_NUM = msgNum;  // ѡ����Ϣ����
    CanaRegs.CAN_IF1CMD.bit.DIR = 1;       // д�뷽��
    CanaRegs.CAN_IF1CMD.bit.Arb = 1;       // �����ٲ���
    CanaRegs.CAN_IF1CMD.bit.Control = 1;   // ���¿�����
    CanaRegs.CAN_IF1CMD.bit.DATA_A = 1;    // ��������A��
    CanaRegs.CAN_IF1CMD.bit.DATA_B = 1;    // ��������B��

    // ������ϢID������
    CanaRegs.CAN_IF1ARB.bit.ID = id;    // ������ϢID
    CanaRegs.CAN_IF1ARB.bit.Xtd = 0;    // ��׼ID
    CanaRegs.CAN_IF1ARB.bit.Dir = 0;    // ���ͷ���
    CanaRegs.CAN_IF1ARB.bit.MsgVal = 1; // ��Ϣ��Ч

    // �������ݳ���
    CanaRegs.CAN_IF1MCTL.bit.DLC = length; // ���ݳ���
    CanaRegs.CAN_IF1MCTL.bit.TxIE = 1;    // ʹ�ܷ����ж�

    // ��������
    if(length > 0) CanaRegs.CAN_IF1DATA.all = *((uint32_t*)&data[0]);
    if(length > 4) CanaRegs.CAN_IF1DATB.all = *((uint32_t*)&data[4]);

    CanaRegs.CAN_IF1MCTL.bit.TxRqst = 1;
    EDIS;
}

// ���͵�������
void CAN_SendCurrentData(float current)
{
    uint16_t data[4];
    *(float*)data = current;
    CAN_SendData(16, 0x101, data, 4); // ʹ��ID 0x101���͵�������
}

// ����ϵͳ״̬
void CAN_SendSystemState(uint16_t state)
{
    uint16_t data[2];
    data[0] = state & 0xFF;
    data[1] = (state >> 8) & 0xFF;
    CAN_SendData(17, 0x102, data, 2); // ʹ��ID 0x102����ϵͳ״̬
}


// ����CAN����
interrupt void CAN_ISR(void)
{
    // �����յ�����Ϣ
        if (CanaRegs.CAN_IF2MCTL.bit.NewDat == 1) {
            uint32_t id = CanaRegs.CAN_IF2ARB.bit.ID;
            uint16_t length = CanaRegs.CAN_IF2MCTL.bit.DLC;
            uint32_t dataLow = CanaRegs.CAN_IF2DATA.all;
            uint32_t dataHigh = CanaRegs.CAN_IF2DATB.all;

            // ����ID�����ͬ��Ϣ
            switch(id) {
                case 0x123: // ��ѹ����
                    receivedV_CMD = *(float*)&dataLow;
                    break;
                // ������Ӹ�����Ϣ����
            }

            // ��������ݱ�־
            CanaRegs.CAN_IF2MCTL.bit.NewDat = 0;
        }
            if(CanaRegs.CAN_ES.bit.BOff) {
                    // ���߹رջָ�����
                    CanaRegs.CAN_CTL.bit.Init = 1;
                    while(!CanaRegs.CAN_CTL.bit.Init);
                    CanaRegs.CAN_CTL.bit.Init = 0;
                }

        // ����жϱ�־
        PieCtrlRegs.PIEACK.bit.ACK9 = 1;
    }







void DisplayChartHEX(float *signal, Uint16 signal_num)
{
    char i, temp2;

    for(i=0; i<signal_num; i++)
    {
        temp2 = *((int32 *)&signal[i]);
        Sci_SendByte(temp2);
        temp2 = *((int32 *)&signal[i]) >> 8;
        Sci_SendByte(temp2);
        temp2 = *((int32 *)&signal[i]) >> 16;
        Sci_SendByte(temp2);
        temp2 = *((int32 *)&signal[i]) >> 24;
        Sci_SendByte(temp2);
    }
//    Sci_SendByte(0x00);
//    Sci_SendByte(0x00);
//    Sci_SendByte(0x80);
//    Sci_SendByte(0x7f);
}
void PWM_Enable(void)
{

    EALLOW;
    EPwm7Regs.TZCLR.bit.OST = 1;
    EPwm8Regs.TZCLR.bit.OST = 1;
    EDIS;
}
void PWM_Disable(void)
{

    EALLOW;
    EPwm7Regs.TZFRC.bit.OST = 1;
    EPwm8Regs.TZFRC.bit.OST = 1;
    EDIS;
}
void SCR_PWM_Enable(void)
{
    EALLOW;
    EPwm6Regs.TZCLR.bit.OST = 1;
    EDIS;
}
void SCR_PWM_Disable(void)
{
    EALLOW;
    EPwm6Regs.TZFRC.bit.OST = 1;
    EDIS;
}
void ScanKey(void)//run in while loop of main function
{

    if(KeyStart_PinState == 1 || KeyReset_PinState == 1 || KeyStop_PinState == 1)
    {
        DELAY_US(8000);  //delay 8ms
        if(KeyStart_PinState == 1)
        {
            Peripheral_Switch_State.bit.Key_Start = 1;
        }
        if(KeyReset_PinState == 1)
        {
            Peripheral_Switch_State.bit.Key_Reset = 1;
        }
        if(KeyStop_PinState == 1)
        {
            Peripheral_Switch_State.bit.Key_Stop = 1;
        }
    }
    else
    {
        Peripheral_Switch_State.byte.Byte2 = 0;
    }
}
void Epwm78Test(void)
{
    uint16_t temp;
    static uint16_t dir = 1;
    temp = EPwm8Regs.TBPHS.bit.TBPHS;
    if(dir)
    {
        temp += 10;
    }
    else
    {
        temp -= 10;
    }
    if((temp > 1250) || (temp <= 0))
    {
       dir = !dir;
    }
    EPwm8Regs.TBPHS.bit.TBPHS = temp;
}
void KeyNRelayTest(void)
{
    if (KeyStart_PinState)
    {
        AC_Contactor_On();
        Light_Green_On();
    }
    else
    {
        AC_Contactor_Off();
        Light_Green_Off();
    }

    if (KeyStop_PinState)
    {
        Light_Red_On();
    }
    else
    {
        Light_Red_Off();
    }

    if (KeyReset_PinState)
    {
        Light_Yellow_On();
    }
    else
    {
        Light_Yellow_Off();
    }


    if (ACContactor_ReturnState)
    {
        Fan_On();
    }
    else
    {
        Fan_Off();
    }


}

//Uint32 TEMPSEL = 0;        //TEMPSEL
//void TEMP_SEL(void)
//{
////    if(TEMPSEL == 0)
////    {
////        GpioDataRegs.GPCDAT.bit.GPIO68 = 1;
////        GpioDataRegs.GPCDAT.bit.GPIO69 = 1;
////
////    }
////    else if(TEMPSEL == 1)
////    {
////        GpioDataRegs.GPCSET.bit.GPIO68 = 1;
////        GpioDataRegs.GPCCLEAR.bit.GPIO69 = 1;
////
////    }
////    else if(TEMPSEL == 2)
////    {
////        GpioDataRegs.GPCCLEAR.bit.GPIO68 = 1;
////        GpioDataRegs.GPCSET.bit.GPIO69 = 1;
////    }
////    else if(TEMPSEL == 3)
////    {
////        GpioDataRegs.GPCSET.bit.GPIO68 = 1;
////        GpioDataRegs.GPCSET.bit.GPIO69 = 1;
////    }
//    TempIGBT_Sel0 = TEMPSEL & 0x1;
//    TempIGBT_Sel1 = TEMPSEL >> 1;
//    TEMPSEL++;
//    if(TEMPSEL >= 4)
//    {
//        TEMPSEL = 0;
//    }
//}

interrupt void CpuTimer0_ISR(void)
{


    //GpioDataRegs.GPCTOGGLE.bit.GPIO88 = 1;
    CpuTimer0.InterruptCount++;
    if(CpuTimer0.InterruptCount >= 100)
    {
        CpuTimer0.InterruptCount = 0;
        //DisplayChartHEX(AdcResults, 12);
        //DisplayChartHEX(AdcIgrid, 3);
        //DisplayChartHEX(&AdcItrack[0], 1);
        //DisplayChartHEX(AdcVgrid, 3);
        //DisplayChartHEX(&AdcVdc, 1);

    }



    CpuTimer0Regs.TCR.bit.TIF = 1;
    CpuTimer0Regs.TCR.bit.TRB = 1;
    PieCtrlRegs.PIEACK.bit.ACK1 = 1;

}
/****************************************************************
 * 2ms state change
 *************************************************************/
interrupt void CpuTimer1_2ms_ISR(void)
{
    Toggle_Led90();
    if ((Sys_Current_State == State_Check) || (Sys_Current_State == State_PreCharge) || (Sys_Current_State == State_Running))
    {
        if (Peripheral_Switch_State.bit.Key_Stop == 1)
        {
            StateUpdate_ParaInit_Once = 0;
            Sys_Current_State = State_Stop;
        }
    }
    Check_HardwarePro();
    StateSwitch();


    if (Sys_Current_State == State_PreCharge)   //vdc soft start
    {
        if (All_State_Flag.bit.Vdc_Slowup == 1)
        {
            Slowup_Vdc_Ref();
//            EPwm6Regs.CMPB.bit.CMPB = Vdc_Ref.Ref_CMD * 1.125f;//D=0.45 1.125 D=0.4 1.0
//            //D=0.5 1.25 1.5 D=0.6 1.5//500V -> duty 0.75 -> 938, 938 / 500 = 1.875
//            EPwm6Regs.CMPA.bit.CMPA = Vdc_Ref.Ref_CMD * 1.125f;
            //ref:500V,TBPRD1250,D=CMPA/1250,cmpa=x*500

            EPwm6Regs.CMPB.bit.CMPB = Vdc_Ref.Ref_CMD * 1.102f;//D=0.45 1.102
            EPwm6Regs.CMPA.bit.CMPA = Vdc_Ref.Ref_CMD * 1.102f;
            //ref:510V,TBPRD1250,D=CMPA/1250,cmpa=x*510
        }
    }

    if (Sys_Current_State == State_Running)   //Itrack soft start
    {
        if (All_State_Flag.bit.Itrack_Slowup == 1)
        {
            Slowup_Itrack_Ref();
            EPwm8Regs.TBPHS.bit.TBPHS = 1180 - Itrack_Ref.Ref_CMD * 23.6f;
//            EPwm8Regs.TBPHS.bit.TBPHS = 1180 - Itrack_Ref.Ref_CMD * 39.3f;

        }
    }
//    if ((Sys_Current_State == State_Running)||(Sys_Current_State == State_PreCharge))
//    {
//        GpioDataRegs.GPCSET.bit.GPIO86 = 1;
//    }
//    else
//    {
//        GpioDataRegs.GPCCLEAR.bit.GPIO86 = 1;
//    }
//    if (Sys_Current_State == State_Running)
//    {
//        if(GpioDataRegs.GPADAT.bit.GPIO22 == 0)
//        {
//             Vdc_Ref.Ref = 510.0f;
//             Vdc_Ref.Ref_CMD = 510.0f;
//             Vdc_Ctrl_PI.Upper_Limit = 0.8f;
//        }
////        if(GpioDataRegs.GPADAT.bit.GPIO22 == 1)
////        {
////             Vdc_Ref.Ref = 250.0f;
////             Vdc_Ref.Ref_CMD = 250.0f;
////             Vdc_Ctrl_PI.Upper_Limit = 0.45f;
////        }
//    }
//    if (Sys_Current_State == State_Running)
//    {
//        if(Vdc_Ref.Ref_CMD == 510.0f)
//        {
//            if(GpioDataRegs.GPADAT.bit.GPIO22 == 1)
//            {
//                check_Vdctime++;
//                if(check_Vdctime>=17500)
//                {
//                    Vdc_Ref.Ref = 250.0f;
//                    Vdc_Ref.Ref_CMD = 250.0f;
//                    Vdc_Ctrl_PI.Upper_Limit = 0.45f;
//                    check_Vdctime=0;
//                }
//
//            }
//
//        }
//    }
//    if ( (Sys_Current_State == State_Running) || (Sys_Current_State == State_PreCharge) )
//    {
//        if( (Vdc_Ref.Ref_CMD >=240) && (Vdc_Ref.Ref_CMD <=250) )
//        {
//            GpioDataRegs.GPCCLEAR.bit.GPIO86 = 1;
//        }
//    }
//    else
//    {
//        GpioDataRegs.GPCSET.bit.GPIO86 = 1;
//    }
//
//    if (Sys_Current_State == State_Running)
//    {
//        if(GpioDataRegs.GPADAT.bit.GPIO22 == 1)
//        {
////            if( Sample_CalcResult.Track_Ave <= 1.0f)
////            {
//            Vdc_Ref.Ref = 510.0f;
//            Vdc_Ref.Ref_CMD = 510.0f;
//            Vdc_Ctrl_PI.Upper_Limit = 0.85f;
////            }
////            else
////            {
////                Fault_Flag.bit.Fault_Generate = 1;
////            }
//        }
//        if(GpioDataRegs.GPADAT.bit.GPIO22 == 0)
//        {
//            Vdc_Ref.Ref = 250.0f;
//            Vdc_Ref.Ref_CMD = 250.0f;
//            Vdc_Ctrl_PI.Upper_Limit = 0.55f;
//        }
//    }

    if (Sys_Current_State == State_Running)
    {
        if ((Sample_CalcResult.TempIGBT1 >= 85.0f) ||
            (Sample_CalcResult.TempIGBT2 >= 85.0f) ||
            (Sample_CalcResult.TempIGBT3 >= 85.0f) ||
            (Sample_CalcResult.TempIGBT4 >= 85.0f))
//            (Sample_CalcResult.TempIGBT5 >= 85.0f) ||
//            (Sample_CalcResult.TempIGBT6 >= 85.0f) ||
//            (Sample_CalcResult.TempIGBT7 >= 85.0f) ||
//            (Sample_CalcResult.TempIGBT8 >= 85.0f)

        {
            Fault_Flag.bit.temp_warming = 1;
        }
        if (Peripheral_Switch_State.bit.Key_Reset == 1)
        {
            Clear_AllFault();
        }
    }

}




/************************************************`****************
 * 20ms RMS AVE CALCULATION
 * SOFT START
 *************************************************************/
interrupt void CpuTimer2_20ms_ISR(void)
{


    Task_GridPeriod();
    if (Sys_Current_State == State_Running)   //vdc crtl
    {
        Run_Vdc_Ctrl();
        EPwm6Regs.CMPB.bit.CMPB = Vdc_Ctrl_PI.PI_Out * 1250.0f;
        EPwm6Regs.CMPA.bit.CMPA = Vdc_Ctrl_PI.PI_Out * 1250.0f;
    }
}
/****************************************************************
 * AD INTERRUPT
 * get real value
 * clear interrupt flag
 * close loop control
 *************************************************************/
interrupt void Adcd_ISR(void)
{
//    AdcResults[0] = (float)AdcaResultRegs.ADCRESULT0;//A0 VgridA
//    AdcResults[1] = (float)AdcbResultRegs.ADCRESULT0;//B0 VgridC
//    AdcResults[2] = (float)AdccResultRegs.ADCRESULT0;//C2 IgridA
//    AdcResults[3] = (float)AdcdResultRegs.ADCRESULT0;//D1 IHbridge
//    AdcResults[4] = (float)AdcbResultRegs.ADCRESULT1;//B2 VgridB
//    AdcResults[5] = (float)AdccResultRegs.ADCRESULT1;//C3 IgridB
//    AdcResults[6] = (float)AdcdResultRegs.ADCRESULT1;//D2 Itrack
//    AdcResults[7] = (float)AdcbResultRegs.ADCRESULT2;//B3 Vdc
//    AdcResults[8] = (float)AdccResultRegs.ADCRESULT2;//C4 IgridC
//    AdcResults[9] = (float)AdcdResultRegs.ADCRESULT2;//D3 Itrack
//    AdcResults[10] = (float)AdcdResultRegs.ADCRESULT3;//D4 TempIGBT
//    AdcResults[11] = (float)AdcaResultRegs.ADCRESULT15;//A15 Vref

//    AdcResults[0] = (float)AdcaResultRegs.ADCRESULT0;//A0 VgridA
//    AdcResults[1] = (float)AdcbResultRegs.ADCRESULT1;//B2 VgridB
//    AdcResults[2] = (float)AdcbResultRegs.ADCRESULT0;//B0 VgridC
//    AdcResults[3] = (float)AdccResultRegs.ADCRESULT0;//C2 IgridA
//    AdcResults[4] = (float)AdccResultRegs.ADCRESULT1;//C3 IgridB
//    AdcResults[5] = (float)AdccResultRegs.ADCRESULT2;//C4 IgridC
//    AdcResults[6] = (float)AdcbResultRegs.ADCRESULT2;//B3 Vdc
//    AdcResults[7] = (float)AdcdResultRegs.ADCRESULT1;//D2 Itrack
//    AdcResults[8] = (float)AdcdResultRegs.ADCRESULT2;//D3 Itrack
//    AdcResults[9] = (float)AdcdResultRegs.ADCRESULT0;//D1 IHbridge
//    AdcResults[10] = (float)AdcdResultRegs.ADCRESULT3;//D4 TempIGBT
//    AdcResults[11] = (float)AdcaResultRegs.ADCRESULT15;//A15 Vref

//    if(TEMPSEL == 0)  TEMPResults[0] = (float)AdcdResultRegs.ADCRESULT3;//D4 TempIGBT
//    else if(TEMPSEL == 1) TEMPResults[1] = (float)AdcdResultRegs.ADCRESULT3;//D4 TempIGBT
//    else if(TEMPSEL == 2) TEMPResults[2] = (float)AdcdResultRegs.ADCRESULT3;//D4 TempIGBT
//    else if(TEMPSEL == 3) TEMPResults[3] = (float)AdcdResultRegs.ADCRESULT3;//D4 TempIGBT

//    AdcIgrid[0] = (float)((AdccResultRegs.ADCRESULT0 - 1861.81f) * 1.61133E-03f);
//    AdcIgrid[1] = (float)((AdccResultRegs.ADCRESULT1 - 1861.81f) * 1.61133E-03f);
//    AdcIgrid[2] = (float)((AdccResultRegs.ADCRESULT2 - 1861.81f) * 1.61133E-03f);
//    AdcItrack[0] = (float)((AdcdResultRegs.ADCRESULT1 - 8.05E-4f) * 1.0f);
    //AdcVdc = (float)((ADResultReg_Vdc - 2.0f) * 0.152472f);//ok
//    AdcVgrid[0] = (float)((ADResultReg_Vgrid_Phase_A - 1851.89f) * 1.0f);
//    AdcVgrid[1] = (float)((ADResultReg_Vgrid_Phase_B - 1851.81f) * 1.0f);
//    AdcVgrid[2] = (float)((ADResultReg_Vgrid_Phase_C - 1851.81f) * 1.0f);

    Get_Sample_RealValue();
    Calc_Sample_AccValue();
    if ((Sys_Current_State != State_Stop) && (Sys_Current_State != State_Fault))
    {
        if (All_State_Flag.bit.ADOffset_CheckOver == 1)
        {
            SoftWare_FastProtect();
        }
    }
    //Vdc_PI
//    if ((Sys_Current_State == State_PreCharge) || (Sys_Current_State == State_Running))   //vdc crtl
//    {
//            Run_Vdc_Ctrl();
//            EPwm6Regs.CMPB.bit.CMPB = Vdc_Ctrl_PI.PI_Out * 1250.0f;
//            EPwm6Regs.CMPA.bit.CMPA = Vdc_Ctrl_PI.PI_Out * 1250.0f;
//    }



    //Vdc_PI
//    if (Sys_Current_State == State_Running)   //vdc crtl
//    {
//        Run_Vdc_Ctrl();
//        EPwm6Regs.CMPB.bit.CMPB = Vdc_Ctrl_PI.PI_Out * 1250.0f;
//        EPwm6Regs.CMPA.bit.CMPA = Vdc_Ctrl_PI.PI_Out * 1250.0f;
//    }


    AdcdRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag
    if(1 == AdcdRegs.ADCINTOVF.bit.ADCINT1)// Check if overflow has occurred
    {
        AdcdRegs.ADCINTOVFCLR.bit.ADCINT1 = 1; //clear INT1 overflow flag
        AdcdRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear INT1 flag
    }
    PieCtrlRegs.PIEACK.bit.ACK1 = 1;

}
interrupt void AD_ISR(void)
{




//    if ((Sys_Current_State == State_PreCharge) && (Sys_Current_State == State_Running))
//    {
//        Run_Irack_Ctrl();
//    }

}
interrupt void SciaModbusRxFifo_ISR(void)
{
    if(SciaRegs.SCIRXST.bit.RXERROR == 1)
    {
        SciaRegs.SCICTL1.bit.SWRESET = 0;
        SciaRegs.SCIFFRX.bit.RXFIFORESET = 0;
        SciaRegs.SCIFFRX.bit.RXFIFORESET = 1;
        SciaRegs.SCICTL1.bit.SWRESET = 1;
    }
    else
    {
        Uint16 i;
        for(i = 0; i < 8; i++)
        {
            Rx_ADU_Buffer[i] = SciaRegs.SCIRXBUF.bit.SAR;
        }

        modbus485_flag = 1;
    }


    SciaRegs.SCIFFRX.bit.RXFFOVRCLR = 1;  // Clear Overflow flag
    SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;  // Clear Interrupt flag
    PieCtrlRegs.PIEACK.bit.ACK9 = 1;
}

void LightBeepCMD(void)
{
    switch (Sys_Current_State)
    {
        case State_Idle:
        {
            Light_Yellow_Off();
            Light_Green_On();
            Light_Red_Off();
//            Beep_Off();
            break;
        }
        case State_Fault:
        {
            Light_Yellow_On();
            Light_Green_Off();
            Light_Red_Off();
//            Beep_On();
            break;
        }
        default:
        {
            Light_Yellow_Off();
            Light_Green_Off();
            Light_Red_On();
            if (Sys_Current_State == State_Check)
            {
//                Beep_On();
            }
            else
            {
//                Beep_Off();
            }
            if (Sys_Current_State == State_Running)
            {
                if(Fault_Flag.bit.Relay_Fan_Fault == 1 || Fault_Flag.bit.temp_warming == 1)
                {
                    Light_Yellow_On();
                    Light_Green_Off();
                    Light_Red_Off();
                }
            }
            break;
        }

    }
}
能不能帮忙看一下can通信有没有问题,为什么发不出数据