291 lines
8.7 KiB
C
291 lines
8.7 KiB
C
/*
|
|
* @brief LPC15xx D/A conversion driver
|
|
*
|
|
* @note
|
|
* Copyright(C) NXP Semiconductors, 2014
|
|
* All rights reserved.
|
|
*
|
|
* @par
|
|
* Software that is described herein is for illustrative purposes only
|
|
* which provides customers with programming information regarding the
|
|
* LPC products. This software is supplied "AS IS" without any warranties of
|
|
* any kind, and NXP Semiconductors and its licensor disclaim any and
|
|
* all warranties, express or implied, including all implied warranties of
|
|
* merchantability, fitness for a particular purpose and non-infringement of
|
|
* intellectual property rights. NXP Semiconductors assumes no responsibility
|
|
* or liability for the use of the software, conveys no license or rights under any
|
|
* patent, copyright, mask work right, or any other intellectual property rights in
|
|
* or to any products. NXP Semiconductors reserves the right to make changes
|
|
* in the software without notification. NXP Semiconductors also makes no
|
|
* representation or warranty that such application will be suitable for the
|
|
* specified use without further testing or modification.
|
|
*
|
|
* @par
|
|
* Permission to use, copy, modify, and distribute this software and its
|
|
* documentation is hereby granted, under NXP Semiconductors' and its
|
|
* licensor's relevant copyrights in the software, without fee, provided that it
|
|
* is used in conjunction with NXP Semiconductors microcontrollers. This
|
|
* copyright, permission, and disclaimer notice must appear in all copies of
|
|
* this code.
|
|
*/
|
|
|
|
#ifndef __DAC_15XX_H_
|
|
#define __DAC_15XX_H_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/** @defgroup DAC_15XX CHIP: LPC15xx D/A conversion driver
|
|
* @ingroup CHIP_15XX_Drivers
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* @brief DAC register block structure
|
|
*/
|
|
typedef struct { /*!< DAC Structure */
|
|
__IO uint32_t VAL; /*!< DAC register. Holds the conversion data */
|
|
__IO uint32_t CTRL; /*!< DAC control register */
|
|
__IO uint32_t CNTVAL; /*!< DAC counter value register */
|
|
} LPC_DAC_T;
|
|
|
|
/** After this field is written with a
|
|
new VALUE, the voltage on the AOUT pin (with respect to VSSA)
|
|
is VALUE*((VREFP_DAC - VREFN)/4095) + VREFN */
|
|
#define DAC_VALUE(n) ((uint32_t) ((n & 0x0FFF) << 4))
|
|
|
|
/* Bit Definitions for DAC Control register */
|
|
#define DAC_INT_DMA_FLAG (1 << 0)
|
|
#define DAC_TRIG_SRC_MASK (0x7 << 1)
|
|
#define DAC_TRIG_SRC_BIT (1 << 1)
|
|
#define DAC_POLARITY (1 << 4)
|
|
#define DAC_SYNC_BYPASS (1 << 5)
|
|
#define DAC_TIM_ENA_BIT (1 << 6)
|
|
#define DAC_DBLBUF_ENA (1 << 7)
|
|
#define DAC_SHUTOFF_ENA (1 << 8)
|
|
#define DAC_SHUTOFF_FLAG (1 << 9)
|
|
#define DAC_DACCTRL_MASK ((uint32_t) 0xFF << 1)
|
|
#define DAC_CTRL_UNUSED ((uint32_t) 0x7FFFF << 13)
|
|
|
|
/** Value to reload interrupt/DMA timer */
|
|
#define DAC_CNT_VALUE(n) ((uint32_t) ((n) & 0xffff))
|
|
|
|
/**
|
|
* @brief Initial DAC configuration - Value to AOUT is 0
|
|
* @param pDAC : pointer to LPC_DAC_T
|
|
* @return Nothing
|
|
*/
|
|
void Chip_DAC_Init(LPC_DAC_T *pDAC);
|
|
|
|
/**
|
|
* @brief Shutdown DAC
|
|
* @param pDAC : pointer to LPC_DAC_T
|
|
* @return Nothing
|
|
*/
|
|
void Chip_DAC_DeInit(LPC_DAC_T *pDAC);
|
|
|
|
/**
|
|
* @brief Update value to DAC buffer
|
|
* @param pDAC : pointer to LPC_DAC_T
|
|
* @param dac_value : 12 bit input value for conversion
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_DAC_UpdateValue(LPC_DAC_T *pDAC, uint32_t dac_value)
|
|
{
|
|
pDAC->VAL = DAC_VALUE(dac_value);
|
|
}
|
|
|
|
/**
|
|
* @brief Get status for interrupt/DMA time out
|
|
* @param pDAC : pointer to LPC_DAC_T
|
|
* @return TRUE if interrupt/DMA flag is set else returns FALSE
|
|
*/
|
|
STATIC INLINE bool Chip_DAC_GetIntStatus(LPC_DAC_T *pDAC)
|
|
{
|
|
return (pDAC->CTRL & DAC_INT_DMA_FLAG) != 0;
|
|
}
|
|
|
|
/**
|
|
* @brief Set Interrupt/DMA trigger source as Internal timer, enable timer before this call
|
|
* @param pDAC : pointer to LPC_DAC_T
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_DAC_SetTrgSrcInternal(LPC_DAC_T *pDAC)
|
|
{
|
|
pDAC->CTRL &= ~(DAC_CTRL_UNUSED | DAC_TRIG_SRC_BIT);
|
|
}
|
|
|
|
/**
|
|
* @brief Set Interrupt/DMA trigger source as External Pin
|
|
* @param pDAC : pointer to LPC_DAC_T
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_DAC_SetTrgSrcExternal(LPC_DAC_T *pDAC)
|
|
{
|
|
pDAC->CTRL = (pDAC->CTRL & ~DAC_CTRL_UNUSED) | DAC_TRIG_SRC_BIT;
|
|
}
|
|
|
|
/**
|
|
* @brief Set Polarity for external trigger pin
|
|
* @param pDAC : pointer to LPC_DAC_T
|
|
* @param falling_edge : If TRUE indicates that the trigger polarity is Falling edge
|
|
* else it is a Rising edge
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_DAC_SetExtTriggerPolarity(LPC_DAC_T *pDAC, bool falling_edge)
|
|
{
|
|
if (falling_edge) {
|
|
pDAC->CTRL = (pDAC->CTRL & ~DAC_CTRL_UNUSED) | DAC_POLARITY;
|
|
}
|
|
else {
|
|
pDAC->CTRL &= ~(DAC_CTRL_UNUSED | DAC_POLARITY );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief Enable Sync Bypass, only if external trigger is in sync with SysClk
|
|
* @param pDAC : pointer to LPC_DAC_T
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_DAC_EnableSyncBypass(LPC_DAC_T *pDAC)
|
|
{
|
|
pDAC->CTRL = (pDAC->CTRL & ~DAC_CTRL_UNUSED) | DAC_SYNC_BYPASS;
|
|
}
|
|
|
|
/**
|
|
* @brief Disable Sync Bypass
|
|
* @param pDAC : pointer to LPC_DAC_T
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_DAC_DisableSyncBypass(LPC_DAC_T *pDAC)
|
|
{
|
|
pDAC->CTRL &= ~(DAC_CTRL_UNUSED | DAC_SYNC_BYPASS);
|
|
}
|
|
|
|
/**
|
|
* @brief Enable Internal Timer, CNTVAL should be loaded before enabling timer
|
|
* @param pDAC : pointer to LPC_DAC_T
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_DAC_EnableIntTimer(LPC_DAC_T *pDAC)
|
|
{
|
|
pDAC->CTRL = (pDAC->CTRL & ~DAC_CTRL_UNUSED) | DAC_TIM_ENA_BIT;
|
|
}
|
|
|
|
/**
|
|
* @brief Disable Internal Timer
|
|
* @param pDAC : pointer to LPC_DAC_T
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_DAC_DisableIntTimer(LPC_DAC_T *pDAC)
|
|
{
|
|
pDAC->CTRL &= ~(DAC_CTRL_UNUSED | DAC_TIM_ENA_BIT);
|
|
}
|
|
|
|
/**
|
|
* @brief Enable DAC Double Buffer
|
|
* @param pDAC : pointer to LPC_DAC_T
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_DAC_EnableDoubleBuffer(LPC_DAC_T *pDAC)
|
|
{
|
|
pDAC->CTRL = (pDAC->CTRL & ~DAC_CTRL_UNUSED) | DAC_DBLBUF_ENA;
|
|
}
|
|
|
|
/**
|
|
* @brief Disable DAC Double Buffer
|
|
* @param pDAC : pointer to LPC_DAC_T
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_DAC_DisableDoubleBuffer(LPC_DAC_T *pDAC)
|
|
{
|
|
pDAC->CTRL &= ~(DAC_CTRL_UNUSED | DAC_DBLBUF_ENA);
|
|
}
|
|
|
|
/**
|
|
* @brief Enable DAC Shut Off
|
|
* @param pDAC : pointer to LPC_DAC_T
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_DAC_EnableShutOff(LPC_DAC_T *pDAC)
|
|
{
|
|
pDAC->CTRL = (pDAC->CTRL & ~DAC_CTRL_UNUSED) | DAC_SHUTOFF_ENA;
|
|
}
|
|
|
|
/**
|
|
* @brief Disable DAC Shut Off
|
|
* @param pDAC : pointer to LPC_DAC_T
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_DAC_DisableShutOff(LPC_DAC_T *pDAC)
|
|
{
|
|
pDAC->CTRL &= ~(DAC_CTRL_UNUSED | DAC_SHUTOFF_ENA);
|
|
}
|
|
|
|
/**
|
|
* @brief Get status of DAC Shut Off
|
|
* @param pDAC : pointer to LPC_DAC_T
|
|
* @return TRUE if DAC is shut off else returns FALSE
|
|
*/
|
|
STATIC INLINE bool Chip_DAC_GetShutOffStatus(LPC_DAC_T *pDAC)
|
|
{
|
|
return (pDAC->CTRL & DAC_SHUTOFF_FLAG) != 0;
|
|
}
|
|
|
|
/**
|
|
* @brief Enables the DMA operation and controls DMA timer
|
|
* @param pDAC : pointer to LPC_DAC_T
|
|
* @param dacFlags : An Or'ed value of the following DAC values:
|
|
* - DAC_TRIG_SRC_BIT :set trigger source for Interrupt/DMA
|
|
* 0 - Internal timer trigger, 1 - External trigger
|
|
* - DAC_POLARITY :polarity of the trigger if it is external
|
|
* - DAC_SYNC_BYPASS :Synchronize selection is trigger is external
|
|
* - DAC_TIM_ENA_BIT :enable/disable internal timer
|
|
* - DAC_DBLBUF_ENA :enable/disable DAC double buffering feature
|
|
* - DAC_SHUTOFF_ENA :enable/disable DAC Shutoff Pin
|
|
* @return Nothing
|
|
* @note Pass an Or'ed value of the DAC flags to enable those options.
|
|
*/
|
|
STATIC INLINE void Chip_DAC_ConfigDMAConverterControl(LPC_DAC_T *pDAC, uint32_t dacFlags)
|
|
{
|
|
uint32_t temp;
|
|
|
|
temp = pDAC->CTRL & ~(DAC_CTRL_UNUSED | DAC_DACCTRL_MASK);
|
|
pDAC->CTRL = temp | dacFlags;
|
|
}
|
|
|
|
/**
|
|
* @brief Set reload value for interrupt/DMA timer
|
|
* @param pDAC : pointer to LPC_DAC_T
|
|
* @param time_out : time out to reload for interrupt/DMA timer.
|
|
* time out rate will be SysClk/(time_out + 1)
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_DAC_SetDMATimeOut(LPC_DAC_T *pDAC, uint32_t time_out)
|
|
{
|
|
pDAC->CNTVAL = DAC_CNT_VALUE(time_out);
|
|
}
|
|
|
|
/**
|
|
* @brief Set reload value for interrupt/DMA timer to trigger periodic interrupts
|
|
* @param pDAC : pointer to LPC_DAC_T
|
|
* @param periodHz : Frequency of Timer interrupts in Hz
|
|
* @return Nothing
|
|
*/
|
|
STATIC INLINE void Chip_DAC_SetReqInterval(LPC_DAC_T *pDAC, uint32_t periodHz)
|
|
{
|
|
uint32_t time_out = Chip_Clock_GetSystemClockRate() / periodHz - 1;
|
|
pDAC->CNTVAL = DAC_CNT_VALUE(time_out);
|
|
}
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __DAC_15XX_H_ */
|