acmp_8xx.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. /*
  2. * @brief LPC8xx Analog comparator driver
  3. *
  4. * Copyright(C) NXP Semiconductors, 2012
  5. * All rights reserved.
  6. *
  7. * Software that is described herein is for illustrative purposes only
  8. * which provides customers with programming information regarding the
  9. * LPC products. This software is supplied "AS IS" without any warranties of
  10. * any kind, and NXP Semiconductors and its licensor disclaim any and
  11. * all warranties, express or implied, including all implied warranties of
  12. * merchantability, fitness for a particular purpose and non-infringement of
  13. * intellectual property rights. NXP Semiconductors assumes no responsibility
  14. * or liability for the use of the software, conveys no license or rights under any
  15. * patent, copyright, mask work right, or any other intellectual property rights in
  16. * or to any products. NXP Semiconductors reserves the right to make changes
  17. * in the software without notification. NXP Semiconductors also makes no
  18. * representation or warranty that such application will be suitable for the
  19. * specified use without further testing or modification.
  20. *
  21. * Permission to use, copy, modify, and distribute this software and its
  22. * documentation is hereby granted, under NXP Semiconductors' and its
  23. * licensor's relevant copyrights in the software, without fee, provided that it
  24. * is used in conjunction with NXP Semiconductors microcontrollers. This
  25. * copyright, permission, and disclaimer notice must appear in all copies of
  26. * this code.
  27. */
  28. #include "chip.h"
  29. /*****************************************************************************
  30. * Private types/enumerations/variables
  31. ****************************************************************************/
  32. /*****************************************************************************
  33. * Public types/enumerations/variables
  34. ****************************************************************************/
  35. /*****************************************************************************
  36. * Private functions
  37. ****************************************************************************/
  38. /*****************************************************************************
  39. * Public functions
  40. ****************************************************************************/
  41. /* Initializes the ACMP */
  42. void Chip_ACMP_Init(LPC_CMP_T *pACMP)
  43. {
  44. Chip_SYSCTL_PowerUp(SYSCTL_SLPWAKE_ACMP_PD);
  45. Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_ACOMP);
  46. }
  47. /* De-initializes the ACMP */
  48. void Chip_ACMP_Deinit(LPC_CMP_T *pACMP)
  49. {
  50. Chip_Clock_DisablePeriphClock(SYSCTL_CLOCK_ACOMP);
  51. Chip_SYSCTL_PowerDown(SYSCTL_SLPWAKE_ACMP_PD);
  52. }
  53. /* Clears the ACMP interrupt (EDGECLR bit) */
  54. void Chip_ACMP_EdgeClear(LPC_CMP_T *pACMP)
  55. {
  56. uint32_t reg = pACMP->CTRL & ~ACMP_CTRL_RESERVED;
  57. /* Toggle EDGECLR bit high and then low */
  58. pACMP->CTRL = reg | ACMP_EDGECLR_BIT;
  59. pACMP->CTRL = reg & ~ACMP_EDGECLR_BIT;
  60. }
  61. /* Sets up ACMP edge selection */
  62. void Chip_ACMP_SetEdgeSelection(LPC_CMP_T *pACMP, ACMP_EDGESEL_T edgeSel)
  63. {
  64. uint32_t reg = pACMP->CTRL & ~(ACMP_EDGESEL_MASK | ACMP_CTRL_RESERVED);
  65. /* Select edge for COMPEDGE */
  66. pACMP->CTRL = reg | (uint32_t) edgeSel;
  67. }
  68. /* Selects positive voltage input */
  69. void Chip_ACMP_SetPosVoltRef(LPC_CMP_T *pACMP, ACMP_POS_INPUT_T Posinput)
  70. {
  71. uint32_t reg = pACMP->CTRL & ~(ACMP_COMPVPSEL_MASK | ACMP_CTRL_RESERVED);
  72. /* Select positive input */
  73. pACMP->CTRL = reg | (uint32_t) Posinput;
  74. }
  75. /* Selects negative voltage input */
  76. void Chip_ACMP_SetNegVoltRef(LPC_CMP_T *pACMP, ACMP_NEG_INPUT_T Neginput)
  77. {
  78. uint32_t reg = pACMP->CTRL & ~(ACMP_COMPVMSEL_MASK | ACMP_CTRL_RESERVED);
  79. /* Select negative input */
  80. pACMP->CTRL = reg | (uint32_t) Neginput;
  81. }
  82. /* Selects hysteresis level */
  83. void Chip_ACMP_SetHysteresis(LPC_CMP_T *pACMP, ACMP_HYS_T hys)
  84. {
  85. uint32_t reg = pACMP->CTRL & ~(ACMP_HYSTERESIS_MASK | ACMP_CTRL_RESERVED);
  86. /* Select negative input */
  87. pACMP->CTRL = reg | (uint32_t) hys;
  88. }
  89. /* Helper function for setting up ACMP control */
  90. void Chip_ACMP_SetupAMCPRefs(LPC_CMP_T *pACMP, ACMP_EDGESEL_T edgeSel,
  91. ACMP_POS_INPUT_T Posinput, ACMP_NEG_INPUT_T Neginput,
  92. ACMP_HYS_T hys)
  93. {
  94. uint32_t reg = pACMP->CTRL & ~(ACMP_HYSTERESIS_MASK | ACMP_CTRL_RESERVED |
  95. ACMP_COMPVMSEL_MASK | ACMP_COMPVPSEL_MASK | ACMP_EDGESEL_MASK);
  96. /* Select negative input */
  97. pACMP->CTRL = reg | (uint32_t) edgeSel | (uint32_t) Posinput |
  98. (uint32_t) Neginput | (uint32_t) hys;
  99. }
  100. /* Sets up voltage ladder */
  101. void Chip_ACMP_SetupVoltLadder(LPC_CMP_T *pACMP, uint32_t ladsel, bool ladrefVDDCMP)
  102. {
  103. uint32_t reg = pACMP->LAD & ~(ACMP_LADSEL_MASK | ACMP_LADREF_MASK | ACMP_LAD_RESERVED);
  104. /* Setup voltage ladder and ladder reference */
  105. if (ladrefVDDCMP) {
  106. reg |= ACMP_LADREF_MASK;
  107. }
  108. pACMP->LAD = reg | (ladsel << 1);
  109. }