123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977 |
- /**
- ******************************************************************************
- * @file stmpe811.c
- * @author MCD Application Team
- * @version V2.0.0
- * @date 15-December-2014
- * @brief This file provides a set of functions needed to manage the STMPE811
- * IO Expander devices.
- ******************************************************************************
- * @attention
- *
- * <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. Neither the name of STMicroelectronics nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- ******************************************************************************
- */
- /* Includes ------------------------------------------------------------------*/
- #include "stmpe811.h"
- /** @addtogroup BSP
- * @{
- */
- /** @addtogroup Components
- * @{
- */
-
- /** @defgroup STMPE811
- * @{
- */
- /** @defgroup STMPE811_Private_Types_Definitions
- * @{
- */
- /** @defgroup STMPE811_Private_Defines
- * @{
- */
- #define STMPE811_MAX_INSTANCE 2
- /**
- * @}
- */
- /** @defgroup STMPE811_Private_Macros
- * @{
- */
- /**
- * @}
- */
- /** @defgroup STMPE811_Private_Variables
- * @{
- */
- /* Touch screen driver structure initialization */
- TS_DrvTypeDef stmpe811_ts_drv =
- {
- stmpe811_Init,
- stmpe811_ReadID,
- stmpe811_Reset,
- stmpe811_TS_Start,
- stmpe811_TS_DetectTouch,
- stmpe811_TS_GetXY,
- stmpe811_TS_EnableIT,
- stmpe811_TS_ClearIT,
- stmpe811_TS_ITStatus,
- stmpe811_TS_DisableIT,
- };
- /* IO driver structure initialization */
- IO_DrvTypeDef stmpe811_io_drv =
- {
- stmpe811_Init,
- stmpe811_ReadID,
- stmpe811_Reset,
- stmpe811_IO_Start,
- stmpe811_IO_Config,
- stmpe811_IO_WritePin,
- stmpe811_IO_ReadPin,
- stmpe811_IO_EnableIT,
- stmpe811_IO_DisableIT,
- stmpe811_IO_ITStatus,
- stmpe811_IO_ClearIT,
- };
- /* stmpe811 instances by address */
- uint8_t stmpe811[STMPE811_MAX_INSTANCE] = {0};
- /**
- * @}
- */
- /** @defgroup STMPE811_Private_Function_Prototypes
- * @{
- */
- static uint8_t stmpe811_GetInstance(uint16_t DeviceAddr);
- /**
- * @}
- */
- /** @defgroup STMPE811_Private_Functions
- * @{
- */
- /**
- * @brief Initialize the stmpe811 and configure the needed hardware resources
- * @param DeviceAddr: Device address on communication Bus.
- * @retval None
- */
- void stmpe811_Init(uint16_t DeviceAddr)
- {
- uint8_t instance;
- uint8_t empty;
-
- /* Check if device instance already exists */
- instance = stmpe811_GetInstance(DeviceAddr);
-
- /* To prevent double initialization */
- if(instance == 0xFF)
- {
- /* Look for empty instance */
- empty = stmpe811_GetInstance(0);
-
- if(empty < STMPE811_MAX_INSTANCE)
- {
- /* Register the current device instance */
- stmpe811[empty] = DeviceAddr;
-
- /* Initialize IO BUS layer */
- IOE_Init();
-
- /* Generate stmpe811 Software reset */
- stmpe811_Reset(DeviceAddr);
- }
- }
- }
-
- /**
- * @brief Reset the stmpe811 by Software.
- * @param DeviceAddr: Device address on communication Bus.
- * @retval None
- */
- void stmpe811_Reset(uint16_t DeviceAddr)
- {
- /* Power Down the stmpe811 */
- IOE_Write(DeviceAddr, STMPE811_REG_SYS_CTRL1, 2);
- /* Wait for a delay to ensure registers erasing */
- IOE_Delay(10);
-
- /* Power On the Codec after the power off => all registers are reinitialized */
- IOE_Write(DeviceAddr, STMPE811_REG_SYS_CTRL1, 0);
-
- /* Wait for a delay to ensure registers erasing */
- IOE_Delay(2);
- }
- /**
- * @brief Read the stmpe811 IO Expander device ID.
- * @param DeviceAddr: Device address on communication Bus.
- * @retval The Device ID (two bytes).
- */
- uint16_t stmpe811_ReadID(uint16_t DeviceAddr)
- {
- /* Initialize IO BUS layer */
- IOE_Init();
-
- /* Return the device ID value */
- return ((IOE_Read(DeviceAddr, STMPE811_REG_CHP_ID_LSB) << 8) |\
- (IOE_Read(DeviceAddr, STMPE811_REG_CHP_ID_MSB)));
- }
- /**
- * @brief Enable the Global interrupt.
- * @param DeviceAddr: Device address on communication Bus.
- * @retval None
- */
- void stmpe811_EnableGlobalIT(uint16_t DeviceAddr)
- {
- uint8_t tmp = 0;
-
- /* Read the Interrupt Control register */
- tmp = IOE_Read(DeviceAddr, STMPE811_REG_INT_CTRL);
-
- /* Set the global interrupts to be Enabled */
- tmp |= (uint8_t)STMPE811_GIT_EN;
-
- /* Write Back the Interrupt Control register */
- IOE_Write(DeviceAddr, STMPE811_REG_INT_CTRL, tmp);
- }
- /**
- * @brief Disable the Global interrupt.
- * @param DeviceAddr: Device address on communication Bus.
- * @retval None
- */
- void stmpe811_DisableGlobalIT(uint16_t DeviceAddr)
- {
- uint8_t tmp = 0;
-
- /* Read the Interrupt Control register */
- tmp = IOE_Read(DeviceAddr, STMPE811_REG_INT_CTRL);
- /* Set the global interrupts to be Disabled */
- tmp &= ~(uint8_t)STMPE811_GIT_EN;
-
- /* Write Back the Interrupt Control register */
- IOE_Write(DeviceAddr, STMPE811_REG_INT_CTRL, tmp);
-
- }
- /**
- * @brief Enable the interrupt mode for the selected IT source
- * @param DeviceAddr: Device address on communication Bus.
- * @param Source: The interrupt source to be configured, could be:
- * @arg STMPE811_GIT_IO: IO interrupt
- * @arg STMPE811_GIT_ADC : ADC interrupt
- * @arg STMPE811_GIT_FE : Touch Screen Controller FIFO Error interrupt
- * @arg STMPE811_GIT_FF : Touch Screen Controller FIFO Full interrupt
- * @arg STMPE811_GIT_FOV : Touch Screen Controller FIFO Overrun interrupt
- * @arg STMPE811_GIT_FTH : Touch Screen Controller FIFO Threshold interrupt
- * @arg STMPE811_GIT_TOUCH : Touch Screen Controller Touch Detected interrupt
- * @retval None
- */
- void stmpe811_EnableITSource(uint16_t DeviceAddr, uint8_t Source)
- {
- uint8_t tmp = 0;
-
- /* Get the current value of the INT_EN register */
- tmp = IOE_Read(DeviceAddr, STMPE811_REG_INT_EN);
- /* Set the interrupts to be Enabled */
- tmp |= Source;
-
- /* Set the register */
- IOE_Write(DeviceAddr, STMPE811_REG_INT_EN, tmp);
- }
- /**
- * @brief Disable the interrupt mode for the selected IT source
- * @param DeviceAddr: Device address on communication Bus.
- * @param Source: The interrupt source to be configured, could be:
- * @arg STMPE811_GIT_IO: IO interrupt
- * @arg STMPE811_GIT_ADC : ADC interrupt
- * @arg STMPE811_GIT_FE : Touch Screen Controller FIFO Error interrupt
- * @arg STMPE811_GIT_FF : Touch Screen Controller FIFO Full interrupt
- * @arg STMPE811_GIT_FOV : Touch Screen Controller FIFO Overrun interrupt
- * @arg STMPE811_GIT_FTH : Touch Screen Controller FIFO Threshold interrupt
- * @arg STMPE811_GIT_TOUCH : Touch Screen Controller Touch Detected interrupt
- * @retval None
- */
- void stmpe811_DisableITSource(uint16_t DeviceAddr, uint8_t Source)
- {
- uint8_t tmp = 0;
-
- /* Get the current value of the INT_EN register */
- tmp = IOE_Read(DeviceAddr, STMPE811_REG_INT_EN);
- /* Set the interrupts to be Enabled */
- tmp &= ~Source;
-
- /* Set the register */
- IOE_Write(DeviceAddr, STMPE811_REG_INT_EN, tmp);
- }
- /**
- * @brief Set the global interrupt Polarity.
- * @param DeviceAddr: Device address on communication Bus.
- * @param Polarity: the IT mode polarity, could be one of the following values:
- * @arg STMPE811_POLARITY_LOW: Interrupt line is active Low/Falling edge
- * @arg STMPE811_POLARITY_HIGH: Interrupt line is active High/Rising edge
- * @retval None
- */
- void stmpe811_SetITPolarity(uint16_t DeviceAddr, uint8_t Polarity)
- {
- uint8_t tmp = 0;
-
- /* Get the current register value */
- tmp = IOE_Read(DeviceAddr, STMPE811_REG_INT_CTRL);
-
- /* Mask the polarity bits */
- tmp &= ~(uint8_t)0x04;
-
- /* Modify the Interrupt Output line configuration */
- tmp |= Polarity;
-
- /* Set the new register value */
- IOE_Write(DeviceAddr, STMPE811_REG_INT_CTRL, tmp);
-
- }
- /**
- * @brief Set the global interrupt Type.
- * @param DeviceAddr: Device address on communication Bus.
- * @param Type: Interrupt line activity type, could be one of the following values:
- * @arg STMPE811_TYPE_LEVEL: Interrupt line is active in level model
- * @arg STMPE811_TYPE_EDGE: Interrupt line is active in edge model
- * @retval None
- */
- void stmpe811_SetITType(uint16_t DeviceAddr, uint8_t Type)
- {
- uint8_t tmp = 0;
-
- /* Get the current register value */
- tmp = IOE_Read(DeviceAddr, STMPE811_REG_INT_CTRL);
-
- /* Mask the type bits */
- tmp &= ~(uint8_t)0x02;
-
- /* Modify the Interrupt Output line configuration */
- tmp |= Type;
-
- /* Set the new register value */
- IOE_Write(DeviceAddr, STMPE811_REG_INT_CTRL, tmp);
-
- }
- /**
- * @brief Check the selected Global interrupt source pending bit
- * @param DeviceAddr: Device address on communication Bus.
- * @param Source: the Global interrupt source to be checked, could be:
- * @arg STMPE811_GIT_IO: IO interrupt
- * @arg STMPE811_GIT_ADC : ADC interrupt
- * @arg STMPE811_GIT_FE : Touch Screen Controller FIFO Error interrupt
- * @arg STMPE811_GIT_FF : Touch Screen Controller FIFO Full interrupt
- * @arg STMPE811_GIT_FOV : Touch Screen Controller FIFO Overrun interrupt
- * @arg STMPE811_GIT_FTH : Touch Screen Controller FIFO Threshold interrupt
- * @arg STMPE811_GIT_TOUCH : Touch Screen Controller Touch Detected interrupt
- * @retval The checked Global interrupt source status.
- */
- uint8_t stmpe811_GlobalITStatus(uint16_t DeviceAddr, uint8_t Source)
- {
- /* Return the global IT source status */
- return((IOE_Read(DeviceAddr, STMPE811_REG_INT_STA) & Source) == Source);
- }
- /**
- * @brief Return the Global interrupts status
- * @param DeviceAddr: Device address on communication Bus.
- * @param Source: the Global interrupt source to be checked, could be:
- * @arg STMPE811_GIT_IO: IO interrupt
- * @arg STMPE811_GIT_ADC : ADC interrupt
- * @arg STMPE811_GIT_FE : Touch Screen Controller FIFO Error interrupt
- * @arg STMPE811_GIT_FF : Touch Screen Controller FIFO Full interrupt
- * @arg STMPE811_GIT_FOV : Touch Screen Controller FIFO Overrun interrupt
- * @arg STMPE811_GIT_FTH : Touch Screen Controller FIFO Threshold interrupt
- * @arg STMPE811_GIT_TOUCH : Touch Screen Controller Touch Detected interrupt
- * @retval The checked Global interrupt source status.
- */
- uint8_t stmpe811_ReadGITStatus(uint16_t DeviceAddr, uint8_t Source)
- {
- /* Return the global IT source status */
- return((IOE_Read(DeviceAddr, STMPE811_REG_INT_STA) & Source));
- }
- /**
- * @brief Clear the selected Global interrupt pending bit(s)
- * @param DeviceAddr: Device address on communication Bus.
- * @param Source: the Global interrupt source to be cleared, could be any combination
- * of the following values:
- * @arg STMPE811_GIT_IO: IO interrupt
- * @arg STMPE811_GIT_ADC : ADC interrupt
- * @arg STMPE811_GIT_FE : Touch Screen Controller FIFO Error interrupt
- * @arg STMPE811_GIT_FF : Touch Screen Controller FIFO Full interrupt
- * @arg STMPE811_GIT_FOV : Touch Screen Controller FIFO Overrun interrupt
- * @arg STMPE811_GIT_FTH : Touch Screen Controller FIFO Threshold interrupt
- * @arg STMPE811_GIT_TOUCH : Touch Screen Controller Touch Detected interrupt
- * @retval None
- */
- void stmpe811_ClearGlobalIT(uint16_t DeviceAddr, uint8_t Source)
- {
- /* Write 1 to the bits that have to be cleared */
- IOE_Write(DeviceAddr, STMPE811_REG_INT_STA, Source);
- }
- /**
- * @brief Start the IO functionality use and disable the AF for selected IO pin(s).
- * @param DeviceAddr: Device address on communication Bus.
- * @param IO_Pin: The IO pin(s) to put in AF. This parameter can be one
- * of the following values:
- * @arg STMPE811_PIN_x: where x can be from 0 to 7.
- * @retval None
- */
- void stmpe811_IO_Start(uint16_t DeviceAddr, uint32_t IO_Pin)
- {
- uint8_t mode;
-
- /* Get the current register value */
- mode = IOE_Read(DeviceAddr, STMPE811_REG_SYS_CTRL2);
-
- /* Set the Functionalities to be Disabled */
- mode &= ~(STMPE811_IO_FCT | STMPE811_ADC_FCT);
-
- /* Write the new register value */
- IOE_Write(DeviceAddr, STMPE811_REG_SYS_CTRL2, mode);
- /* Disable AF for the selected IO pin(s) */
- stmpe811_IO_DisableAF(DeviceAddr, (uint8_t)IO_Pin);
- }
- /**
- * @brief Configures the IO pin(s) according to IO mode structure value.
- * @param DeviceAddr: Device address on communication Bus.
- * @param IO_Pin: The output pin to be set or reset. This parameter can be one
- * of the following values:
- * @arg STMPE811_PIN_x: where x can be from 0 to 7.
- * @param IO_Mode: The IO pin mode to configure, could be one of the following values:
- * @arg IO_MODE_INPUT
- * @arg IO_MODE_OUTPUT
- * @arg IO_MODE_IT_RISING_EDGE
- * @arg IO_MODE_IT_FALLING_EDGE
- * @arg IO_MODE_IT_LOW_LEVEL
- * @arg IO_MODE_IT_HIGH_LEVEL
- * @retval 0 if no error, IO_Mode if error
- */
- uint8_t stmpe811_IO_Config(uint16_t DeviceAddr, uint32_t IO_Pin, IO_ModeTypedef IO_Mode)
- {
- uint8_t error_code = 0;
- /* Configure IO pin according to selected IO mode */
- switch(IO_Mode)
- {
- case IO_MODE_INPUT: /* Input mode */
- stmpe811_IO_InitPin(DeviceAddr, IO_Pin, STMPE811_DIRECTION_IN);
- break;
-
- case IO_MODE_OUTPUT: /* Output mode */
- stmpe811_IO_InitPin(DeviceAddr, IO_Pin, STMPE811_DIRECTION_OUT);
- break;
-
- case IO_MODE_IT_RISING_EDGE: /* Interrupt rising edge mode */
- stmpe811_IO_EnableIT(DeviceAddr);
- stmpe811_IO_EnablePinIT(DeviceAddr, IO_Pin);
- stmpe811_IO_InitPin(DeviceAddr, IO_Pin, STMPE811_DIRECTION_IN);
- stmpe811_SetITType(DeviceAddr, STMPE811_TYPE_EDGE);
- stmpe811_IO_SetEdgeMode(DeviceAddr, IO_Pin, STMPE811_EDGE_RISING);
- break;
-
- case IO_MODE_IT_FALLING_EDGE: /* Interrupt falling edge mode */
- stmpe811_IO_EnableIT(DeviceAddr);
- stmpe811_IO_EnablePinIT(DeviceAddr, IO_Pin);
- stmpe811_IO_InitPin(DeviceAddr, IO_Pin, STMPE811_DIRECTION_IN);
- stmpe811_SetITType(DeviceAddr, STMPE811_TYPE_EDGE);
- stmpe811_IO_SetEdgeMode(DeviceAddr, IO_Pin, STMPE811_EDGE_FALLING);
- break;
-
- case IO_MODE_IT_LOW_LEVEL: /* Low level interrupt mode */
- stmpe811_IO_EnableIT(DeviceAddr);
- stmpe811_IO_EnablePinIT(DeviceAddr, IO_Pin);
- stmpe811_IO_InitPin(DeviceAddr, IO_Pin, STMPE811_DIRECTION_IN);
- stmpe811_SetITType(DeviceAddr, STMPE811_TYPE_LEVEL);
- stmpe811_SetITPolarity(DeviceAddr, STMPE811_POLARITY_LOW);
- break;
-
- case IO_MODE_IT_HIGH_LEVEL: /* High level interrupt mode */
- stmpe811_IO_EnableIT(DeviceAddr);
- stmpe811_IO_EnablePinIT(DeviceAddr, IO_Pin);
- stmpe811_IO_InitPin(DeviceAddr, IO_Pin, STMPE811_DIRECTION_IN);
- stmpe811_SetITType(DeviceAddr, STMPE811_TYPE_LEVEL);
- stmpe811_SetITPolarity(DeviceAddr, STMPE811_POLARITY_HIGH);
- break;
- default:
- error_code = (uint8_t) IO_Mode;
- break;
- }
- return error_code;
- }
- /**
- * @brief Initialize the selected IO pin direction.
- * @param DeviceAddr: Device address on communication Bus.
- * @param IO_Pin: The IO pin to be configured. This parameter could be any
- * combination of the following values:
- * @arg STMPE811_PIN_x: Where x can be from 0 to 7.
- * @param Direction: could be STMPE811_DIRECTION_IN or STMPE811_DIRECTION_OUT.
- * @retval None
- */
- void stmpe811_IO_InitPin(uint16_t DeviceAddr, uint32_t IO_Pin, uint8_t Direction)
- {
- uint8_t tmp = 0;
-
- /* Get all the Pins direction */
- tmp = IOE_Read(DeviceAddr, STMPE811_REG_IO_DIR);
-
- /* Set the selected pin direction */
- if (Direction != STMPE811_DIRECTION_IN)
- {
- tmp |= (uint8_t)IO_Pin;
- }
- else
- {
- tmp &= ~(uint8_t)IO_Pin;
- }
-
- /* Write the register new value */
- IOE_Write(DeviceAddr, STMPE811_REG_IO_DIR, tmp);
- }
- /**
- * @brief Disable the AF for the selected IO pin(s).
- * @param DeviceAddr: Device address on communication Bus.
- * @param IO_Pin: The IO pin to be configured. This parameter could be any
- * combination of the following values:
- * @arg STMPE811_PIN_x: Where x can be from 0 to 7.
- * @retval None
- */
- void stmpe811_IO_DisableAF(uint16_t DeviceAddr, uint32_t IO_Pin)
- {
- uint8_t tmp = 0;
-
- /* Get the current state of the IO_AF register */
- tmp = IOE_Read(DeviceAddr, STMPE811_REG_IO_AF);
- /* Enable the selected pins alternate function */
- tmp |= (uint8_t)IO_Pin;
- /* Write back the new value in IO AF register */
- IOE_Write(DeviceAddr, STMPE811_REG_IO_AF, tmp);
-
- }
- /**
- * @brief Enable the AF for the selected IO pin(s).
- * @param DeviceAddr: Device address on communication Bus.
- * @param IO_Pin: The IO pin to be configured. This parameter could be any
- * combination of the following values:
- * @arg STMPE811_PIN_x: Where x can be from 0 to 7.
- * @retval None
- */
- void stmpe811_IO_EnableAF(uint16_t DeviceAddr, uint32_t IO_Pin)
- {
- uint8_t tmp = 0;
-
- /* Get the current register value */
- tmp = IOE_Read(DeviceAddr, STMPE811_REG_IO_AF);
- /* Enable the selected pins alternate function */
- tmp &= ~(uint8_t)IO_Pin;
-
- /* Write back the new register value */
- IOE_Write(DeviceAddr, STMPE811_REG_IO_AF, tmp);
- }
- /**
- * @brief Configure the Edge for which a transition is detectable for the
- * selected pin.
- * @param DeviceAddr: Device address on communication Bus.
- * @param IO_Pin: The IO pin to be configured. This parameter could be any
- * combination of the following values:
- * @arg STMPE811_PIN_x: Where x can be from 0 to 7.
- * @param Edge: The edge which will be detected. This parameter can be one or
- * a combination of following values: STMPE811_EDGE_FALLING and STMPE811_EDGE_RISING .
- * @retval None
- */
- void stmpe811_IO_SetEdgeMode(uint16_t DeviceAddr, uint32_t IO_Pin, uint8_t Edge)
- {
- uint8_t tmp1 = 0, tmp2 = 0;
-
- /* Get the current registers values */
- tmp1 = IOE_Read(DeviceAddr, STMPE811_REG_IO_FE);
- tmp2 = IOE_Read(DeviceAddr, STMPE811_REG_IO_RE);
- /* Disable the Falling Edge */
- tmp1 &= ~(uint8_t)IO_Pin;
-
- /* Disable the Falling Edge */
- tmp2 &= ~(uint8_t)IO_Pin;
- /* Enable the Falling edge if selected */
- if (Edge & STMPE811_EDGE_FALLING)
- {
- tmp1 |= (uint8_t)IO_Pin;
- }
- /* Enable the Rising edge if selected */
- if (Edge & STMPE811_EDGE_RISING)
- {
- tmp2 |= (uint8_t)IO_Pin;
- }
- /* Write back the new registers values */
- IOE_Write(DeviceAddr, STMPE811_REG_IO_FE, tmp1);
- IOE_Write(DeviceAddr, STMPE811_REG_IO_RE, tmp2);
- }
- /**
- * @brief Write a new IO pin state.
- * @param DeviceAddr: Device address on communication Bus.
- * @param IO_Pin: The output pin to be set or reset. This parameter can be one
- * of the following values:
- * @arg STMPE811_PIN_x: where x can be from 0 to 7.
- * @param PinState: The new IO pin state.
- * @retval None
- */
- void stmpe811_IO_WritePin(uint16_t DeviceAddr, uint32_t IO_Pin, uint8_t PinState)
- {
- /* Apply the bit value to the selected pin */
- if (PinState != 0)
- {
- /* Set the register */
- IOE_Write(DeviceAddr, STMPE811_REG_IO_SET_PIN, (uint8_t)IO_Pin);
- }
- else
- {
- /* Set the register */
- IOE_Write(DeviceAddr, STMPE811_REG_IO_CLR_PIN, (uint8_t)IO_Pin);
- }
- }
- /**
- * @brief Return the state of the selected IO pin(s).
- * @param DeviceAddr: Device address on communication Bus.
- * @param IO_Pin: The output pin to be set or reset. This parameter can be one
- * of the following values:
- * @arg STMPE811_PIN_x: where x can be from 0 to 7.
- * @retval IO pin(s) state.
- */
- uint32_t stmpe811_IO_ReadPin(uint16_t DeviceAddr, uint32_t IO_Pin)
- {
- return((uint32_t)(IOE_Read(DeviceAddr, STMPE811_REG_IO_MP_STA) & (uint8_t)IO_Pin));
- }
- /**
- * @brief Enable the global IO interrupt source.
- * @param DeviceAddr: Device address on communication Bus.
- * @retval None
- */
- void stmpe811_IO_EnableIT(uint16_t DeviceAddr)
- {
- IOE_ITConfig();
-
- /* Enable global IO IT source */
- stmpe811_EnableITSource(DeviceAddr, STMPE811_GIT_IO);
-
- /* Enable global interrupt */
- stmpe811_EnableGlobalIT(DeviceAddr);
- }
- /**
- * @brief Disable the global IO interrupt source.
- * @param DeviceAddr: Device address on communication Bus.
- * @retval None
- */
- void stmpe811_IO_DisableIT(uint16_t DeviceAddr)
- {
- /* Disable the global interrupt */
- stmpe811_DisableGlobalIT(DeviceAddr);
-
- /* Disable global IO IT source */
- stmpe811_DisableITSource(DeviceAddr, STMPE811_GIT_IO);
- }
- /**
- * @brief Enable interrupt mode for the selected IO pin(s).
- * @param DeviceAddr: Device address on communication Bus.
- * @param IO_Pin: The IO interrupt to be enabled. This parameter could be any
- * combination of the following values:
- * @arg STMPE811_PIN_x: where x can be from 0 to 7.
- * @retval None
- */
- void stmpe811_IO_EnablePinIT(uint16_t DeviceAddr, uint32_t IO_Pin)
- {
- uint8_t tmp = 0;
-
- /* Get the IO interrupt state */
- tmp = IOE_Read(DeviceAddr, STMPE811_REG_IO_INT_EN);
-
- /* Set the interrupts to be enabled */
- tmp |= (uint8_t)IO_Pin;
-
- /* Write the register new value */
- IOE_Write(DeviceAddr, STMPE811_REG_IO_INT_EN, tmp);
- }
- /**
- * @brief Disable interrupt mode for the selected IO pin(s).
- * @param DeviceAddr: Device address on communication Bus.
- * @param IO_Pin: The IO interrupt to be disabled. This parameter could be any
- * combination of the following values:
- * @arg STMPE811_PIN_x: where x can be from 0 to 7.
- * @retval None
- */
- void stmpe811_IO_DisablePinIT(uint16_t DeviceAddr, uint32_t IO_Pin)
- {
- uint8_t tmp = 0;
-
- /* Get the IO interrupt state */
- tmp = IOE_Read(DeviceAddr, STMPE811_REG_IO_INT_EN);
-
- /* Set the interrupts to be Disabled */
- tmp &= ~(uint8_t)IO_Pin;
-
- /* Write the register new value */
- IOE_Write(DeviceAddr, STMPE811_REG_IO_INT_EN, tmp);
- }
- /**
- * @brief Check the status of the selected IO interrupt pending bit
- * @param DeviceAddr: Device address on communication Bus.
- * @param IO_Pin: The IO interrupt to be checked could be:
- * @arg STMPE811_PIN_x Where x can be from 0 to 7.
- * @retval Status of the checked IO pin(s).
- */
- uint32_t stmpe811_IO_ITStatus(uint16_t DeviceAddr, uint32_t IO_Pin)
- {
- /* Get the Interrupt status */
- return(IOE_Read(DeviceAddr, STMPE811_REG_IO_INT_STA) & (uint8_t)IO_Pin);
- }
- /**
- * @brief Clear the selected IO interrupt pending bit(s).
- * @param DeviceAddr: Device address on communication Bus.
- * @param IO_Pin: the IO interrupt to be cleared, could be:
- * @arg STMPE811_PIN_x: Where x can be from 0 to 7.
- * @retval None
- */
- void stmpe811_IO_ClearIT(uint16_t DeviceAddr, uint32_t IO_Pin)
- {
- /* Clear the global IO IT pending bit */
- stmpe811_ClearGlobalIT(DeviceAddr, STMPE811_GIT_IO);
-
- /* Clear the IO IT pending bit(s) */
- IOE_Write(DeviceAddr, STMPE811_REG_IO_INT_STA, (uint8_t)IO_Pin);
-
- /* Clear the Edge detection pending bit*/
- IOE_Write(DeviceAddr, STMPE811_REG_IO_ED, (uint8_t)IO_Pin);
-
- /* Clear the Rising edge pending bit */
- IOE_Write(DeviceAddr, STMPE811_REG_IO_RE, (uint8_t)IO_Pin);
-
- /* Clear the Falling edge pending bit */
- IOE_Write(DeviceAddr, STMPE811_REG_IO_FE, (uint8_t)IO_Pin);
- }
- /**
- * @brief Configures the touch Screen Controller (Single point detection)
- * @param DeviceAddr: Device address on communication Bus.
- * @retval None.
- */
- void stmpe811_TS_Start(uint16_t DeviceAddr)
- {
- uint8_t mode;
-
- /* Get the current register value */
- mode = IOE_Read(DeviceAddr, STMPE811_REG_SYS_CTRL2);
-
- /* Set the Functionalities to be Enabled */
- mode &= ~(STMPE811_IO_FCT);
-
- /* Write the new register value */
- IOE_Write(DeviceAddr, STMPE811_REG_SYS_CTRL2, mode);
- /* Select TSC pins in TSC alternate mode */
- stmpe811_IO_EnableAF(DeviceAddr, STMPE811_TOUCH_IO_ALL);
-
- /* Set the Functionalities to be Enabled */
- mode &= ~(STMPE811_TS_FCT | STMPE811_ADC_FCT);
-
- /* Set the new register value */
- IOE_Write(DeviceAddr, STMPE811_REG_SYS_CTRL2, mode);
-
- /* Select Sample Time, bit number and ADC Reference */
- IOE_Write(DeviceAddr, STMPE811_REG_ADC_CTRL1, 0x49);
-
- /* Wait for 2 ms */
- IOE_Delay(2);
-
- /* Select the ADC clock speed: 3.25 MHz */
- IOE_Write(DeviceAddr, STMPE811_REG_ADC_CTRL2, 0x01);
-
- /* Select 2 nF filter capacitor */
- /* Configuration:
- - Touch average control : 4 samples
- - Touch delay time : 500 uS
- - Panel driver setting time: 500 uS
- */
- IOE_Write(DeviceAddr, STMPE811_REG_TSC_CFG, 0x9A);
-
- /* Configure the Touch FIFO threshold: single point reading */
- IOE_Write(DeviceAddr, STMPE811_REG_FIFO_TH, 0x01);
-
- /* Clear the FIFO memory content. */
- IOE_Write(DeviceAddr, STMPE811_REG_FIFO_STA, 0x01);
-
- /* Put the FIFO back into operation mode */
- IOE_Write(DeviceAddr, STMPE811_REG_FIFO_STA, 0x00);
-
- /* Set the range and accuracy pf the pressure measurement (Z) :
- - Fractional part :7
- - Whole part :1
- */
- IOE_Write(DeviceAddr, STMPE811_REG_TSC_FRACT_XYZ, 0x01);
-
- /* Set the driving capability (limit) of the device for TSC pins: 50mA */
- IOE_Write(DeviceAddr, STMPE811_REG_TSC_I_DRIVE, 0x01);
-
- /* Touch screen control configuration (enable TSC):
- - No window tracking index
- - XYZ acquisition mode
- */
- IOE_Write(DeviceAddr, STMPE811_REG_TSC_CTRL, 0x01);
-
- /* Clear all the status pending bits if any */
- IOE_Write(DeviceAddr, STMPE811_REG_INT_STA, 0xFF);
- /* Wait for 2 ms delay */
- IOE_Delay(2);
- }
- /**
- * @brief Return if there is touch detected or not.
- * @param DeviceAddr: Device address on communication Bus.
- * @retval Touch detected state.
- */
- uint8_t stmpe811_TS_DetectTouch(uint16_t DeviceAddr)
- {
- uint8_t state;
- uint8_t ret = 0;
-
- state = ((IOE_Read(DeviceAddr, STMPE811_REG_TSC_CTRL) & (uint8_t)STMPE811_TS_CTRL_STATUS) == (uint8_t)0x80);
-
- if(state > 0)
- {
- if(IOE_Read(DeviceAddr, STMPE811_REG_FIFO_SIZE) > 0)
- {
- ret = 1;
- }
- }
- else
- {
- /* Reset FIFO */
- IOE_Write(DeviceAddr, STMPE811_REG_FIFO_STA, 0x01);
- /* Enable the FIFO again */
- IOE_Write(DeviceAddr, STMPE811_REG_FIFO_STA, 0x00);
- }
-
- return ret;
- }
- /**
- * @brief Get the touch screen X and Y positions values
- * @param DeviceAddr: Device address on communication Bus.
- * @param X: Pointer to X position value
- * @param Y: Pointer to Y position value
- * @retval None.
- */
- void stmpe811_TS_GetXY(uint16_t DeviceAddr, uint16_t *X, uint16_t *Y)
- {
- uint8_t dataXYZ[4];
- uint32_t uldataXYZ;
-
- IOE_ReadMultiple(DeviceAddr, STMPE811_REG_TSC_DATA_NON_INC, dataXYZ, sizeof(dataXYZ)) ;
-
- /* Calculate positions values */
- uldataXYZ = (dataXYZ[0] << 24)|(dataXYZ[1] << 16)|(dataXYZ[2] << 8)|(dataXYZ[3] << 0);
- *X = (uldataXYZ >> 20) & 0x00000FFF;
- *Y = (uldataXYZ >> 8) & 0x00000FFF;
-
- /* Reset FIFO */
- IOE_Write(DeviceAddr, STMPE811_REG_FIFO_STA, 0x01);
- /* Enable the FIFO again */
- IOE_Write(DeviceAddr, STMPE811_REG_FIFO_STA, 0x00);
- }
- /**
- * @brief Configure the selected source to generate a global interrupt or not
- * @param DeviceAddr: Device address on communication Bus.
- * @retval None
- */
- void stmpe811_TS_EnableIT(uint16_t DeviceAddr)
- {
- IOE_ITConfig();
-
- /* Enable global TS IT source */
- stmpe811_EnableITSource(DeviceAddr, STMPE811_TS_IT);
-
- /* Enable global interrupt */
- stmpe811_EnableGlobalIT(DeviceAddr);
- }
- /**
- * @brief Configure the selected source to generate a global interrupt or not
- * @param DeviceAddr: Device address on communication Bus.
- * @retval None
- */
- void stmpe811_TS_DisableIT(uint16_t DeviceAddr)
- {
- /* Disable global interrupt */
- stmpe811_DisableGlobalIT(DeviceAddr);
-
- /* Disable global TS IT source */
- stmpe811_DisableITSource(DeviceAddr, STMPE811_TS_IT);
- }
- /**
- * @brief Configure the selected source to generate a global interrupt or not
- * @param DeviceAddr: Device address on communication Bus.
- * @retval TS interrupts status
- */
- uint8_t stmpe811_TS_ITStatus(uint16_t DeviceAddr)
- {
- /* Return TS interrupts status */
- return(stmpe811_ReadGITStatus(DeviceAddr, STMPE811_TS_IT));
- }
- /**
- * @brief Configure the selected source to generate a global interrupt or not
- * @param DeviceAddr: Device address on communication Bus.
- * @retval None
- */
- void stmpe811_TS_ClearIT(uint16_t DeviceAddr)
- {
- /* Clear the global TS IT source */
- stmpe811_ClearGlobalIT(DeviceAddr, STMPE811_TS_IT);
- }
- /**
- * @brief Check if the device instance of the selected address is already registered
- * and return its index
- * @param DeviceAddr: Device address on communication Bus.
- * @retval Index of the device instance if registered, 0xFF if not.
- */
- static uint8_t stmpe811_GetInstance(uint16_t DeviceAddr)
- {
- uint8_t idx = 0;
-
- /* Check all the registered instances */
- for(idx = 0; idx < STMPE811_MAX_INSTANCE ; idx ++)
- {
- if(stmpe811[idx] == DeviceAddr)
- {
- return idx;
- }
- }
-
- return 0xFF;
- }
- /**
- * @}
- */
- /**
- * @}
- */
- /**
- * @}
- */
- /**
- * @}
- */
- /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|