?? des_mc15xs3400.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];
}
/*******************************************************************************/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -