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

📄 des_mc10xs3412.c

📁 BCM 控制demo源代码
💻 C
字号:
/*******************************************************************************/
/**
Copyright (c) 2007 Freescale Semiconductor
\file       des_MC10XS3412.c
\brief      Functions for high side switch (MC10XS3412) 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"

/** MC10XS definitions */
#include "des_MC10XS3412.h"

    
/** Wadtchdog bit*/ 
static UINT8 u8XS10_WDIN = 0; 

/* Back-up variables */ 
UINT8 u8XS10_CONFREG1[4] = {XS10_CONFR1_0_INIT, XS10_CONFR1_1_INIT,
                            XS10_CONFR1_2_INIT, XS10_CONFR1_3_INIT};

UINT8 u8XS10_OCREG_XEN[4] = {XS10_OCR_0_XENINIT, XS10_OCR_1_XENINIT,
                             XS10_OCR_2_XENINIT, XS10_OCR_3_XENINIT};

UINT8 u8XS10_OCREG[4] = {XS10_OCR_0_INIT, XS10_OCR_1_INIT,
                         XS10_OCR_2_INIT, XS10_OCR_3_INIT};

UINT8 u8XS10_GCREG = XS10_GCR_INIT;

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

/*******************************************************************************/
/**
* \brief    Clear MC10XS3412 watchdog
* \author   B05114
* \param    void
* \return   void
*/
void des_MC10XS3412_ClrWDT(void)
{ 
    des_MC10XS3412_SendCommand(XS_STATR, 0);     
}

/*******************************************************************************/
/**
* \brief    Set MC10XS3412 operation mode
* \author   B05114
* \param    u8XS_Mode: Operation mode: XS_SLEEP, XS_NORMAL  
* \return   void
*/
void des_MC10XS3412_SetMode(UINT8 u8XS_Mode)
{
    RST_MC10XS3412 = 0;     /* All inputs to 0 set the MC10XS3412 */
    IN0_MC10XS3412 = 0;     /* in low-current sleep mode */
    IN1_MC10XS3412 = 0;
    IN2_MC10XS3412 = 0;
    IN3_MC10XS3412 = 0;  
    
        if(u8XS_Mode)               /* If selected mode is XS_NORMAL */
            RST_MC10XS3412 = 1;     /* generate wake-up event */  
}

/*******************************************************************************/
/**
* \brief    MC10XS3412 initial configuration with values from des_MC10XS3412.h
* \author   B05114
* \param    void
* \return   void
*/
void des_MC10XS3412_Config(void)
{
    des_MC10XS3412_SendCommand(XS_PWMR|XS_HS0, XS10_PWMR_0_INIT);
    des_MC10XS3412_SendCommand(XS_PWMR|XS_HS1, XS10_PWMR_1_INIT);
    des_MC10XS3412_SendCommand(XS_PWMR|XS_HS2, XS10_PWMR_2_INIT);
    des_MC10XS3412_SendCommand(XS_PWMR|XS_HS3, XS10_PWMR_3_INIT);    
    
    des_MC10XS3412_SendCommand(XS_CONFR0|XS_HS0, XS10_CONFR0_0_INIT);
    des_MC10XS3412_SendCommand(XS_CONFR0|XS_HS1, XS10_CONFR0_1_INIT);
    des_MC10XS3412_SendCommand(XS_CONFR0|XS_HS2, XS10_CONFR0_2_INIT);
    des_MC10XS3412_SendCommand(XS_CONFR0|XS_HS3, XS10_CONFR0_3_INIT);
    
    des_MC10XS3412_SendCommand(XS_CONFR1|XS_HS0, XS10_CONFR1_0_INIT);
    des_MC10XS3412_SendCommand(XS_CONFR1|XS_HS1, XS10_CONFR1_1_INIT);
    des_MC10XS3412_SendCommand(XS_CONFR1|XS_HS2, XS10_CONFR1_2_INIT);
    des_MC10XS3412_SendCommand(XS_CONFR1|XS_HS3, XS10_CONFR1_3_INIT);
    
    des_MC10XS3412_SendCommand(XS_OCR|XS_HS0|XS10_OCR_0_XENINIT, XS10_OCR_0_INIT);
    des_MC10XS3412_SendCommand(XS_OCR|XS_HS1|XS10_OCR_1_XENINIT, XS10_OCR_1_INIT);
    des_MC10XS3412_SendCommand(XS_OCR|XS_HS2|XS10_OCR_2_XENINIT, XS10_OCR_2_INIT);
    des_MC10XS3412_SendCommand(XS_OCR|XS_HS3|XS10_OCR_3_XENINIT, XS10_OCR_3_INIT);
    
    des_MC10XS3412_SendCommand(XS_GCR, XS10_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_MC10XS3412_HS_Configuration(UINT8 u8HSout, UINT8 u8Dir_Control,
                                     UINT8 u8SlewRate, UINT8 u8SwitchDelay)
{                           
    des_MC10XS3412_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_MC10XS3412_HS_Control(UINT8 u8HSout, UINT8 u8HS_State, UINT8 u8HS_PWM)
{
    des_MC10XS3412_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_MC10XS3412_Select_PWM_Module(UINT8 u8PWMSelect)
{
    u8XS10_GCREG &= 0x3F;
    u8XS10_GCREG |= u8PWMSelect;     /* Update backup variable */

    des_MC10XS3412_SendCommand(XS_GCR, u8XS10_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_MC10XS3412_OpenLoad_Detect(UINT8 u8HSout, UINT8 u8OLselect)
{
    u8XS10_CONFREG1[u8HSout] &= 0xF1;
    u8XS10_CONFREG1[u8HSout] |= u8OLselect;    

   /* Update register */
    des_MC10XS3412_SendCommand(XS_CONFR1 | u8HSout, u8XS10_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_MC10XS3412_Select_CurrentSense(UINT8 u8HSout, UINT8 u8SenseRatio)
{
    u8XS10_CONFREG1[u8HSout] &= 0xFE;
        
        if(u8SenseRatio)    u8XS10_CONFREG1[u8HSout] |= XS_CSNS_HIGH;              

    /* Update register */
    des_MC10XS3412_SendCommand(XS_CONFR1 | u8HSout, u8XS10_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_MC10XS3412_Select_CurrentProfile(UINT8 u8HSout, UINT8 u8Xenon,
                                        UINT8 u8CoolCurve, UINT8 u8InrushCurve)
{
    u8XS10_OCREG_XEN[u8HSout] = u8Xenon;
    
    u8XS10_OCREG[u8HSout] &= 0x07;
    u8XS10_OCREG[u8HSout] |= (u8CoolCurve | u8InrushCurve);
    
    /* Update register */
    des_MC10XS3412_SendCommand(XS_OCR | u8HSout | u8XS10_OCREG_XEN[u8HSout],
                               u8XS10_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_MC10XS3412_Select_SteadyState(UINT8 u8HSout, UINT8 u8SteadyState)
{    
    u8XS10_OCREG[u8HSout] &= 0xF9;
    u8XS10_OCREG[u8HSout] |= u8SteadyState;
    
    /* Update register */
    des_MC10XS3412_SendCommand(XS_OCR | u8HSout | u8XS10_OCREG_XEN[u8HSout],
                               u8XS10_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_MC10XS3412_Select_OverCurrent(UINT8 u8HSout, UINT8 u8OCmode)
{    
    u8XS10_OCREG[u8HSout] &= 0xFE;
    u8XS10_OCREG[u8HSout] |= u8OCmode;
    
    /* Update register */
    des_MC10XS3412_SendCommand(XS_OCR | u8HSout | u8XS10_OCREG_XEN[u8HSout],
                               u8XS10_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_MC10XS3412_Get_Status(UINT8 u8HSout)
{
    UINT8 u8XS10_Frame[2];
       
    des_MC10XS3412_SendCommand(XS_STATR, u8HSout);  /* Set SOA bits */       
                                          
    u8XS10_Frame[0] = XS_STATR | u8XS10_WDIN;
    u8XS10_Frame[1] = 0; 
         
    CS_MC10XS3412 = 0;          /* CS low */    
    lle_SPI_16(u8XS10_Frame);  /* Send data to MC10XS3412 */    
    CS_MC10XS3412 = 1;          /* CS high */ 
    
    u8XS10_WDIN ^= 0x80;    /* Toggle watchdog bit */  
    
    return u8XS10_Frame[1]; 
}

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

⌨️ 快捷键说明

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