summaryrefslogtreecommitdiff
path: root/Libraries/TouchSense/STMTouch_Driver/src/tsl_acq_stm8l_sw.c
diff options
context:
space:
mode:
Diffstat (limited to 'Libraries/TouchSense/STMTouch_Driver/src/tsl_acq_stm8l_sw.c')
-rw-r--r--Libraries/TouchSense/STMTouch_Driver/src/tsl_acq_stm8l_sw.c1426
1 files changed, 0 insertions, 1426 deletions
diff --git a/Libraries/TouchSense/STMTouch_Driver/src/tsl_acq_stm8l_sw.c b/Libraries/TouchSense/STMTouch_Driver/src/tsl_acq_stm8l_sw.c
deleted file mode 100644
index 0334c22..0000000
--- a/Libraries/TouchSense/STMTouch_Driver/src/tsl_acq_stm8l_sw.c
+++ /dev/null
@@ -1,1426 +0,0 @@
-/**
- ******************************************************************************
- * @file tsl_acq_stm8l_sw.c
- * @author MCD Application Team
- * @version V1.4.4
- * @date 31-March-2014
- * @brief This file contains all functions to manage the acquisition
- * on STM8L products using the software acquisition mode.
- ******************************************************************************
- * @attention
- *
- * <h2><center>&copy; COPYRIGHT 2014 STMicroelectronics</center></h2>
- *
- * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- ******************************************************************************
- */
-
-/* Includes ------------------------------------------------------------------*/
-#include "tsl_acq_stm8l_sw.h"
-#include "tsl_globals.h"
-
-/* Private typedefs ----------------------------------------------------------*/
-
-/** Structure containing RI IO informations according to GPIO.
- */
-typedef struct
-{
- unsigned int IO_Channel : 4; /**< Channel number from 1 to 4 in the Routing interface group */
- unsigned int IO_Group : 4; /**< Group number in the Routing interface */
-} TSL_IOConf_T;
-
-/* Private defines -----------------------------------------------------------*/
-
-/** Define if maximum channel number is 3 or 4 according to the Device Density
- */
-#if defined(STM8L15X_LD) || defined(STM8L10X)
-#define MAX_CHANNEL_NUMBER_BY_GROUP (4)
-#else
-#define MAX_CHANNEL_NUMBER_BY_GROUP (3)
-#endif // defined(STM8L15X_LD) || defined(STM8L10X)
-
-#if defined(_COSMIC_)
-#define INLINE @inline
-#elif defined(_RAISONANCE_)
-#define INLINE inline
-#elif defined(_IAR_)
-#define INLINE
-#else
-#error "Compiler not Supported"
-#endif
-
-/* Private macros ------------------------------------------------------------*/
-
-#if !defined(STM8L10X)
-#define GPIO_PORT(GPIO) (GPIO >> 3) /**< Get the GPIO port*/
-#define GPIO_BIT(GPIO) (GPIO & 0x07) /**< Get the GPIO pin number*/
-#else
-#define GPIO_PORT(GPIO) (GPIO >> 2) /**< Get the GPIO port*/
-#define GPIO_BIT(GPIO) (GPIO & 0x03) /**< Get the GPIO pin number*/
-#endif // !defined(STM8L10X)
-
-#define IS_BANK_INDEX_OK(INDEX) (((INDEX) == 0) || (((INDEX) > 0) && ((INDEX) < TSLPRM_TOTAL_BANKS))) /**< Check if the index have a good range*/
-
-#define GPIO_ODR_HIGH(GPIO) (p_GPIOx[GPIO_PORT(GPIO)]->ODR |= (uint8_t)(1 << GPIO_BIT(GPIO)))
-#define GPIO_ODR_LOW(GPIO) (p_GPIOx[GPIO_PORT(GPIO)]->ODR &= (uint8_t)(~(1 << GPIO_BIT(GPIO))))
-#define GPIO_DDR_IN(GPIO) (p_GPIOx[GPIO_PORT(GPIO)]->DDR &= (uint8_t)(~(1 << GPIO_BIT(GPIO))))
-#define GPIO_DDR_OUT(GPIO) (p_GPIOx[GPIO_PORT(GPIO)]->DDR |= (uint8_t)(1 << GPIO_BIT(GPIO)))
-#define GPIO_CR1_PP(GPIO) (p_GPIOx[GPIO_PORT(GPIO)]->CR1 |= (uint8_t)(1 << GPIO_BIT(GPIO)))
-#define GPIO_CR1_FLOATING(GPIO) (p_GPIOx[GPIO_PORT(GPIO)]->CR1 &= (uint8_t)(~(1 << GPIO_BIT(GPIO))))
-
-#define DISABLE_MASK(GPIO) (DisableMask[(GPIO_to_SW_Conf[GPIO].IO_Channel)-1] |= (uint8_t)(1 << GPIO_to_SW_Conf[GPIO].IO_Group)) /**< Create disable mask array to modify initial bank mask before acquisition (only for STATUS_OFF)*/
-#define DISABLE_SAMPLING(GPIO) (DisableSampling |= (uint8_t)(1 << GPIO_to_SW_Conf[GPIO].IO_Group)) /**< Create disable sampling mask to don't take sampling measurement of corresponding channels(for STATUS_BURST_ONLY and shield) */
-
-/* Private variables ---------------------------------------------------------*/
-
-uint8_t SpreadCounter = TSLPRM_SPREAD_MIN;
-
-uint16_t ChargeTransferCounter; // This variable count the charge transfer number in the acquisition loop
-uint8_t BankDone; // Control if all activate sampling reach the VIH level
-uint8_t CurrentSampling; // Mask to control IOGCR register
-uint8_t CurrentChannel; // Mask to control IOGCR register
-uint8_t ChannelSampling; // Contain the channel number where all sampling are connected
-uint8_t DisableSampling; // Disable sampling mask when the Burst Only mode is activated for one channel of the current bank(not get the measure)
-
-TSL_Bank_Config_Mask_T BankMask[TSLPRM_TOTAL_BANKS]; // Complete masks (channel and sampling) to configure IOCMRx and IOSRx registers for all banks
-uint8_t SamplingMask[TSLPRM_TOTAL_BANKS]; // Sampling mask to configure IOGCR register for all banks
-uint8_t DisableMask[MAX_CHANNEL_NUMBER_BY_GROUP]; // Complete disable mask(channel and sampling) when the Channel OFF mode is activated for one channel of the current bank(to modifie the CurrentBank)
-uint8_t CurrentBank[MAX_CHANNEL_NUMBER_BY_GROUP]; // Complete mask for the current bank
-
-#if !defined(STM8L10X)
-
-#if defined(STM8L15X_LD)
-__IO uint8_t *RI_IOIRx_Register[MAX_CHANNEL_NUMBER_BY_GROUP] = {&(RI->IOIR1), &(RI->IOIR2), &(RI->IOIR3), &(RI->IOIR4)};
-#else
-__IO uint8_t *RI_IOIRx_Register[MAX_CHANNEL_NUMBER_BY_GROUP] = {&(RI->IOIR1), &(RI->IOIR2), &(RI->IOIR3)};
-#endif // STM8L15X_LD
-
-__IO uint8_t *p_IOIRx; // Pointer to the IOIRx register (x from 1 to 4)
-GPIO_TypeDef *p_GPIOx[] = {GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF};
-
-uint16_t tab_MeasurementCounter[8] = {0}; // Measurement of each sampling of the current bank
-uint8_t ChannelMask[TSLPRM_TOTAL_BANKS]; // Channel mask to configure IOGCR register for all banks
-
-/* Table which do the link between GPIO and switch configuation:{x,y}
- x = channel number
- y = group number - 1
- Note: {0,0} = not connect to IO switch
-*/
-CONST TSL_IOConf_T GPIO_to_SW_Conf[40] =
-{
- // Port A definitions
- {0, 0}, // PA0
- {0, 0}, // PA1
- {0, 0}, // PA2
- {0, 0}, // PA3
- {3, 0}, // PA4 is channel 3 of Group 1
- {2, 0}, // PA5 is channel 2 of Group 1
- {1, 0}, // PA6 is channel 1 of Group 1
- {4, 0}, // PA7 is channel 4 of Group 1
- // Port B definitions
- {1, 6}, // PB0
- {3, 5},
- {2, 5},
- {1, 5},
- {3, 4},
- {2, 4},
- {1, 4},
- {3, 3}, // PB7
- // Port C definitions
- {0, 0}, // PC0
- {0, 0},
- {1, 2},
- {3, 1},
- {2, 1},
- {0, 0},
- {0, 0},
- {1, 1}, // PC7
- // Port D definitions
- {2, 7}, // PD0
- {1, 7},
- {3, 6},
- {2, 6},
- {2, 3},
- {1, 3},
- {3, 2},
- {2, 2}, // PD7
- // Port E definitions
- {0, 0}, // PE0
- {0, 0},
- {0, 0},
- {4, 6},
- {4, 7},
- {3, 7},
- {0, 0},
- {4, 1} // PE7
-};
-
-#else // STM8L10X
-
-__IO uint8_t *p_GPIOx_IDR;
-__IO uint8_t *GPIOx_IDR[2] = {&(GPIOB->IDR), &(GPIOD->IDR)};
-
-GPIO_TypeDef *p_GPIOx[] = {GPIOB, GPIOD};
-
-uint16_t tab_MeasurementCounter[2] = {0}; // Measurement of each sampling of the current bank
-uint8_t Bank_IO_CompMask[TSLPRM_TOTAL_BANKS]; // IO Mask for Comparator register to control SW
-uint8_t BankSamplingCompMask[TSLPRM_TOTAL_BANKS]; // Sampling Mask for Comparator register to control SW
-uint8_t Bank_IOShield_CompMask[TSLPRM_TOTAL_BANKS];
-uint8_t BankSamplingShieldCompMask[TSLPRM_TOTAL_BANKS];
-
-/* Table which do the link between GPIO and switch configuation:{x,y}
- x = channel number
- y = group number - 1
- Note: {0,0} = not connect to IO switch
-*/
-CONST TSL_IOConf_T GPIO_to_SW_Conf[8] =
-{
- // Port B definitions
- {1, 0}, // PB0 is channel 1 of Group 1
- {2, 0}, // PB1 is channel 2 of Group 1
- {1, 1}, // PB2 is channel 1 of Group 2
- {2, 1}, // PB3 is channel 2 of Group 2
- // Port D definitions
- {3, 0}, // PD0 is channel 3 of Group 1
- {4, 0}, // PD1 is channel 4 of Group 1
- {3, 1}, // PD2 is channel 3 of Group 2
- {4, 1} // PD3 is channel 4 of Group 2
-};
-
-#endif // !defined(STM8L10X)
-
-/* Private functions prototype -----------------------------------------------*/
-void SoftDelay(uint16_t val);
-void CreateMask(TSL_tIndex_T idx_bk, uint8_t GPIO);
-void GetCounter(__IO uint8_t *p_reg, uint8_t *p_old_status);
-INLINE void __Delay_Charge(void);
-void CreateIOMask(TSL_tIndex_T idx_bk, uint8_t GPIO);
-void CreateSamplingMask(TSL_tIndex_T idx_bk, uint8_t GPIO);
-#if (TSLPRM_USE_SPREAD_SPECTRUM > 0)
-INLINE void SwSpreadSpectrum(void);
-#endif
-
-
-/**
- * @brief Delay in NOPs to apply during charging time.
- * @param None
- * @retval None
- */
-INLINE void __Delay_Charge(void)
-{
-#if TSLPRM_DELAY_CHARGE > 0
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 1
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 2
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 3
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 4
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 5
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 6
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 7
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 8
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 9
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 10
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 11
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 12
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 13
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 14
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 15
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 16
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 17
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 18
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 19
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 20
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 21
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 22
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 23
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 24
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 25
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 26
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 27
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 28
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 29
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 30
- nop();
-#endif
-#if TSLPRM_DELAY_CHARGE > 31
- nop();
-#endif
-}
-
-
-/**
- * @brief Delay in NOPs to apply during transfering time.
- * @param None
- * @retval None
- */
-INLINE void __Delay_Transfer(void)
-{
-#if TSLPRM_DELAY_TRANSFER > 0
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 1
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 2
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 3
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 4
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 5
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 6
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 7
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 8
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 9
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 10
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 11
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 12
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 13
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 14
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 15
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 16
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 17
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 18
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 19
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 20
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 21
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 22
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 23
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 24
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 25
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 26
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 27
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 28
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 29
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 30
- nop();
-#endif
-#if TSLPRM_DELAY_TRANSFER > 31
- nop();
-#endif
-}
-
-
-/**
- * @brief Initialize the acquisition module.
- * @param None
- * @retval Status
- */
-TSL_Status_enum_T TSL_acq_Init(void)
-{
- CONST TSL_Bank_T *p_bank = &(TSL_Globals.Bank_Array[0]); // Pointer to the first bank
- CONST TSL_ChannelSrc_T *p_chSrc = p_bank->p_chSrc; // Pointer to the source channel of the current bank
- TSL_tNb_T number_of_channels = 0;
- TSL_tIndex_T idx_bk;
- TSL_tIndex_T idx_ch;
-
-#if !defined(STM8L10X)
- // Enable comparator clock to activate the RI block
- CLK->PCKENR2 |= CLK_PCKENR2_COMP;
-#endif // !defined(STM8L10X)
-
- // Enable mode software (bit AM)
-#if defined(STM8L15X_LD)
- RI->CR &= (uint8_t)(~0x04); // Mode SW
-#endif // STM8L15X_LD
-
- // Initializes each bank and configures the used GPIO
- for (idx_bk = 0; idx_bk < TSLPRM_TOTAL_BANKS; idx_bk++)
- {
- p_bank = &(TSL_Globals.Bank_Array[idx_bk]);
- p_chSrc = p_bank->p_chSrc;
- number_of_channels = p_bank->NbChannels;
-
-#if !defined(STM8L10X)
- // Mask Initialization
- BankMask[idx_bk].ch1 = 0;
- BankMask[idx_bk].ch2 = 0;
- BankMask[idx_bk].ch3 = 0;
- BankMask[idx_bk].ch4 = 0;
-#else
- // Mask Initialization
- BankMask[idx_bk].GPIOB_IO = 0;
- BankMask[idx_bk].GPIOB_Samp = 0;
- BankMask[idx_bk].GPIOD_IO = 0;
- BankMask[idx_bk].GPIOD_Samp = 0;
-#endif // !defined(STM8L10X)
-
- // Get which channel is used for sampling only one time because it's the same for each couple
- SamplingMask[idx_bk] = (uint8_t)GPIO_to_SW_Conf[p_chSrc->sampling].IO_Channel;
-
-#if (TSLPRM_USE_SHIELD > 0)
-
- // Create Mask per bank for shield
-#if !defined(STM8L10X)
- CreateMask(idx_bk, p_bank->shield_sampling);
- CreateMask(idx_bk, p_bank->shield_channel);
- ChannelMask[idx_bk] |= (uint8_t)(3 << (2 * ((GPIO_to_SW_Conf[p_bank->shield_channel].IO_Channel) - 1)));
-#else
- CreateIOMask(idx_bk, p_bank->shield_channel);
- CreateSamplingMask(idx_bk, p_bank->shield_sampling);
-#endif // !defined(STM8L10X)
-
- // Check if shield sampling capacitors are in the same number of channel for each group
- if ((SamplingMask[idx_bk] != (uint8_t)GPIO_to_SW_Conf[p_bank->shield_sampling].IO_Channel))
- {
- return TSL_STATUS_ERROR;
- }
-
- // GPIO in Output
- GPIO_DDR_OUT(p_bank->shield_sampling);
- GPIO_DDR_OUT(p_bank->shield_channel);
- // GPIO in PP
- GPIO_CR1_PP(p_bank->shield_sampling);
- GPIO_CR1_PP(p_bank->shield_channel);
- // Output in Low level
- GPIO_ODR_LOW(p_bank->shield_sampling);
- GPIO_ODR_LOW(p_bank->shield_channel);
-
- // Activate Comparator 1
- if (GPIO_to_SW_Conf[p_bank->shield_sampling].IO_Group == 0)
- {
- COMP->CR |= 0x02;
- }
- // Activate Comparator 2
- if (GPIO_to_SW_Conf[p_bank->shield_sampling].IO_Group == 1)
- {
- COMP->CR |= 0x04;
- }
-
-#endif // TSLPRM_USE_SHIELD
-
- // Initialize the mask for channel and sampling
- for (idx_ch = 0; idx_ch < number_of_channels; idx_ch++)
- {
-#if !defined(STM8L10X)
- // Create Mask per bank for channel and sampling
- CreateMask(idx_bk, p_chSrc->channel);
- CreateMask(idx_bk, p_chSrc->sampling);
- ChannelMask[idx_bk] |= (uint8_t)(3 << (2 * ((GPIO_to_SW_Conf[p_chSrc->channel].IO_Channel) - 1)));
- // Check if sampling capacitors are in the same number of channel for each group
- if ((SamplingMask[idx_bk] != (uint8_t)GPIO_to_SW_Conf[p_chSrc->sampling].IO_Channel))
- {
- return TSL_STATUS_ERROR;
- }
-#else
- // Activate Comparator 1
- if (p_chSrc->IdxSrc == 0)
- {
- COMP->CR |= 0x02;
- }
- // Activate Comparator 2
- if (p_chSrc->IdxSrc == 1)
- {
- COMP->CR |= 0x04;
- }
- // Create Mask per bank for channel and sampling
- CreateIOMask(idx_bk,p_chSrc->channel);
- Bank_IO_CompMask[idx_bk] |= (uint8_t)(1 << (GPIO_to_SW_Conf[p_chSrc->channel].IO_Channel - 1));
- Bank_IO_CompMask[idx_bk] = (uint8_t)(Bank_IO_CompMask[idx_bk] << (4 * GPIO_to_SW_Conf[p_chSrc->channel].IO_Group));
- CreateSamplingMask(idx_bk,p_chSrc->sampling);
- BankSamplingCompMask[idx_bk] |= (uint8_t)(1 << (GPIO_to_SW_Conf[p_chSrc->sampling].IO_Channel - 1));
- BankSamplingCompMask[idx_bk] = (uint8_t)(BankSamplingCompMask[idx_bk] << (4 * GPIO_to_SW_Conf[p_chSrc->sampling].IO_Group));
- if ((SamplingMask[idx_bk] != (uint8_t)GPIO_to_SW_Conf[p_chSrc->sampling].IO_Channel))
- {
- return TSL_STATUS_ERROR;
- }
-#if (TSLPRM_USE_SHIELD > 0)
- Bank_IOShield_CompMask[idx_bk] |= (uint8_t)(1 << (GPIO_to_SW_Conf[p_bank->shield_channel].IO_Channel - 1));
- Bank_IOShield_CompMask[idx_bk] = (uint8_t)(Bank_IOShield_CompMask[idx_bk] << (4 * GPIO_to_SW_Conf[p_bank->shield_channel].IO_Group));
- BankSamplingShieldCompMask[idx_bk] |= (uint8_t)(1 << (GPIO_to_SW_Conf[p_bank->shield_sampling].IO_Channel - 1));
- BankSamplingShieldCompMask[idx_bk] = (uint8_t)(BankSamplingShieldCompMask[idx_bk] << (4 * GPIO_to_SW_Conf[p_bank->shield_sampling].IO_Group));
- Bank_IO_CompMask[idx_bk] = (uint8_t)(Bank_IO_CompMask[idx_bk] | Bank_IOShield_CompMask[idx_bk]);
- BankSamplingCompMask[idx_bk] = (uint8_t)(BankSamplingCompMask[idx_bk] | BankSamplingShieldCompMask[idx_bk]);
-#endif
-#endif // !defined(STM8L10X)
-
- // GPIO are configured in PP Low mode when inactive
- // GPIO in Output
- GPIO_DDR_OUT(p_chSrc->sampling);
- GPIO_DDR_OUT(p_chSrc->channel);
- // GPIO in PP
- GPIO_CR1_PP(p_chSrc->sampling);
- GPIO_CR1_PP(p_chSrc->channel);
- // Output in Low level
- GPIO_ODR_LOW(p_chSrc->sampling);
- GPIO_ODR_LOW(p_chSrc->channel);
-
- p_chSrc++; // Next channel
- }
-
-#if !defined(STM8L10X)
- // Unlock IO to RI register: IO controlled by GPIO
- RI->IOCMR1 &= (uint8_t)(~BankMask[idx_bk].ch1);
- RI->IOCMR2 &= (uint8_t)(~BankMask[idx_bk].ch2);
- RI->IOCMR3 &= (uint8_t)(~BankMask[idx_bk].ch3);
-#if defined(STM8L15X_LD)
- RI->IOCMR4 &= (uint8_t)(~BankMask[idx_bk].ch4);
-#endif // STM8L15X_LD || STM8L10X
-#endif // !defined(STM8L10X)
- }
-
- return TSL_STATUS_OK;
-}
-
-
-#if !defined(STM8L10X)
-/**
- * @brief Create Mask for all banks
- * @param[in] idx_bk Index of the Bank to configure
- * @param[in] GPIO Pin number
- * @retval None
- */
-void CreateMask(TSL_tIndex_T idx_bk, uint8_t GPIO)
-{
- switch (GPIO_to_SW_Conf[GPIO].IO_Channel)
- {
- case 1:
- BankMask[idx_bk].ch1 |= (uint8_t)(1 << GPIO_to_SW_Conf[GPIO].IO_Group); // Mask for all first channel
- break;
- case 2:
- BankMask[idx_bk].ch2 |= (uint8_t)(1 << GPIO_to_SW_Conf[GPIO].IO_Group); // Mask for all second channel
- break;
- case 3:
- BankMask[idx_bk].ch3 |= (uint8_t)(1 << GPIO_to_SW_Conf[GPIO].IO_Group); // Mask fo all third channel
- break;
-#if defined(STM8L15X_LD) || defined(STM8L10X)
- case 4:
- BankMask[idx_bk].ch4 |= (uint8_t)(1 << GPIO_to_SW_Conf[GPIO].IO_Group); // Mask for all fourth channel
- break;
-#endif // STM8L15X_LD || STM8L10X
- default:
- break;
- }
-}
-
-#else
-
-/**
- * @brief Create IO Mask for all banks
- * @param[in] idx_bk Index of the Bank to configure
- * @param[in] GPIO Pin number
- * @retval None
- */
-void CreateIOMask(TSL_tIndex_T idx_bk, uint8_t GPIO)
-{
- switch (GPIO_PORT(GPIO))
- {
- case 0:
- BankMask[idx_bk].GPIOB_IO |= (uint8_t)(1 << GPIO_BIT(GPIO));
- break;
- case 1:
- BankMask[idx_bk].GPIOD_IO |= (uint8_t)(1 << GPIO_BIT(GPIO));
- break;
- default:
- break;
- }
-}
-
-
-/**
- * @brief Create Sampling Mask for all banks
- * @param[in] idx_bk Index of the Bank to configure
- * @param[in] GPIO Pin number
- * @retval None
- */
-void CreateSamplingMask(TSL_tIndex_T idx_bk, uint8_t GPIO)
-{
- switch (GPIO_PORT(GPIO))
- {
- case 0:
- BankMask[idx_bk].GPIOB_Samp |= (uint8_t)(1 << GPIO_BIT(GPIO));
- break;
- case 1:
- BankMask[idx_bk].GPIOD_Samp |= (uint8_t)(1 << GPIO_BIT(GPIO));
- break;
- default:
- break;
- }
-}
-
-#endif // !defined(STM8L10X)
-
-
-#if (TSLPRM_USE_SPREAD_SPECTRUM > 0)
-/**
- * @brief Spread Spectrum using a variable software delay.
- * @param None
- * @retval None
- */
-INLINE void SwSpreadSpectrum(void)
-{
- uint8_t idx;
-
- SpreadCounter++;
-
- if (SpreadCounter == TSLPRM_SPREAD_MAX)
- {
- SpreadCounter = TSLPRM_SPREAD_MIN;
- }
-
- idx = SpreadCounter;
-
- while (--idx) {}
-}
-#endif
-
-
-/**
- * @brief Bank configuration
- * @param[in] idx_bk Index of the Bank to configure
- * @retval Status
- */
-TSL_Status_enum_T TSL_acq_BankConfig(TSL_tIndex_T idx_bk)
-{
- uint8_t idx_i;
-#if defined(STM8L10X)
- uint8_t GroupUsed = 0;
-#endif
- TSL_tIndex_T idx_dest;
- TSL_tIndex_T idx_ch;
- TSL_tNb_T number_of_channels = 0;
- CONST TSL_Bank_T *p_bank; // Pointer to the current bank
- CONST TSL_ChannelDest_T *p_chDest; // Pointer to the first destination channel of the current bank
- CONST TSL_ChannelSrc_T *p_chSrc; // Pointer to the fisrt source channel of the current bank
-
- // Check parameters (if USE_FULL_ASSERT is defined)
- assert_param(IS_BANK_INDEX_OK(idx_bk));
-
- p_bank = &(TSL_Globals.Bank_Array[idx_bk]);
- number_of_channels = p_bank->NbChannels;
- p_chDest = p_bank->p_chDest;
- p_chSrc = p_bank->p_chSrc;
-
- // Reset the disable mask
- DisableSampling = 0;
- for (idx_i = 0; idx_i < MAX_CHANNEL_NUMBER_BY_GROUP; idx_i++)
- {
- DisableMask[idx_i] = 0;
- }
-
- BankDone = 0;
-
-#if (TSLPRM_USE_SHIELD > 0)
- DISABLE_SAMPLING(p_bank->shield_sampling);
-#endif // TSLPRM_USE_SHIELD
-
- ChannelSampling = SamplingMask[idx_bk]; // Mask for the channel used by sampling
-
- // Loop for each channel of this bank
- for (idx_ch = 0; idx_ch < number_of_channels; idx_ch++)
- {
- idx_dest = p_chDest->IdxDest;
-#if defined(STM8L10X)
- if (p_chSrc->IdxSrc == 0)
- {
- GroupUsed |= 0x01;
- }
- if (p_chSrc->IdxSrc == 1)
- {
- GroupUsed |= 0x02;
- }
-#endif // defined(STM8L10X)
-
- // Mode Status OFF
- if (p_bank->p_chData[idx_dest].Flags.ObjStatus == TSL_OBJ_STATUS_OFF)
- {
-#if !defined(STM8L10X)
- // Update Mask if channels are disabled
- DISABLE_MASK(p_chSrc->channel);
- DISABLE_MASK(p_chSrc->sampling);
-#else
- // Update Mask if channels are disabled
- if (GPIO_to_SW_Conf[p_chSrc->channel].IO_Channel > 2)
- {
- DisableMask[2] |= (uint8_t)(1 << ((2 * GPIO_to_SW_Conf[p_chSrc->channel].IO_Group) + (GPIO_to_SW_Conf[p_chSrc->channel].IO_Channel - 3)));
- }
- else
- {
- DisableMask[0] |= (uint8_t)(1 << ((2 * GPIO_to_SW_Conf[p_chSrc->channel].IO_Group) + (GPIO_to_SW_Conf[p_chSrc->channel].IO_Channel - 1)));
- }
- if (GPIO_to_SW_Conf[p_chSrc->sampling].IO_Channel > 2)
- {
- DisableMask[3] |= (uint8_t)(1 << ((2 * GPIO_to_SW_Conf[p_chSrc->sampling].IO_Group) + (GPIO_to_SW_Conf[p_chSrc->sampling].IO_Channel - 3)));
- }
- else
- {
- DisableMask[1] |= (uint8_t)(1<<((2 * GPIO_to_SW_Conf[p_chSrc->sampling].IO_Group) + (GPIO_to_SW_Conf[p_chSrc->sampling].IO_Channel - 1)));
- }
-#endif // !defined(STM8L10X)
- }
-
- // Mode Status BURST ONLY
- if (p_bank->p_chData[idx_dest].Flags.ObjStatus == TSL_OBJ_STATUS_BURST_ONLY)
- {
-#if !defined(STM8L10X)
- DISABLE_SAMPLING(p_chSrc->sampling);
-#else
- if (p_chSrc->IdxSrc == 0)
- {
- GroupUsed &= (uint8_t)(~0x01);
- }
- if (p_chSrc->IdxSrc == 1)
- {
- GroupUsed &= (uint8_t)(~0x02);
- }
-#endif // !defined(STM8L10X)
- }
-
- tab_MeasurementCounter[GPIO_to_SW_Conf[p_chSrc->sampling].IO_Group] = 0;
-
- // Next channel
- p_chSrc++;
- p_chDest++;
- }
-
-#if !defined(STM8L10X)
- //Get Mask for the current bank
- CurrentBank[0] = (uint8_t)(BankMask[idx_bk].ch1 & (~DisableMask[0])); // Mask for all 1st channel are used by channels and sampling for this bank
- CurrentBank[1] = (uint8_t)(BankMask[idx_bk].ch2 & (~DisableMask[1])); // Mask for all 2nd channel are used by channels and sampling for this bank
- CurrentBank[2] = (uint8_t)(BankMask[idx_bk].ch3 & (~DisableMask[2])); // Mask for all 3rd channel are used by channels and sampling for this bank
-#if defined(STM8L15X_LD)
- CurrentBank[3] = (uint8_t)(BankMask[idx_bk].ch4 & (~DisableMask[3])); // Mask for all 4th channel are used by channels and sampling for this bank
-#endif // STM8L15X_LD
- CurrentChannel = ChannelMask[idx_bk]; // Mask for channels
- CurrentSampling = (uint8_t)(3 << (2 * (SamplingMask[idx_bk] - 1))); // Mask for sampling
-
- // Channel's state of the current bank
- BankDone = (uint8_t)(CurrentBank[ChannelSampling - 1] & (~DisableSampling));
-
- // Select the Input register corresponding to the channel sampling (to optimize the measurement)
- p_IOIRx = RI_IOIRx_Register[ChannelSampling - 1];
-
-#else
- //Get Mask for the current bank
- CurrentBank[0] = (uint8_t)(BankMask[idx_bk].GPIOB_IO & (~DisableMask[0]));
- CurrentBank[1] = (uint8_t)(BankMask[idx_bk].GPIOB_Samp & (~DisableMask[1]));
- CurrentBank[2] = (uint8_t)(BankMask[idx_bk].GPIOD_IO & (~DisableMask[2]));
- CurrentBank[3] = (uint8_t)(BankMask[idx_bk].GPIOD_Samp & (~DisableMask[3]));
-
- CurrentChannel = (uint8_t)(Bank_IO_CompMask[idx_bk]); // Mask for channels
- CurrentSampling = (uint8_t)(BankSamplingCompMask[idx_bk]); // Mask for sampling
-
- // Select the Input register corresponding to the channel sampling (to optimize the measurement) and update BankDone, which is the mask where there are sampling capacitors
- if (ChannelSampling > 2) // GPIOD
- {
- p_GPIOx_IDR = GPIOx_IDR[1];
- if ((GroupUsed & 0x01) == 1)
- {
- BankDone |= (uint8_t)(1 << (ChannelSampling - 3));
- }
- if((GroupUsed & 0x02) == 2)
- {
- BankDone |= (uint8_t)(1 << (2 + (ChannelSampling - 3)));
- }
-
- }
- else // GPIOB
- {
- p_GPIOx_IDR = GPIOx_IDR[0];
- if ((GroupUsed & 0x01) == 1)
- {
- BankDone |= (uint8_t)(1 << (ChannelSampling - 1));
- }
- if ((GroupUsed & 0x02) == 2)
- {
- BankDone |= (uint8_t)(1 << (2 + (ChannelSampling - 1)));
- }
- }
-
-#endif // !defined(STM8L10X)
-
- return TSL_STATUS_OK;
-}
-
-
-#if !defined(STM8L10X)
-
-/**
- * @brief Start acquisition
- * @param None
- * @retval None
- */
-void TSL_acq_BankStartAcq(void)
-{
- CONST TSL_Bank_T *p_bank = &(TSL_Globals.Bank_Array[0]);
- CONST TSL_ChannelSrc_T *p_chSrc;
- TSL_tNb_T number_of_channels = 0;
- TSL_tIndex_T idx_bk;
- TSL_tIndex_T idx_ch;
- uint8_t step3, step5, deadtime1, deadtime2; //intermediate variables to speed-up the acquisition loop
-
- uint8_t old_status = 0;
-
- ChargeTransferCounter = 0;
-
-#if (TSLPRM_IODEF > 0)
- //============================
- // All GPIOs in Input floating
- //============================
- for (idx_bk = 0; idx_bk < TSLPRM_TOTAL_BANKS; idx_bk++)
- {
- p_bank = &(TSL_Globals.Bank_Array[idx_bk]);
- p_chSrc = p_bank->p_chSrc;
-
-#if (TSLPRM_USE_SHIELD > 0)
- // GPIO in floating mode
- GPIO_CR1_FLOATING(p_bank->shield_sampling);
- GPIO_CR1_FLOATING(p_bank->shield_channel);
- // GPIO in Input
- GPIO_DDR_IN(p_bank->shield_sampling);
- GPIO_DDR_IN(p_bank->shield_channel);
-#endif // TSLPRM_USE_SHIELD
-
- number_of_channels = p_bank->NbChannels;
-
- for (idx_ch = 0;
- idx_ch < number_of_channels;
- idx_ch++)
- {
- // GPIO in floating mode
- GPIO_CR1_FLOATING(p_chSrc->sampling);
- GPIO_CR1_FLOATING(p_chSrc->channel);
- // GPIO in Input
- GPIO_DDR_IN(p_chSrc->sampling);
- GPIO_DDR_IN(p_chSrc->channel);
- p_chSrc++;
- }
- }
-#endif // TSLPRM_IODEF
-
- // Test if this bank is not empty
- if (BankDone != 0)
- {
- // Enable necessary IOs
- RI->IOCMR1 |= (uint8_t)CurrentBank[0];
- RI->IOCMR2 |= (uint8_t)CurrentBank[1];
- RI->IOCMR3 |= (uint8_t)CurrentBank[2];
-#if defined(STM8L15X_LD)
- RI->IOCMR4 |= (uint8_t)CurrentBank[3];
-#endif // STM8L15X_LD
-
- RI->IOSR1 |= (uint8_t)CurrentBank[0];
- RI->IOSR2 |= (uint8_t)CurrentBank[1];
- RI->IOSR3 |= (uint8_t)CurrentBank[2];
-#if defined(STM8L15X_LD)
- RI->IOSR4 |= (uint8_t)CurrentBank[3];
-#endif // STM8L15X_LD
-
- /* STEP1 : Discharging all capacitors
- ==> all IOs in Push-Pull LOW */
- RI->IOGCR &= (uint8_t)(~(CurrentChannel | CurrentSampling));
-
- /* STEP2: Waiting for complete discharge */
- SoftDelay(TSLPRM_DELAY_DISCHARGE_ALL);
- // Dead Time
- RI->IOGCR |= (uint8_t)(0xAA & (CurrentChannel | CurrentSampling));
-
- // Close switch sampling
- RI->IOGCR |= CurrentSampling;
-
- /* Copmpute RI->IOGCR for each step */
- /* STEP3: Charging C-Touch
- ==> Channels in Push-Pull HIGH
- ==> Sampling kept open */
- step3 = (uint8_t)(RI->IOGCR ^ CurrentChannel);
- /* Deadtime */
- deadtime1 = RI->IOGCR ; // equivalent to step3 ^ (uint8_t)CurrentChannel;
- /* STEP5: Transfering C-Touch charge in C-Sampling
- ==> Close IOs Switchs */
- step5 = (uint8_t)(RI->IOGCR | CurrentChannel);
- /* Deadtime */
- deadtime2 = (uint8_t)(step5 & (0xAA | (~CurrentChannel)));
-
- // Loop while all sampling have not reach the VIH level
- do
- {
- /* STEP3: Charging C-Touch */
- RI->IOGCR = step3;
- // Get the measurement of counter if the value of Input register change
- if ((*p_IOIRx & BankDone) != old_status)
- {
- GetCounter(p_IOIRx, &old_status);
- }
-
- /* STEP4 : Waiting for good chargement */
- __Delay_Charge();
-
-#if (TSLPRM_USE_SPREAD_SPECTRUM > 0)
- SwSpreadSpectrum();
-#endif
-
- /* Dead Time */
- RI->IOGCR = deadtime1;
- /* STEP5: Transfering C-Touch charge in C-Sampling */
- RI->IOGCR = step5;
-
- ChargeTransferCounter++;
-
- /* STEP6: Waiting for good transfer */
- __Delay_Transfer();
-
- /* Dead Time */
- RI->IOGCR = deadtime1;
- } while ((old_status != BankDone) && (ChargeTransferCounter <= TSL_Params.AcqMax));
-
- // Get the value of counter if he reach the Max count
- if(ChargeTransferCounter > TSL_Params.AcqMax)
- {
- GetCounter(&BankDone, &old_status);
- }
-
- // Disable necessary IOs
- RI->IOSR1 &= (uint8_t)(~(CurrentBank[0]));
- RI->IOSR2 &= (uint8_t)(~(CurrentBank[1]));
- RI->IOSR3 &= (uint8_t)(~(CurrentBank[2]));
-#if defined(STM8L15X_LD)
- RI->IOSR4 &= (uint8_t)(~(CurrentBank[3]));
-#endif
-
- RI->IOCMR1 &= (uint8_t)(~(CurrentBank[0]));
- RI->IOCMR2 &= (uint8_t)(~(CurrentBank[1]));
- RI->IOCMR3 &= (uint8_t)(~(CurrentBank[2]));
-#if defined(STM8L15X_LD)
- RI->IOCMR4 &= (uint8_t)(~(CurrentBank[3]));
-#endif
-
- //====================
- // All GPIOs in PP Low
- //====================
- for (idx_bk = 0; idx_bk < TSLPRM_TOTAL_BANKS;idx_bk++)
- {
- p_bank = &(TSL_Globals.Bank_Array[idx_bk]);
- p_chSrc = p_bank->p_chSrc;
-
-#if (TSLPRM_USE_SHIELD > 0)
- // Output in Low level
- GPIO_ODR_LOW(p_bank->shield_sampling);
- GPIO_ODR_LOW(p_bank->shield_channel);
- // GPIO in Output
- GPIO_DDR_OUT(p_bank->shield_sampling);
- GPIO_DDR_OUT(p_bank->shield_channel);
- // GPIO in PP
- GPIO_CR1_PP(p_bank->shield_sampling);
- GPIO_CR1_PP(p_bank->shield_channel);
-#endif // TSLPRM_USE_SHIELD
-
- number_of_channels = p_bank->NbChannels;
-
- for (idx_ch = 0;
- idx_ch < number_of_channels;
- idx_ch++)
- {
- // Output in Low level
- GPIO_ODR_LOW(p_chSrc->sampling);
- GPIO_ODR_LOW(p_chSrc->channel);
- // GPIO in Output
- GPIO_DDR_OUT(p_chSrc->sampling);
- GPIO_DDR_OUT(p_chSrc->channel);
- // GPIO in PP
- GPIO_CR1_PP(p_chSrc->sampling);
- GPIO_CR1_PP(p_chSrc->channel);
- p_chSrc++;
- }
- }
-
- }
-}
-
-#else // STM8L10X
-
-/**
- * @brief Start acquisition
- * @param None
- * @retval None
- */
-void TSL_acq_BankStartAcq(void)
-{
- CONST TSL_Bank_T *p_bank = &(TSL_Globals.Bank_Array[0]);
- CONST TSL_ChannelSrc_T *p_chSrc;
- TSL_tNb_T number_of_channels = 0;
- TSL_tIndex_T idx_bk;
- TSL_tIndex_T idx_ch;
-
- uint8_t old_status = 0;
-
- ChargeTransferCounter = 0;
-
-#if (TSLPRM_IODEF > 0)
- //============================
- // All GPIOs in Input floating
- //============================
- for (idx_bk = 0; idx_bk < TSLPRM_TOTAL_BANKS; idx_bk++)
- {
- p_bank = &(TSL_Globals.Bank_Array[idx_bk]);
- p_chSrc = p_bank->p_chSrc;
-
-#if (TSLPRM_USE_SHIELD > 0)
- // GPIO in floating mode
- GPIO_CR1_FLOATING(p_bank->shield_sampling);
- GPIO_CR1_FLOATING(p_bank->shield_channel);
- // GPIO in Input
- GPIO_DDR_IN(p_bank->shield_sampling);
- GPIO_DDR_IN(p_bank->shield_channel);
-#endif
-
- number_of_channels = p_bank->NbChannels;
-
- for (idx_ch = 0;
- idx_ch < number_of_channels;
- idx_ch++)
- {
- // GPIO in floating mode
- GPIO_CR1_FLOATING(p_chSrc->sampling);
- GPIO_CR1_FLOATING(p_chSrc->channel);
- // GPIO in Input
- GPIO_DDR_IN(p_chSrc->sampling);
- GPIO_DDR_IN(p_chSrc->channel);
-
- p_chSrc++;
- }
- }
-#endif // TSLPRM_IODEF
-
- // Test if this bank is not empty
- if (BankDone != 0)
- {
-
-#ifdef TSLPRM_PROTECT_IO_ACCESS
- disableInterrupts();
-#endif //TSLPRM_PROTECT_IO_ACCESS
-
- /* STEP1 : Discharging all capacitors
- ==> all IOs in open-drain LOW */
- GPIOB->ODR &= (uint8_t)(~(CurrentBank[0] | CurrentBank[1]));
- GPIOB->CR1 &= (uint8_t)(~(CurrentBank[0] | CurrentBank[1]));
- GPIOB->DDR |= (uint8_t)(CurrentBank[0] | CurrentBank[1]);
- GPIOD->ODR &= (uint8_t)(~(CurrentBank[2] | CurrentBank[3]));
- GPIOD->CR1 &= (uint8_t)(~(CurrentBank[2] | CurrentBank[3]));
- GPIOD->DDR |= (uint8_t)(CurrentBank[2] | CurrentBank[3]);
-
-#ifdef TSLPRM_PROTECT_IO_ACCESS
- enableInterrupts();
-#endif // TSLPRM_PROTECT_IO_ACCESS
-
- COMP->CCS &= (uint8_t)(~(CurrentSampling |CurrentChannel));
-
- /* STEP2: Waiting for complete discharge */
- SoftDelay(TSLPRM_DELAY_DISCHARGE_ALL);
-
-#ifdef TSLPRM_PROTECT_IO_ACCESS
- disableInterrupts();
-#endif // TSLPRM_PROTECT_IO_ACCESS
-
- // Dead Time
- GPIOB->DDR &= (uint8_t)(~(CurrentBank[0] | CurrentBank[1]));
- GPIOD->DDR &= (uint8_t)(~(CurrentBank[2] | CurrentBank[3]));
-
-#ifdef TSLPRM_PROTECT_IO_ACCESS
- enableInterrupts();
-#endif // TSLPRM_PROTECT_IO_ACCESS
-
- GPIOB->ODR |= (uint8_t)(CurrentBank[0]);
- GPIOD->ODR |= (uint8_t)(CurrentBank[2]);
-
- // Loop while all sampling have not reach the VIH level
- do
- {
-
-#ifdef TSLPRM_PROTECT_IO_ACCESS
- disableInterrupts();
-#endif // TSLPRM_PROTECT_IO_ACCESS
-
- /* STEP3: Charging C-Touch
- ==> Channels in Push-Pull HIGH
- ==> Sampling kept open */
- GPIOB->DDR |= (uint8_t)(CurrentBank[0]);
- GPIOB->CR1 |= (uint8_t)(CurrentBank[0]);
- GPIOD->DDR |= (uint8_t)(CurrentBank[2]);
- GPIOD->CR1 |= (uint8_t)(CurrentBank[2]);
-
-#ifdef TSLPRM_PROTECT_IO_ACCESS
- enableInterrupts();
-#endif // TSLPRM_PROTECT_IO_ACCESS
-
- /* STEP4 : Waiting for good chargement */
- __Delay_Charge();
-
-#if (TSLPRM_USE_SPREAD_SPECTRUM > 0)
- SwSpreadSpectrum();
-#endif
-
-#ifdef TSLPRM_PROTECT_IO_ACCESS
- disableInterrupts();
-#endif // TSLPRM_PROTECT_IO_ACCESS
-
- // Dead Time
- GPIOB->CR1 &= (uint8_t)(~(CurrentBank[0]));
- GPIOB->DDR &= (uint8_t)(~(CurrentBank[0]));
- GPIOD->CR1 &= (uint8_t)(~(CurrentBank[2]));
- GPIOD->DDR &= (uint8_t)(~(CurrentBank[2]));
-
-#ifdef TSLPRM_PROTECT_IO_ACCESS
- enableInterrupts();
-#endif // TSLPRM_PROTECT_IO_ACCESS
-
- /* STEP5: Transfering C-Touch charge in C-Sampling
- ==> Close IOs Switchs */
-
- // Close switch sampling
- COMP->CCS |= (uint8_t)CurrentSampling;
- COMP->CCS |= (uint8_t)CurrentChannel;
-
- /* STEP6: Waiting for good transfer */
- __Delay_Transfer();
-
- //Dead Time
- COMP->CCS &= (uint8_t)(~(CurrentChannel | CurrentSampling));
-
-#ifdef TSLPRM_PROTECT_IO_ACCESS
- disableInterrupts();
-#endif // TSLPRM_PROTECT_IO_ACCESS
-
- // Get the measurement of counter if the value of Input register change
- if ((*p_GPIOx_IDR & BankDone) != old_status)
- {
- GetCounter(p_GPIOx_IDR, &old_status);
- }
-
-#ifdef TSLPRM_PROTECT_IO_ACCESS
- enableInterrupts();
-#endif // TSLPRM_PROTECT_IO_ACCESS
-
- ChargeTransferCounter++;
-
- } while ((old_status != BankDone) && (ChargeTransferCounter != (TSL_Params.AcqMax+1)));
-
- // Get the value of counter if he reach the Max count
- if(ChargeTransferCounter == (TSL_Params.AcqMax+1))
- {
- GetCounter(&BankDone, &old_status);
- }
-
- //====================
- // All GPIOs in PP Low
- //====================
- for (idx_bk = 0; idx_bk < TSLPRM_TOTAL_BANKS;idx_bk++)
- {
- p_bank = &(TSL_Globals.Bank_Array[idx_bk]);
- p_chSrc = p_bank->p_chSrc;
-
-#if (TSLPRM_USE_SHIELD > 0)
- // Output in Low level
- GPIO_ODR_LOW(p_bank->shield_sampling);
- GPIO_ODR_LOW(p_bank->shield_channel);
- // GPIO in Output
- GPIO_DDR_OUT(p_bank->shield_sampling);
- GPIO_DDR_OUT(p_bank->shield_channel);
- // GPIO in PP
- GPIO_CR1_PP(p_bank->shield_sampling);
- GPIO_CR1_PP(p_bank->shield_channel);
-#endif // TSLPRM_USE_SHIELD
-
- number_of_channels = p_bank->NbChannels;
-
- for (idx_ch = 0;
- idx_ch < number_of_channels;
- idx_ch++)
- {
- // Output in Low level
- GPIO_ODR_LOW(p_chSrc->sampling);
- GPIO_ODR_LOW(p_chSrc->channel);
- // GPIO in Output
- GPIO_DDR_OUT(p_chSrc->sampling);
- GPIO_DDR_OUT(p_chSrc->channel);
- // GPIO in PP
- GPIO_CR1_PP(p_chSrc->sampling);
- GPIO_CR1_PP(p_chSrc->channel);
- p_chSrc++;
- }
- }
-
- }
-}
-
-#endif
-
-
-/**
- * @brief Do the measurement
- * @param *p_reg Pointer to the Input register
- * @param *p_old_status Pointer to the previous status value
- * @retval None
- */
-
-void GetCounter(__IO uint8_t *p_reg, uint8_t *p_old_status)
-{
-
- uint8_t new_status = 0;
- uint8_t idx_i = 0;
- uint8_t mask_i = 1;
-#if defined(STM8L10X)
- uint8_t idx_j = 4;
- uint8_t idx_group = 0;
-#else
- uint8_t idx_j = 8;
-#endif // defined(STM8L10X)
-
- new_status = *p_reg;
- new_status = (uint8_t)(new_status & BankDone & (~(*p_old_status)));
-
- while ((new_status != 0) && (idx_i < idx_j))
- {
- if ((new_status & mask_i) != 0)
- {
-#if defined(STM8L10X)
- tab_MeasurementCounter[idx_group]= ChargeTransferCounter;
-#else
- tab_MeasurementCounter[idx_i] = ChargeTransferCounter;
-#endif // defined(STM8L10X)
- *p_old_status |= mask_i;
- new_status &= (uint8_t)(~mask_i);
- }
- idx_i++;
- mask_i <<= 1;
-#if defined(STM8L10X)
- if (idx_i > 1)
- {
- idx_group = 1;
- }
-#endif // defined(STM8L10X)
- }
-}
-
-
-/**
- * @brief Wait end of acquisition
- * @param None
- * @retval status
- */
-TSL_Status_enum_T TSL_acq_BankWaitEOC(void)
-{
- return TSL_STATUS_OK;
-}
-
-
-/**
- * @brief Return the current measure
- * @param[in] index Index of the measure source
- * @retval Measure
- */
-TSL_tMeas_T TSL_acq_GetMeas(TSL_tIndex_T index)
-{
- return(tab_MeasurementCounter[index]);
-}
-
-
-/**
- * @brief Check noise (not used)
- * @param None
- * @retval Status
- */
-TSL_AcqStatus_enum_T TSL_acq_CheckNoise(void)
-{
- return TSL_ACQ_STATUS_OK;
-}
-
-
-/**
- * @brief Check if a filter must be used on the current channel (not used)
- * @param[in] pCh Pointer on the channel data information
- * @retval Result TRUE if a filter can be applied
- */
-TSL_Bool_enum_T TSL_acq_UseFilter(TSL_ChannelData_T *pCh)
-{
- return TSL_TRUE;
-}
-
-
-/**
- * @brief Compute the Delta value
- * @param[in] ref Reference value
- * @param[in] meas Last Measurement value
- * @retval Delta value
- */
-TSL_tDelta_T TSL_acq_ComputeDelta(TSL_tRef_T ref, TSL_tMeas_T meas)
-{
- return((TSL_tDelta_T)(ref - meas));
-}
-
-
-/**
- * @brief Compute the Measurement value
- * @param[in] ref Reference value
- * @param[in] delta Delta value
- * @retval Measurement value
- */
-TSL_tMeas_T TSL_acq_ComputeMeas(TSL_tRef_T ref, TSL_tDelta_T delta)
-{
- return((TSL_tMeas_T)(ref - delta));
-}
-
-
-/**
- * @brief Test if the Reference is incorrect (not used)
- * @param[in] pCh Pointer on the channel data information
- * @retval Result TRUE if the Reference is out of range
- */
-TSL_Bool_enum_T TSL_acq_TestReferenceOutOfRange(TSL_ChannelData_T *pCh)
-{
- return TSL_FALSE;
-}
-
-
-/**
- * @brief Test if the measure has crossed the reference target (not used)
- * @param[in] pCh Pointer on the channel data information
- * @param[in] new_meas Measure of the last acquisition on this channel
- * @retval Result TRUE if the Reference is valid
- */
-TSL_Bool_enum_T TSL_acq_TestFirstReferenceIsValid(TSL_ChannelData_T *pCh, TSL_tMeas_T new_meas)
-{
- return TSL_TRUE;
-}
-
-
-#if defined(__ICCSTM8__)
-#pragma optimize=low
-#endif
-/**
- * @brief Software delay (private routine)
- * @param val Wait delay
- * @retval None
- */
-void SoftDelay(uint16_t val)
-{
- uint16_t idx;
- for (idx = val; idx > 0; idx--)
- {
- nop();
- }
-}
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/