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

📄 des_mc15xs3400.c

📁 BCM 控制demo源代码
💻 C
字号:
/*******************************************************************************/
/**
Copyright (c) 2007 Freescale Semiconductor
\file       des_MC15XS3400.c
\brief      Functions for high side switch (MC15XS3400) handling 
\author     Freescale Semiconductor
\author     B05114
\version    0.1
\date       May/2007
*/
/*******************************************************************************/

/** Variable types and common definitions */
#include "typedefs.h"  
 
/** GPIO definitions  */
#include "lle_GPIO.h"   

/** SPI definitions */
#include "lle_SPI.h"

/** MC15XS definitions */
#include "des_MC15XS3400.h"
   
 
/** Wadtchdog bit*/ 
static UINT8 u8XS15_WDIN = 0; 

/* Back-up variables */ 
UINT8 u8XS15_CONFREG1[4] = {XS15_CONFR1_0_INIT, XS15_CONFR1_1_INIT,
                            XS15_CONFR1_2_INIT, XS15_CONFR1_3_INIT};

UINT8 u8XS15_OCREG_XEN[4] = {XS15_OCR_0_XENINIT, XS15_OCR_1_XENINIT,
                             XS15_OCR_2_XENINIT, XS15_OCR_3_XENINIT};

UINT8 u8XS15_OCREG[4] = {XS15_OCR_0_INIT, XS15_OCR_1_INIT,
                         XS15_OCR_2_INIT, XS15_OCR_3_INIT};

UINT8 u8XS15_GCREG = XS15_GCR_INIT;

/*******************************************************************************/
/**
* \brief    Write MC15XS3400 register and read Serial Output response
* \author   B05114
* \param    u8XS15_Command: Configuration command \n
            u8XS15_Data: Configuration data
* \return   void (Received data are stored in array u8XS15_Frame)
*/
void des_MC15XS3400_SendCommand(UINT8 u8XS_Command, UINT8 u8XS_Data)
{      
    UINT8 u8XS15_Frame[2];    /* Data array to be sent */     
                     
    u8XS15_Frame[0] = u8XS_Command | u8XS15_WDIN;
    u8XS15_Frame[1] = u8XS_Data; 
         
    CS_MC15XS3400 = 0;          /* CS low */   
    lle_SPI_16(u8XS15_Frame);  /* Send data to MC15XS3400 */    
    CS_MC15XS3400 = 1;          /* CS high */ 
    
    u8XS15_WDIN ^= 0x80;    /* Toggle watchdog bit */  
}

/*******************************************************************************/
/**
* \brief    Clear MC15XS3400 watchdog
* \author   B05114
* \param    void
* \return   void
*/
void des_MC15XS3400_ClrWDT(void)
{ 
    des_MC15XS3400_SendCommand(XS_STATR, 0);     
}

/*******************************************************************************/
/**
* \brief    Set MC15XS3400 operation mode
* \author   B05114
* \param    u8XS_Mode: Operation mode: XS_SLEEP, XS_NORMAL 
* \return   void
*/
void des_MC15XS3400_SetMode(UINT8 u8XS_Mode)
{
    RST_MC15XS3400 = 0;     /* All inputs to 0 set the MC15XS3400 */
    IN0_MC15XS3400 = 0;     /* in low-current sleep mode */
    IN1_MC15XS3400 = 0;
    IN2_MC15XS3400 = 0;
    IN3_MC15XS3400 = 0;  
    
        if(u8XS_Mode)               /* If selected mode is XS_NORMAL */
            RST_MC15XS3400 = 1;     /* generate wake-up event */  
}

/*******************************************************************************/
/**
* \brief    MC15XS3400 initial configuration with values from des_MC15XS3400.h
* \author   B05114
* \param    void
* \return   void
*/
void des_MC15XS3400_Config(void)
{
    des_MC15XS3400_SendCommand(XS_PWMR|XS_HS0, XS15_PWMR_0_INIT);
    des_MC15XS3400_SendCommand(XS_PWMR|XS_HS1, XS15_PWMR_1_INIT);
    des_MC15XS3400_SendCommand(XS_PWMR|XS_HS2, XS15_PWMR_2_INIT);
    des_MC15XS3400_SendCommand(XS_PWMR|XS_HS3, XS15_PWMR_3_INIT);    
    
    des_MC15XS3400_SendCommand(XS_CONFR0|XS_HS0, XS15_CONFR0_0_INIT);
    des_MC15XS3400_SendCommand(XS_CONFR0|XS_HS1, XS15_CONFR0_1_INIT);
    des_MC15XS3400_SendCommand(XS_CONFR0|XS_HS2, XS15_CONFR0_2_INIT);
    des_MC15XS3400_SendCommand(XS_CONFR0|XS_HS3, XS15_CONFR0_3_INIT);
    
    des_MC15XS3400_SendCommand(XS_CONFR1|XS_HS0, XS15_CONFR1_0_INIT);
    des_MC15XS3400_SendCommand(XS_CONFR1|XS_HS1, XS15_CONFR1_1_INIT);
    des_MC15XS3400_SendCommand(XS_CONFR1|XS_HS2, XS15_CONFR1_2_INIT);
    des_MC15XS3400_SendCommand(XS_CONFR1|XS_HS3, XS15_CONFR1_3_INIT);
    
    des_MC15XS3400_SendCommand(XS_OCR|XS_HS0|XS15_OCR_0_XENINIT, XS15_OCR_0_INIT);
    des_MC15XS3400_SendCommand(XS_OCR|XS_HS1|XS15_OCR_1_XENINIT, XS15_OCR_1_INIT);
    des_MC15XS3400_SendCommand(XS_OCR|XS_HS2|XS15_OCR_2_XENINIT, XS15_OCR_2_INIT);
    des_MC15XS3400_SendCommand(XS_OCR|XS_HS3|XS15_OCR_3_XENINIT, XS15_OCR_3_INIT);
    
    des_MC15XS3400_SendCommand(XS_GCR, XS15_GCR_INIT);
}

/*******************************************************************************/
/**
* \brief    Outputs configuration
* \author   B05114
* \param    u8HSout: Selected HS output channel, XS_HS0 to XS_HS3   \n
            u8Control: Direct IN control: XS_DIR_EN, XS_DIR_DIS     \n
            u8SlewRate: XS_SLEW_LOW, XS_SLEW_MED, XS_SLEW_HIGH      \n
            u8SwitchDelay: XS_NO_DELAY, XS_DELAY_16, ..., XS_DELAY_112 
* \return   void
*/
void des_MC15XS3400_HS_Configuration(UINT8 u8HSout, UINT8 u8Dir_Control,
                                     UINT8 u8SlewRate, UINT8 u8SwitchDelay)
{                           
    des_MC15XS3400_SendCommand(XS_CONFR0 | u8HSout,
                               u8Dir_Control | u8SlewRate | u8SwitchDelay);
}

/*******************************************************************************/
/**
* \brief    Outputs control
* \author   B05114
* \param    u8HSout: Selected HS output channel, XS_HS0 to XS_HS3    \n
            u8HS_State: XS_ON, XS_OFF,                               \n
            u8HS_PWM: PWM duty cycle, 0x00 to 0x7F. 
* \return   void
*/
void des_MC15XS3400_HS_Control(UINT8 u8HSout, UINT8 u8HS_State, UINT8 u8HS_PWM)
{
    des_MC15XS3400_SendCommand(XS_PWMR | u8HSout, u8HS_State | (0x7F & u8HS_PWM)); 
}


/*******************************************************************************/
/**
* \brief    PWM module selection
* \author   B05114
* \param    u8HSout: Selected HS output channel, XS_HS0 to XS_HS3    \n
            u8PWMSelect: XS_PWM_DISABLED, XS_PWM_IN0CLK, XS_PWM_INTCLK
* \return   void
*/
void des_MC15XS3400_Select_PWM_Module(UINT8 u8PWMSelect)
{
    u8XS15_GCREG &= 0x3F;
    u8XS15_GCREG |= u8PWMSelect;     /* Update backup variable */

    des_MC15XS3400_SendCommand(XS_GCR, u8XS15_GCREG );   /* Update register */
}

/*******************************************************************************/
/**
* \brief    Select open load detection
* \author   B05114
* \param    u8HSout: Selected HS output channel, XS_HS0 to XS_HS3    \n
            u8OLselect: XS_NO_LOAD, XS_LED, XS_BULB 
* \return   void
*/ 
void des_MC15XS3400_OpenLoad_Detect(UINT8 u8HSout, UINT8 u8OLselect)
{
    u8XS15_CONFREG1[u8HSout] &= 0xF1;
    u8XS15_CONFREG1[u8HSout] |= u8OLselect;    

   /* Update register */
    des_MC15XS3400_SendCommand(XS_CONFR1 | u8HSout, u8XS15_CONFREG1[u8HSout]);
}

/*******************************************************************************/
/**
* \brief    Select current sense ratio
* \author   B05114
* \param    u8HSout: Selected HS output channel, XS_HS0 to XS_HS3    \n
            u8SenseRatio: XS_CSNS_LOW, XS_CSNS_HIGH
* \return   void
*/
void des_MC15XS3400_Select_CurrentSense(UINT8 u8HSout, UINT8 u8SenseRatio)
{
    u8XS15_CONFREG1[u8HSout] &= 0xFE;
        
        if(u8SenseRatio)    u8XS15_CONFREG1[u8HSout] |= XS_CSNS_HIGH;              

    /* Update register */
    des_MC15XS3400_SendCommand(XS_CONFR1 | u8HSout, u8XS15_CONFREG1[u8HSout]);
}


/*******************************************************************************/
/**
* \brief    Select current profile
* \author   B05114
* \param    u8HSout: Selected HS output channel, XS_HS0 to XS_HS3               \n
            u8Xenon: XS_XENON_ENABLED, XS_XENON_DISABLED                        \n
            u8CoolCurve: XS_BULB_COOL_LOW, XS_BULB_COOL_MED XS_BULB_COOL_HIGH   \n 
            u8InrushCurve: XS_INRUSH_LOW, XS_INRUSH_MED, XS_INRUSH_HIGH
* \return   void
*/
void des_MC15XS3400_Select_CurrentProfile(UINT8 u8HSout, UINT8 u8Xenon,
                                        UINT8 u8CoolCurve, UINT8 u8InrushCurve)
{
    u8XS15_OCREG_XEN[u8HSout] = u8Xenon;
    
    u8XS15_OCREG[u8HSout] &= 0x07;
    u8XS15_OCREG[u8HSout] |= (u8CoolCurve | u8InrushCurve);
    
    /* Update register */
    des_MC15XS3400_SendCommand(XS_OCR | u8HSout | u8XS15_OCREG_XEN[u8HSout],
                               u8XS15_OCREG[u8HSout]);
}

/*******************************************************************************/
/**
* \brief    Select output steady state
* \author   B05114
* \param    u8HSout: Selected HS output channel, XS_HS0 to XS_HS3    \n
            u8SteadyState: XS_STEADY_OCL0, XS_STEADY_OCL1, XS_STEADY_OCL2
* \return   void
*/
void des_MC15XS3400_Select_SteadyState(UINT8 u8HSout, UINT8 u8SteadyState)
{    
    u8XS15_OCREG[u8HSout] &= 0xF9;
    u8XS15_OCREG[u8HSout] |= u8SteadyState;
    
    /* Update register */
    des_MC15XS3400_SendCommand(XS_OCR | u8HSout | u8XS15_OCREG_XEN[u8HSout],
                               u8XS15_OCREG[u8HSout]);
}

/*******************************************************************************/
/**
* \brief    Select overcurrent mode
* \author   B05114
* \param    u8HSout: Selected HS output channel, XS_HS0 to XS_HS3    \n
            u8OCmode: XS_OC_INRUSH_ONLY, XS_OC_INRUSH_COOLING
* \return   void
*/
void des_MC15XS3400_Select_OverCurrent(UINT8 u8HSout, UINT8 u8OCmode)
{    
    u8XS15_OCREG[u8HSout] &= 0xFE;
    u8XS15_OCREG[u8HSout] |= u8OCmode;
    
    /* Update register */
    des_MC15XS3400_SendCommand(XS_OCR | u8HSout | u8XS15_OCREG_XEN[u8HSout],
                               u8XS15_OCREG[u8HSout]);
}

/*******************************************************************************/
/**
* \brief    Read STATUS register for an output channel
* \author   B05114
* \param    u8HSout: Selected HS channel for reading, XS_HS0_RD to XS_HS3_RD
* \return   UINT8 value containing the fault register flags
*/
UINT8 des_MC15XS3400_Get_Status(UINT8 u8HSout)
{
    UINT8 u8XS15_Frame[2];
       
    des_MC15XS3400_SendCommand(XS_STATR, u8HSout);  /* Set SOA bits */       
                                          
    u8XS15_Frame[0] = XS_STATR | u8XS15_WDIN;
    u8XS15_Frame[1] = 0; 
         
    CS_MC15XS3400 = 0;          /* CS low */  
    lle_SPI_16(u8XS15_Frame);  /* Send data to MC15XS3400 */       
    CS_MC15XS3400 = 1;          /* CS high */ 
    
    u8XS15_WDIN ^= 0x80;    /* Toggle watchdog bit */  
    
    return u8XS15_Frame[1]; 
}

/*******************************************************************************/

⌨️ 快捷键说明

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