diff options
Diffstat (limited to 'c/src/lib/libbsp/arm/atsam/libraries/libchip/source/afec.c')
-rw-r--r-- | c/src/lib/libbsp/arm/atsam/libraries/libchip/source/afec.c | 458 |
1 files changed, 0 insertions, 458 deletions
diff --git a/c/src/lib/libbsp/arm/atsam/libraries/libchip/source/afec.c b/c/src/lib/libbsp/arm/atsam/libraries/libchip/source/afec.c deleted file mode 100644 index d81d739a9f..0000000000 --- a/c/src/lib/libbsp/arm/atsam/libraries/libchip/source/afec.c +++ /dev/null @@ -1,458 +0,0 @@ -/* ---------------------------------------------------------------------------- */ -/* Atmel Microcontroller Software Support */ -/* SAM Software Package License */ -/* ---------------------------------------------------------------------------- */ -/* Copyright (c) 2015, Atmel Corporation */ -/* */ -/* All rights reserved. */ -/* */ -/* Redistribution and use in source and binary forms, with or without */ -/* modification, are permitted provided that the following condition is met: */ -/* */ -/* - Redistributions of source code must retain the above copyright notice, */ -/* this list of conditions and the disclaimer below. */ -/* */ -/* Atmel's name may not be used to endorse or promote products derived from */ -/* this software without specific prior written permission. */ -/* */ -/* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR */ -/* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE */ -/* DISCLAIMED. IN NO EVENT SHALL ATMEL 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. */ -/* ---------------------------------------------------------------------------- */ - -/** \addtogroup AFEC_module Working with AFE - * \ingroup peripherals_module - * The AFE driver provides the interface to configure and use the AFE peripheral. - * \n - * - * It converts the analog input to digital format. The converted result could be - * 12bit or 10bit. The AFE supports up to 16 analog lines. - * - * To Enable a AFE conversion,the user has to follow these few steps: - * <ul> - * <li> Select an appropriate reference voltage on ADVREF </li> - * <li> Configure the AFE according to its requirements and special needs,which - * could be broken down into several parts: - * -# Select the resolution by setting or clearing AFEC_MR_LOWRES bit in - * AFEC_MR (Mode Register) - * -# Set AFE clock by setting AFEC_MR_PRESCAL bits in AFEC_MR, the clock is - * calculated with AFEClock = MCK / ((PRESCAL+1) * 2) - * -# Set Startup Time,Tracking Clock cycles and Transfer Clock respectively - * in AFEC_MR. - </li> - * <li> Start conversion by setting AFEC_CR_START in AFEC_CR. </li> - * </ul> - * - * For more accurate information, please look at the AFE section of the - * Datasheet. - * - * Related files :\n - * \ref afec.c\n - * \ref afec.h\n - * \ref afe_dma.c\n - * \ref afe_dma.h\n - */ -/*@{*/ -/*@}*/ -/** - * \file - * - * Implementation of Analog-to-Digital Converter (AFE). - * - */ -/*---------------------------------------------------------------------------- - * Headers - *----------------------------------------------------------------------------*/ - -#include "chip.h" - - -/*---------------------------------------------------------------------------- - * Local variables - *----------------------------------------------------------------------------*/ - -/** Current working clock */ -static uint32_t dwAFEClock = 0; - -/*---------------------------------------------------------------------------- - * Exported functions - *----------------------------------------------------------------------------*/ - -/** - * \brief Initialize the AFE controller - * - * \param pAFE Pointer to an AFE instance. - * \param dwID AFE Index - */ -extern void AFEC_Initialize(Afec *pAFE, uint32_t dwID) -{ - /* Enable peripheral clock*/ - PMC_EnablePeripheral(dwID); - - /* Reset the controller */ - pAFE->AFEC_CR = AFEC_CR_SWRST; - - /* Reset Mode Register */ - pAFE->AFEC_MR = 0; -} - -/** - * \brief Set AFE clock. - * - * \param pAFE Pointer to an AFE instance. - * \param dwPres prescale value - * \param dwMck Board MCK (Hz) - * - * \return AFE clock - */ - -extern uint32_t AFEC_SetClock(Afec *pAFE, uint32_t dwClk, uint32_t dwMck) -{ - uint32_t dwPres, dwMr; - /* Formula for PRESCAL is: - PRESCAL = peripheral clock/ fAFE Clock - 1 */ - - dwPres = (dwMck) / (dwClk) - 1; - dwMr = AFEC_MR_PRESCAL(dwPres); - - if (dwMr == 0) return 0; - - dwMr |= (pAFE->AFEC_MR & ~AFEC_MR_PRESCAL_Msk); - pAFE->AFEC_MR = dwMr; - dwAFEClock = dwMck / (dwPres + 1); - return dwAFEClock; -} - -/** - * \brief Set AFE timing. - * - * \param pAFE Pointer to an AFE instance. - * \param dwStartup startup value - * \param dwTracking tracking value - * \param dwSettling settling value - */ -extern void AFEC_SetTiming(Afec *pAFE, uint32_t dwStartup, uint32_t dwTracking, - uint32_t dwSettling) -{ - uint32_t dwMr; - - dwMr = pAFE->AFEC_MR; - dwMr &= (~AFEC_MR_STARTUP_Msk) & (~AFEC_MR_TRACKTIM_Msk) & - (~AFEC_MR_SETTLING_Msk); - - /* Formula: - * Startup Time = startup value / AFEClock - * Transfer Time = (TRANSFER * 2 + 3) / AFEClock - * Tracking Time = (TRACKTIM + 1) / AFEClock - * Settling Time = settling value / AFEClock - */ - dwMr |= dwStartup | dwTracking | dwSettling; - pAFE->AFEC_MR |= dwMr; -} - -/** - * \brief Set AFE trigger. - * - * \param pAFE Pointer to an AFE instance. - * \param dwTrgSel Trigger selection - */ -extern void AFEC_SetTrigger(Afec *pAFE, uint32_t dwTrgSel) -{ - uint32_t dwMr; - - dwMr = pAFE->AFEC_MR; - dwMr &= ~AFEC_MR_TRGSEL_Msk; - dwMr |= dwTrgSel; - pAFE->AFEC_MR |= dwMr; -} - - -/** - * \brief Enable/Disable sleep mode. - * - * \param pAFE Pointer to an AFE instance. - * \param bEnDis Enable/Disable sleep mode. - */ -extern void AFEC_SetSleepMode(Afec *pAFE, uint8_t bEnDis) -{ - if (bEnDis) - pAFE->AFEC_MR |= AFEC_MR_SLEEP; - else - pAFE->AFEC_MR &= ~AFEC_MR_SLEEP; -} - -/** - * \brief Enable/Disable fast wake up. - * - * \param pAFE Pointer to an AFE instance. - * \param bEnDis Enable/Disable fast wake up in sleep mode. - */ -extern void AFEC_SetFastWakeup(Afec *pAFE, uint8_t bEnDis) -{ - if (bEnDis) - pAFE->AFEC_MR |= AFEC_MR_FWUP; - else - pAFE->AFEC_MR &= ~AFEC_MR_FWUP; -} - -/** - * \brief Enable/Disable sequence mode. - * - * \param pAFE Pointer to an AFE instance. - * \param bEnDis Enable/Disable sequence mode. - */ -extern void AFEC_SetSequenceMode(Afec *pAFE, uint8_t bEnDis) -{ - if (bEnDis) { - /* User Sequence Mode: The sequence respects what is defined in - AFEC_SEQR1 and AFEC_SEQR2 */ - pAFE->AFEC_MR |= AFEC_MR_USEQ; - } else { - /* Normal Mode: The controller converts channels in a simple - numeric order. */ - pAFE->AFEC_MR &= ~AFEC_MR_USEQ; - } -} - -/** - * \brief Set channel sequence. - * - * \param pAFE Pointer to an AFE instance. - * \param dwSEQ1 Sequence 1 ~ 8 channel number. - * \param dwSEQ2 Sequence 9 ~ 16 channel number. - */ -extern void AFEC_SetSequence(Afec *pAFE, uint32_t dwSEQ1, uint32_t dwSEQ2) -{ - pAFE->AFEC_SEQ1R = dwSEQ1; - pAFE->AFEC_SEQ2R = dwSEQ2; -} - -/** - * \brief Set channel sequence by given channel list. - * - * \param pAFE Pointer to an AFE instance. - * \param ucChList Channel list. - * \param ucNumCh Number of channels in list. - */ -extern void AFEC_SetSequenceByList(Afec *pAFE, uint8_t ucChList[], - uint8_t ucNumCh) -{ - uint8_t i; - uint8_t ucShift; - - pAFE->AFEC_SEQ1R = 0; - - for (i = 0, ucShift = 0; i < 8; i ++, ucShift += 4) { - if (i >= ucNumCh) return; - - pAFE->AFEC_SEQ1R |= ucChList[i] << ucShift; - - } - - pAFE->AFEC_SEQ2R = 0; - - for (ucShift = 0; i < 16; i ++, ucShift += 4) { - if (i >= ucNumCh) return; - - pAFE->AFEC_SEQ2R |= ucChList[i] << ucShift; - } -} - -/** - * \brief Set analog change. - * IF enabled, it allows different analog settings for each channel, - * otherwise, DIFF0, GAIN0 and OFF0 are used for all channels. - * - * \param pAFE Pointer to an AFE instance. - * \param bEnDis Enable/Disable. - */ -extern void AFEC_SetAnalogChange(Afec *pAFE, uint8_t bEnDis) -{ - if (bEnDis) - pAFE->AFEC_MR |= AFEC_MR_ONE; - else - pAFE->AFEC_MR &= ~AFEC_MR_ONE; -} - -/** - * \brief Set "TAG" mode, show channel number in last data or not. - * - * \param pAFE Pointer to an AFE instance. - * \param bEnDis Enable/Disable TAG value. - */ -extern void AFEC_SetTagEnable(Afec *pAFE, uint8_t bEnDis) -{ - if (bEnDis) - pAFE->AFEC_EMR |= AFEC_EMR_TAG; - else - pAFE->AFEC_EMR &= ~AFEC_EMR_TAG; -} - -/** - * \brief Set compare channel. - * - * \param pAFE Pointer to an AFE instance. - * \param dwChannel channel number to be set,16 for all channels - */ -extern void AFEC_SetCompareChannel(Afec *pAFE, uint32_t dwChannel) -{ - assert(dwChannel <= 16); - - if (dwChannel < 16) { - pAFE->AFEC_EMR &= ~(AFEC_EMR_CMPALL); - pAFE->AFEC_EMR &= ~(AFEC_EMR_CMPSEL_Msk); - pAFE->AFEC_EMR |= (dwChannel << AFEC_EMR_CMPSEL_Pos); - } else - pAFE->AFEC_EMR |= AFEC_EMR_CMPALL; -} - -/** - * \brief Set compare mode. - * - * \param pAFE Pointer to an AFE instance. - * \param dwMode compare mode - */ -extern void AFEC_SetCompareMode(Afec *pAFE, uint32_t dwMode) -{ - pAFE->AFEC_EMR &= ~(AFEC_EMR_CMPMODE_Msk); - pAFE->AFEC_EMR |= (dwMode & AFEC_EMR_CMPMODE_Msk); -} - -/** - * \brief Set comparison window. - * - * \param pAFE Pointer to an AFE instance. - * \param dwHi_Lo Comparison Window - */ -extern void AFEC_SetComparisonWindow(Afec *pAFE, uint32_t dwHi_Lo) -{ - pAFE->AFEC_CWR = dwHi_Lo; -} - -/** - * \brief Return the Channel Converted Data - * - * \param pAFE Pointer to an AFE instance. - * \param dwChannel channel to get converted value - */ -extern uint32_t AFEC_GetConvertedData(Afec *pAFE, uint32_t dwChannel) -{ - uint32_t dwData = 0; - assert(dwChannel < 12); - pAFE->AFEC_CSELR = dwChannel; - dwData = pAFE->AFEC_CDR; - - return dwData; -} - - -/** - * Sets the AFE startup time. - * \param pAFE Pointer to an AFE instance. - * \param dwUs Startup time in uS. - */ -void AFEC_SetStartupTime(Afec *pAFE, uint32_t dwUs) -{ - uint32_t dwStart; - uint32_t dwMr; - - if (dwAFEClock == 0) return; - - /* Formula for STARTUP is: - STARTUP = (time x AFECLK) / (1000000) - 1 - Division multiplied by 10 for higher precision */ - - dwStart = (dwUs * dwAFEClock) / (100000); - - if (dwStart % 10) dwStart /= 10; - else { - dwStart /= 10; - - if (dwStart) dwStart --; - } - - if (dwStart > 896) dwMr = AFEC_MR_STARTUP_SUT960; - else if (dwStart > 832) dwMr = AFEC_MR_STARTUP_SUT896; - else if (dwStart > 768) dwMr = AFEC_MR_STARTUP_SUT832; - else if (dwStart > 704) dwMr = AFEC_MR_STARTUP_SUT768; - else if (dwStart > 640) dwMr = AFEC_MR_STARTUP_SUT704; - else if (dwStart > 576) dwMr = AFEC_MR_STARTUP_SUT640; - else if (dwStart > 512) dwMr = AFEC_MR_STARTUP_SUT576; - else if (dwStart > 112) dwMr = AFEC_MR_STARTUP_SUT512; - else if (dwStart > 96) dwMr = AFEC_MR_STARTUP_SUT112; - else if (dwStart > 80) dwMr = AFEC_MR_STARTUP_SUT96; - else if (dwStart > 64) dwMr = AFEC_MR_STARTUP_SUT80; - else if (dwStart > 24) dwMr = AFEC_MR_STARTUP_SUT64; - else if (dwStart > 16) dwMr = AFEC_MR_STARTUP_SUT24; - else if (dwStart > 8) dwMr = AFEC_MR_STARTUP_SUT16; - else if (dwStart > 0) dwMr = AFEC_MR_STARTUP_SUT8; - else dwMr = AFEC_MR_STARTUP_SUT0; - - dwMr |= pAFE->AFEC_MR & ~AFEC_MR_STARTUP_Msk; - pAFE->AFEC_MR = dwMr; -} - - -/** - * Set AFE tracking time - * \param pAFE Pointer to an AFE instance. - * \param dwNs Tracking time in nS. - */ -void AFEC_SetTrackingTime(Afec *pAFE, uint32_t dwNs) -{ - uint32_t dwShtim; - uint32_t dwMr; - - if (dwAFEClock == 0) return; - - /* Formula for SHTIM is: - SHTIM = (time x AFECLK) / (1000000000) - 1 - Since 1 billion is close to the maximum value for an integer, we first - divide AFECLK by 1000 to avoid an overflow */ - dwShtim = (dwNs * (dwAFEClock / 1000)) / 100000; - - if (dwShtim % 10) dwShtim /= 10; - else { - dwShtim /= 10; - - if (dwShtim) dwShtim --; - } - - dwMr = AFEC_MR_TRACKTIM(dwShtim); - dwMr |= pAFE->AFEC_MR & ~AFEC_MR_TRACKTIM_Msk; - pAFE->AFEC_MR = dwMr; -} - -/** - * \brief Set analog offset to be used for channel CSEL. - * - * \param afec Base address of the AFEC. - * \param dwChannel AFEC channel number. - * \param aoffset Analog offset value. - */ -void AFEC_SetAnalogOffset(Afec *pAFE, uint32_t dwChannel, uint32_t aoffset) -{ - assert(dwChannel < 12); - pAFE->AFEC_CSELR = dwChannel; - pAFE->AFEC_COCR = (aoffset & AFEC_COCR_AOFF_Msk);; -} - -/** - * \brief Set analog offset to be used for channel CSEL. - * - * \param afec Base address of the AFEC. - * \param control Analog control value. - */ -void AFEC_SetAnalogControl(Afec *pAFE, uint32_t control) -{ - pAFE->AFEC_ACR = control; -} - - |