?? stm3210c_eval_ioe.c
字號(hào):
/**
******************************************************************************
* @file stm3210c_eval_ioe.c
* @author MCD Application Team
* @version V3.1.2
* @date 09/28/2009
* @brief This file includes the IO Expander driver for STMPE811 IO Expander
* devices.
******************************************************************************
* @copy
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
* <h2><center>© COPYRIGHT 2009 STMicroelectronics</center></h2>
*/
/* File Info : ---------------------------------------------------------------
SUPPORTED FEATURES:
- IO Read/write : Set/Reset and Read (Polling/Interrupt)
- Joystick: config and Read (Polling/Interrupt)
- Touch Screen Features: Single point mode (Polling/Interrupt)
- TempSensor Feature: accuracy not determined (Polling).
UNSUPPORTED FEATURES:
- Row ADC Feature is not supported (not implemented on STM3210C-EVAL board)
----------------------------------------------------------------------------*/
/* Includes ------------------------------------------------------------------*/
#include "stm3210c_eval_ioe.h"
/** @addtogroup Utilities
* @{
*/
/** @defgroup STM3210C_EVAL_IOE
* @brief This file includes the IO Expander driver for STMPE811 IO Expander
* devices.
* @{
*/
/** @defgroup EVAL_IOE_Private_TypesDefinitions
* @{
*/
/**
* @}
*/
/** @defgroup EVAL_IOE_Private_Defines
* @{
*/
#define TIMEOUT_MAX 0xFFF; /*<! The value of the maximal timeout for I2C waiting loops */
/**
* @}
*/
/** @defgroup EVAL_IOE_Private_Macros
* @{
*/
/**
* @}
*/
/** @defgroup EVAL_IOE_Private_Variables
* @{
*/
TS_STATE TS_State; /*<! The global structure holding the TS state */
uint32_t TimeOut = TIMEOUT_MAX; /*<! Value of Timeout when I2C communication fails */
/**
* @}
*/
/** @defgroup EVAL_IOE_Private_FunctionPrototypes
* @{
*/
static uint16_t IOE_TS_Read_X(void);
static uint16_t IOE_TS_Read_Y(void);
static uint16_t IOE_TS_Read_Z(void);
static void IOE_GPIO_Config(void);
static void IOE_I2C_Config(void);
static void IOE_EXTI_Config(void);
#ifndef USE_Delay
static void delay(__IO uint32_t nCount);
#endif /* USE_Delay*/
/**
* @}
*/
/** @defgroup EVAL_IOE_Private_Functions
* @{
*/
/**
* @brief Initializes and Configures the two IO_Expanders Functionalities
* (IOs, Touch Screen ..) and configures all STM3210C-EVAL necessary
* hardware (GPIOs, APB clocks ..).
* @param None
* @retval IOE_OK if all initializations done correctly. Other value if error.
*/
uint8_t IOE_Config(void)
{
/* Configure the needed pins */
IOE_GPIO_Config();
/* Read IO Expander 1 ID */
if(IOE_IsOperational(IOE_1_ADDR))
{
return IOE1_NOT_OPERATIONAL;
}
if(IOE_IsOperational(IOE_2_ADDR))
{
return IOE2_NOT_OPERATIONAL;
}
/* Generate IOExpander Software reset */
IOE_Reset(IOE_1_ADDR);
IOE_Reset(IOE_2_ADDR);
/* ---------------------- IO Expander 1 configuration --------------------- */
/* Enable the GPIO, Touch Screen and ADC functionalities */
IOE_FnctCmd(IOE_1_ADDR, IOE_IO_FCT | IOE_TS_FCT | IOE_ADC_FCT, ENABLE);
/* Configure the VBAT pin in output mode pin*/
IOE_IOPinConfig(IOE_1_ADDR, VBAT_DIV_PIN , Direction_OUT);
/* ENABLE the alternate function for IN1 pin */
IOE_IOAFConfig(IOE_1_ADDR, VBAT_DIV_PIN, ENABLE);
/* Apply the default state for the out pins */
IOE_WriteIOPin(VBAT_DIV_PIN, BitReset);
/* Configure the MEMS interrupt pins in Input mode */
IOE_IOPinConfig(IOE_2_ADDR, (uint32_t)(MEMS_INT1_PIN | MEMS_INT2_PIN), Direction_IN);
/* ENABLE the alternate function for the Joystick pins */
IOE_IOAFConfig(IOE_2_ADDR, (uint32_t)(MEMS_INT1_PIN | MEMS_INT2_PIN), ENABLE);
/* Configure the IOs to detect Falling and Rising Edges */
IOE_IOEdgeConfig(IOE_2_ADDR, (uint32_t)(MEMS_INT1_PIN | MEMS_INT2_PIN), (uint32_t)(EDGE_FALLING | EDGE_RISING));
/* Touch Screen controller configuration */
IOE_TS_Config();
/* ------------------------------------------------------------------------ */
/* ---------------------- IO Expander 2 configuration --------------------- */
/* Enable the GPIO, Temperature Sensor and ADC functionalities */
IOE_FnctCmd(IOE_2_ADDR, IOE_IO_FCT | IOE_TEMPSENS_FCT | IOE_ADC_FCT, ENABLE);
/* Configure the Audio Codec Reset pin in output mode pin*/
//IOE_IOPinConfig(IOE_2_ADDR, (uint32_t)(AUDIO_RESET_PIN | MII_INT_PIN), Direction_OUT);
IOE_IOPinConfig(IOE_2_ADDR, (uint32_t)(AUDIO_RESET_PIN ), Direction_OUT);
/* ENABLE the alternate function for IN1 pin */
//IOE_IOAFConfig(IOE_2_ADDR, (uint32_t)(AUDIO_RESET_PIN | MII_INT_PIN), ENABLE);
IOE_IOAFConfig(IOE_2_ADDR, (uint32_t)(AUDIO_RESET_PIN), ENABLE);
/* Apply the default state for the out pins */
IOE_WriteIOPin(AUDIO_RESET_PIN, BitReset);
//IOE_WriteIOPin(MII_INT_PIN, BitReset);
IOE_IOPinConfig(IOE_2_ADDR, (uint32_t)(MII_INT_PIN ), Direction_IN);
IOE_IOAFConfig(IOE_2_ADDR, (uint32_t)(MII_INT_PIN), ENABLE);
/* Configure the Joystick pins in Input mode */
IOE_IOPinConfig(IOE_2_ADDR, JOY_IO_PINS , Direction_IN);
/* ENABLE the alternate function for the Joystick pins */
IOE_IOAFConfig(IOE_2_ADDR, JOY_IO_PINS, ENABLE);
/* Configure the IOs to detect Falling and Rising Edges */
IOE_IOEdgeConfig(IOE_2_ADDR, JOY_IO_PINS, (uint8_t)(EDGE_FALLING | EDGE_RISING));
/* Temperature Sensor module configuration */
IOE_TempSens_Config();
/* ------------------------------------------------------------------------ */
/* Configuration is OK */
return IOE_OK;
}
/**
* @brief Configures The selected interrupts on the IO Expanders.
* @param IOE_ITSRC_Source: the source of the interrupts. Could be one or a
* combination of the following parameters:
* @arg IOE_ITSRC_JOYSTICK: Joystick IO intputs.
* @arg IOE_ITSRC_TSC: Touch Screen interrupts.
* @arg IOE_ITSRC_INMEMS: MEMS interrupt lines.
* @retval IOE_OK: if all initializations are OK. Other value if error.
*/
uint8_t IOE_ITConfig(uint32_t IOE_ITSRC_Source)
{
/* Configure the Interrupt output pin to generate low level (INT_CTRL) */
IOE_ITOutConfig(Polarity_High, Type_Level);
/* Manage the Joystick Interrupts */
if (IOE_ITSRC_Source & IOE_ITSRC_JOYSTICK)
{
/* Enable the Global interrupt */
IOE_GITCmd(IOE_2_ADDR, ENABLE);
/* Enable the Joystick pins to generate interrupt (GPIO_INT_EN) */
IOE_IOITConfig(IOE_2_ADDR, IOE_JOY_IT, ENABLE);
/* Enable the Global GPIO Interrupt */
IOE_GITConfig(IOE_2_ADDR, IOE_GIT_GPIO, ENABLE);
/* Read the GPIO_IT_STA to clear all pending bits if any */
I2C_ReadDeviceRegister(IOE_2_ADDR, IOE_REG_GPIO_INT_STA);
/* Enable the Joystick pins to generate interrupt */
IOE_IOITConfig(IOE_2_ADDR, IOE_JOY_IT, ENABLE);
/* Read the GPIO_IT_STA to clear all pending bits if any */
I2C_ReadDeviceRegister(IOE_2_ADDR, IOE_REG_GPIO_INT_STA);
}
/* Manage the MEMS Interrupts lines */
if (IOE_ITSRC_Source & IOE_ITSRC_INMEMS)
{
/* Enable the Global interrupt */
IOE_GITCmd(IOE_1_ADDR, ENABLE);
/* Enable the pins to generate interrupt (GPIO_INT_EN) */
IOE_IOITConfig(IOE_1_ADDR, IOE_INMEMS_IT, ENABLE);
/* Enable the Global GPIO Interrupt */
IOE_GITConfig(IOE_1_ADDR, IOE_GIT_GPIO, ENABLE);
/* Read the GPIO_IT_STA to clear all pending bits if any */
I2C_ReadDeviceRegister(IOE_1_ADDR, IOE_REG_GPIO_INT_STA);
/* Enable the pins to generate interrupt */
IOE_IOITConfig(IOE_1_ADDR, IOE_INMEMS_IT, ENABLE);
/* Read the GPIO_IT_STA to clear all pending bits if any */
I2C_ReadDeviceRegister(IOE_1_ADDR, IOE_REG_GPIO_INT_STA);
}
/* Manage the Touch Screen Interrupts */
if (IOE_ITSRC_Source & IOE_ITSRC_TSC)
{
/* Enable the Global interrupt */
IOE_GITCmd(IOE_1_ADDR, ENABLE);
/* Enable the Global GPIO Interrupt */
IOE_GITConfig(IOE_1_ADDR, (uint8_t)(IOE_GIT_TOUCH | IOE_GIT_FTH | IOE_GIT_FOV), ENABLE);
/* Read the GPIO_IT_STA to clear all pending bits if any */
I2C_ReadDeviceRegister(IOE_1_ADDR, IOE_REG_GPIO_INT_STA);
}
/* Configure the Interrupt line as EXTI source */
IOE_EXTI_Config();
/* If all OK return IOE_OK */
return IOE_OK;
}
/**
* @brief Writes a bit value to an output IO pin.
* @param IO_Pin: The output pin to be set or reset. This parameter can be one
* of the following values:
* @arg AUDIO_RESET_PIN: Audio codec reset pin
* @arg MII_INT_PIN: Ethernet Phy MII interrupt pin
* @arg VBAT_DIV_PIN: Battery devider pin
* @param BitVal: The value to be set. This parameter can be one of the
* following values: BitSet or BitReset. See IOE_BitVal_TypeDef.
* @retval IOE_OK or PARAM_ERROR
*/
uint8_t IOE_WriteIOPin(uint8_t IO_Pin, IOE_BitValue_TypeDef BitVal)
{
uint8_t DeviceAddr = 0;
/* Get the IO expander Address according to which pin is to be controlled */
if (IO_Pin & IO1_OUT_ALL_PINS)
{
DeviceAddr = IOE_1_ADDR;
}
else if (IO_Pin & IO2_OUT_ALL_PINS)
{
DeviceAddr = IOE_2_ADDR;
}
else
{
return PARAM_ERROR;
}
/* Apply the bit value to the selected pin */
if (BitVal == BitReset)
{
/* Set the register */
I2C_WriteDeviceRegister(DeviceAddr, IOE_REG_GPIO_CLR_PIN, IO_Pin);
}
else
{
/* Set the register */
I2C_WriteDeviceRegister(DeviceAddr, IOE_REG_GPIO_SET_PIN, IO_Pin);
}
return IOE_OK;
}
/**
* @brief Returns the status of the selected input IO pin.
* @param IO_Pin: The input pin to be read. This parameter can be one
* of the following values:
* @arg MEMS_INT1_PIN: MEMS interrupt line 1.
* @arg MEMS_INT2_PIN: MEMS interrupt line 2.
* @arg JOY_IO_PINS: Joystick IO pins (use IOE_JoyStickGetState for these pins)
* @retval None
*/
uint8_t IOE_ReadIOPin(uint32_t IO_Pin)
{
uint8_t DeviceAddr = 0;
uint8_t tmp = 0;
if (IO_Pin & IO1_IN_ALL_PINS)
{
DeviceAddr = IOE_1_ADDR;
}
else if (IO_Pin & IO2_IN_ALL_PINS)
{
DeviceAddr = IOE_2_ADDR;
}
else
{
return PARAM_ERROR;
}
/* Get all the Pins status */
tmp = I2C_ReadDeviceRegister(DeviceAddr, IOE_REG_GPIO_MP_STA);
if ((tmp & (uint8_t)IO_Pin) != 0)
{
return BitSet;
}
else
{
return BitReset;
}
}
/**
* @brief Returns the current Joystick status.
* @param None
* @retval The code of the Joystick key pressed:
* @arg JOY_NONE
* @arg JOY_IO_CENTER
* @arg JOY_DOWN
* @arg JOY_LEFT
* @arg JOY_RIGHT
* @arg JOY_UP
*/
JOY_State_TypeDef IOE_JoyStickGetState(void)
{
uint8_t tmp = 0;
/* Read the status of all pins */
tmp = (uint32_t)I2C_ReadDeviceRegister(IOE_2_ADDR, IOE_REG_GPIO_MP_STA);
/* Check the pressed keys */
if ((tmp & JOY_IO_NONE) == JOY_IO_NONE)
{
return (JOY_State_TypeDef)JOY_NONE;
}
else if (!(tmp & JOY_IO_CENTER))
{
return (JOY_State_TypeDef)JOY_CENTER;
}
else if (!(tmp & JOY_IO_DOWN))
{
return (JOY_State_TypeDef)JOY_DOWN;
}
else if (!(tmp & JOY_IO_LEFT))
{
return (JOY_State_TypeDef)JOY_LEFT;
}
else if (!(tmp & JOY_IO_RIGHT))
{
return (JOY_State_TypeDef)JOY_RIGHT;
}
else if (!(tmp & JOY_IO_UP))
{
return (JOY_State_TypeDef)JOY_UP;
}
else
{
return (JOY_State_TypeDef)JOY_NONE;
}
}
/**
* @brief Returns Status and positions of the Touch screen.
* @param None
* @retval Pointer to TS_STATE structure holding Touch Screen information.
*/
TS_STATE* IOE_TS_GetState(void)
{
uint32_t xDiff, yDiff , x , y;
static uint32_t _x = 0, _y = 0;
/* Check if the Touch detect event happenned */
TS_State.TouchDetected = (I2C_ReadDeviceRegister(IOE_1_ADDR, IOE_REG_TSC_CTRL) & 0x80);
if(TS_State.TouchDetected)
{
x = IOE_TS_Read_X();
y = IOE_TS_Read_Y();
xDiff = x > _x? (x - _x): (_x - x);
yDiff = y > _y? (y - _y): (_y - y);
if (xDiff + yDiff > 5)
{
_x = x;
_y = y;
}
}
/* Update the X position */
TS_State.X = _x;
/* Update the Y position */
TS_State.Y = _y;
/* Update the Z Pression index */
TS_State.Z = IOE_TS_Read_Z();
/* Clear the interrupt pending bit and enable the FIFO again */
I2C_WriteDeviceRegister(IOE_1_ADDR, IOE_REG_FIFO_STA, 0x01);
I2C_WriteDeviceRegister(IOE_1_ADDR, IOE_REG_FIFO_STA, 0x00);
/* Return pointer to the updated structure */
return &TS_State;
}
/**
* @brief Returns the temperature row value (in 16 bit format).
* @param None
* @retval The temperature row value.
*/
uint32_t IOE_TempSens_GetData(void)
{
static __IO uint32_t tmp = 0;
/* Aquire data enable */
I2C_WriteDeviceRegister(IOE_2_ADDR, IOE_REG_TEMP_CTRL, 0x03);
/* Enable the TEMPSENS module */
tmp = (uint32_t)((I2C_ReadDeviceRegister(IOE_2_ADDR, IOE_REG_TEMP_DATA) & 0x03) << 8);
tmp |= (uint32_t)I2C_ReadDeviceRegister(IOE_2_ADDR, IOE_REG_TEMP_DATA + 1);
tmp = (uint32_t)((tmp + 5) / 10);
/* return the temprature row value */
return tmp;
}
/**
* @brief Checks the selected Global interrupt source pending bit
* @param DeviceAddr: The address of the IOExpander, could be : IOE_1_ADDR
* or IOE_2_ADDR.
* @param Global_IT: the Global interrupt source to be checked, could be:
* @arg Global_IT_GPIO : All IOs interrupt
* @arg Global_IT_ADC : ADC interrupt
* @arg Global_IT_TEMP : Temperature Sensor interrupts
* @arg Global_IT_FE : Touch Screen Controller FIFO Error interrupt
* @arg Global_IT_FF : Touch Screen Controller FIFO Full interrupt
* @arg Global_IT_FOV : Touch Screen Controller FIFO Overrun interrupt
* @arg Global_IT_FTH : Touch Screen Controller FIFO Threshold interrupt
* @arg Global_IT_TOUCH : Touch Screen Controller Touch Detected interrupt
* @retval Status of the checked flag. Could be SET or RESET.
*/
FlagStatus IOE_GetGITStatus(uint8_t DeviceAddr, uint8_t Global_IT)
{
__IO uint8_t tmp = 0;
/* get the Interrupt status */
tmp = I2C_ReadDeviceRegister(DeviceAddr, IOE_REG_INT_STA);
if ((tmp & (uint8_t)Global_IT) != 0)
{
return SET;
}
else
{
return RESET;
}
}
/**
* @brief Clears the selected Global interrupt pending bit(s)
* @param DeviceAddr: The address of the IOExpander, could be : IOE_1_ADDR
* or IOE_2_ADDR.
* @param Global_IT: the Global interrupt to be cleared, could be any combination
* of the following values:
* @arg Global_IT_GPIO : All IOs interrupt
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -