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

📄 des_mc35xs3400.c

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

/** MC35XS definitions */
#include "des_MC35XS3400.h"

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

/* Back-up variables */ 
UINT8 u8XS35_CONFREG1[4] = {XS35_CONFR1_0_INIT, XS35_CONFR1_1_INIT,
                            XS35_CONFR1_2_INIT, XS35_CONFR1_3_INIT};

UINT8 u8XS35_OCREG[4] = {XS35_OCR_0_INIT, XS35_OCR_1_INIT,
                         XS35_OCR_2_INIT, XS35_OCR_3_INIT};

UINT8 u8XS35_GCREG = XS35_GCR_INIT;

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

/*******************************************************************************/
/**
* \brief    Clear MC35XS3400 watchdog
* \author   B05114
* \param    void
* \return   void
*/
void des_MC35XS3400_ClrWDT(void)
{ 
    des_MC35XS3400_SendCommand(XS_STATR, 0);     
}

/*******************************************************************************/
/**
* \brief    Set MC35XS3400 operation mode
* \author   B05114
* \param    u8XS_Mode: Operation mode: XS_SLEEP, XS_NORMAL             
* \return   void
*/
void des_MC35XS3400_SetMode(UINT8 u8XS_Mode)
{
    RST_MC35XS3400 = 0;     /* All inputs to 0 set the MC35XS3400 */
    IN0_MC35XS3400 = 0;     /* in low-current sleep mode */
    IN1_MC35XS3400 = 0;
    IN2_MC35XS3400 = 0;
    IN3_MC35XS3400 = 0;  
    
        if(u8XS_Mode)               /* If selected mode is XS_NORMAL */
            RST_MC35XS3400 = 1;     /* generate wake-up event */  
}

/*******************************************************************************/
/**
* \brief    MC35XS3400 initial configuration with values from des_MC35XS3400.h
* \author   B05114
* \param    void
* \return   void
*/
void des_MC35XS3400_Config(void)
{
    des_MC35XS3400_SendCommand(XS_PWMR|XS_HS0, XS35_PWMR_0_INIT);
    des_MC35XS3400_SendCommand(XS_PWMR|XS_HS1, XS35_PWMR_1_INIT);
    des_MC35XS3400_SendCommand(XS_PWMR|XS_HS2, XS35_PWMR_2_INIT);
    des_MC35XS3400_SendCommand(XS_PWMR|XS_HS3, XS35_PWMR_3_INIT);    
    
    des_MC35XS3400_SendCommand(XS_CONFR0|XS_HS0, XS35_CONFR0_0_INIT);
    des_MC35XS3400_SendCommand(XS_CONFR0|XS_HS1, XS35_CONFR0_1_INIT);
    des_MC35XS3400_SendCommand(XS_CONFR0|XS_HS2, XS35_CONFR0_2_INIT);
    des_MC35XS3400_SendCommand(XS_CONFR0|XS_HS3, XS35_CONFR0_3_INIT);
    
    des_MC35XS3400_SendCommand(XS_CONFR1|XS_HS0, XS35_CONFR1_0_INIT);
    des_MC35XS3400_SendCommand(XS_CONFR1|XS_HS1, XS35_CONFR1_1_INIT);
    des_MC35XS3400_SendCommand(XS_CONFR1|XS_HS2, XS35_CONFR1_2_INIT);
    des_MC35XS3400_SendCommand(XS_CONFR1|XS_HS3, XS35_CONFR1_3_INIT);
    
    des_MC35XS3400_SendCommand(XS_OCR|XS_HS0, XS35_OCR_0_INIT);
    des_MC35XS3400_SendCommand(XS_OCR|XS_HS1, XS35_OCR_1_INIT);
    des_MC35XS3400_SendCommand(XS_OCR|XS_HS2, XS35_OCR_2_INIT);
    des_MC35XS3400_SendCommand(XS_OCR|XS_HS3, XS35_OCR_3_INIT);
    
    des_MC35XS3400_SendCommand(XS_GCR, XS35_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_MC35XS3400_HS_Configuration(UINT8 u8HSout, UINT8 u8Dir_Control,
                                     UINT8 u8SlewRate, UINT8 u8SwitchDelay)
{                           
    des_MC35XS3400_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_MC35XS3400_HS_Control(UINT8 u8HSout, UINT8 u8HS_State, UINT8 u8HS_PWM)
{
    des_MC35XS3400_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_MC35XS3400_Select_PWM_Module(UINT8 u8PWMSelect)
{
    u8XS35_GCREG &= 0x3F;
    u8XS35_GCREG |= u8PWMSelect;     /* Update backup variable */

    des_MC35XS3400_SendCommand(XS_GCR, u8XS35_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_MC35XS3400_OpenLoad_Detect(UINT8 u8HSout, UINT8 u8OLselect)
{
    u8XS35_CONFREG1[u8HSout] &= 0xF1;
    u8XS35_CONFREG1[u8HSout] |= u8OLselect;    

   /* Update register */
    des_MC35XS3400_SendCommand(XS_CONFR1 | u8HSout, u8XS35_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_MC35XS3400_Select_CurrentSense(UINT8 u8HSout, UINT8 u8SenseRatio)
{
    u8XS35_CONFREG1[u8HSout] &= 0xFE;
        
        if(u8SenseRatio)    u8XS35_CONFREG1[u8HSout] |= XS_CSNS_HIGH;              

    /* Update register */
    des_MC35XS3400_SendCommand(XS_CONFR1 | u8HSout, u8XS35_CONFREG1[u8HSout]);
}


/*******************************************************************************/
/**
* \brief    Select current profile
* \author   B05114
* \param    u8HSout: Selected HS output channel, XS_HS0 to XS_HS3               \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_MC35XS3400_Select_CurrentProfile(UINT8 u8HSout,
                                          UINT8 u8CoolCurve, UINT8 u8InrushCurve)
{   
    u8XS35_OCREG[u8HSout] &= 0x07;
    u8XS35_OCREG[u8HSout] |= (u8CoolCurve | u8InrushCurve);
    
    /* Update register */
    des_MC35XS3400_SendCommand(XS_OCR | u8HSout, u8XS35_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_MC35XS3400_Select_SteadyState(UINT8 u8HSout, UINT8 u8SteadyState)
{    
    u8XS35_OCREG[u8HSout] &= 0xF9;
    u8XS35_OCREG[u8HSout] |= u8SteadyState;
    
    /* Update register */
    des_MC35XS3400_SendCommand(XS_OCR | u8HSout, u8XS35_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_MC35XS3400_Select_OverCurrent(UINT8 u8HSout, UINT8 u8OCmode)
{    
    u8XS35_OCREG[u8HSout] &= 0xFE;
    u8XS35_OCREG[u8HSout] |= u8OCmode;
    
    /* Update register */
    des_MC35XS3400_SendCommand(XS_OCR | u8HSout, u8XS35_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_MC35XS3400_Get_Status(UINT8 u8HSout)
{
    UINT8 u8XS35_Frame[2];
       
    des_MC35XS3400_SendCommand(XS_STATR, u8HSout);  /* Set SOA bits */       
                                          
    u8XS35_Frame[0] = XS_STATR | u8XS35_WDIN;
    u8XS35_Frame[1] = 0; 
         
    CS_MC35XS3400 = 0;          /* CS low */    
    lle_SPI_16(u8XS35_Frame);  /* Send data to MC35XS3400 */    
    CS_MC35XS3400 = 1;          /* CS high */ 
    
    u8XS35_WDIN ^= 0x80;    /* Toggle watchdog bit */  
    
    return u8XS35_Frame[1]; 
}

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

⌨️ 快捷键说明

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