/* ---------------------------------------------------------------------------- */ /* 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 acc_module Working with ACC * \ingroup peripherals_module * The ACC driver provides the interface to configure and use the ACC * peripheral.\n * * It applies comparison on two inputs and gives a compare output. * * To Enable a ACC Comparison,the user has to follow these few steps: * * * For more accurate information, please look at the ACC section of the * Datasheet. * * Related files :\n * \ref acc.c\n * \ref acc.h\n */ /*@{*/ /*@}*/ /** * \file * * Implementation of Analog Comparator Controller (ACC). * */ /*---------------------------------------------------------------------------- * Headers *----------------------------------------------------------------------------*/ #include "chip.h" #include "acc.h" /*---------------------------------------------------------------------------- * Exported functions *----------------------------------------------------------------------------*/ /** * \brief Initialize the ACC controller * * \param pAcc Pointer to an Acc instance. * \param idAcc ACC identifier * \param ucSelplus input connected to inp, 0~7 * \param ucSelminus input connected to inm,0~7 * \param wAc_en Analog comparator enabled/disabled * \param wEdge CF flag triggering mode * \param wInvert INVert comparator output,use pattern defined in the device * header file */ extern void ACC_Configure(Acc *pAcc, uint8_t idAcc, uint8_t ucSelplus, uint8_t ucSelminus, uint16_t wAc_en, uint16_t wEdge, uint16_t wInvert) { /* Enable peripheral clock*/ PMC->PMC_PCER1 = 1 << (idAcc - 32); /* Reset the controller */ pAcc->ACC_CR |= ACC_CR_SWRST; /* Write to the MR register */ ACC_CfgModeReg(pAcc, ((ucSelplus << ACC_MR_SELPLUS_Pos) & ACC_MR_SELPLUS_Msk) | ((ucSelminus << ACC_MR_SELMINUS_Pos) & ACC_MR_SELMINUS_Msk) | ((wAc_en << 8) & ACC_MR_ACEN) | ((wEdge << ACC_MR_EDGETYP_Pos) & ACC_MR_EDGETYP_Msk) | ((wInvert << 12) & ACC_MR_INV)); /* set hysteresis and current option*/ pAcc->ACC_ACR = (ACC_ACR_ISEL_HISP | ((0x01 << ACC_ACR_HYST_Pos) & ACC_ACR_HYST_Msk)); /* Automatic Output Masking Period*/ while (pAcc->ACC_ISR & (uint32_t)ACC_ISR_MASK); } /** * Return the Channel Converted Data * \param pAcc Pointer to an Acc instance. * \param ucSelplus input applied on ACC SELPLUS * \param ucSelminus input applied on ACC SELMINUS */ extern void ACC_SetComparisonPair(Acc *pAcc, uint8_t ucSelplus, uint8_t ucSelminus) { uint32_t dwTemp; assert(ucSelplus < 8 && ucSelminus < 8); dwTemp = pAcc->ACC_MR; pAcc->ACC_MR = dwTemp & (uint32_t) ((~ACC_MR_SELMINUS_Msk) & (~ACC_MR_SELPLUS_Msk)); pAcc->ACC_MR |= (((ucSelplus << ACC_MR_SELPLUS_Pos) & ACC_MR_SELPLUS_Msk) | ((ucSelminus << ACC_MR_SELMINUS_Pos) & ACC_MR_SELMINUS_Msk)); } /** * Return Comparison Result * \param pAcc Pointer to an Acc instance. * \param dwStatus value of ACC_ISR */ extern uint32_t ACC_GetComparisonResult(Acc *pAcc, uint32_t dwStatus) { uint32_t dwTemp = pAcc->ACC_MR; if ((dwTemp & ACC_MR_INV) == ACC_MR_INV) { if (dwStatus & ACC_ISR_SCO) { return 0; /* inn>inp*/ } else { return 1;/* inp>inn*/ } } else { if (dwStatus & ACC_ISR_SCO) { return 1; /* inp>inn*/ } else { return 0;/* inn>inp*/ } } }