--- /dev/null
+/* -------------------------------- Arctic Core ------------------------------\r
+ * Arctic Core - the open source AUTOSAR platform http://arccore.com\r
+ *\r
+ * Copyright (C) 2009 ArcCore AB <contact@arccore.com>\r
+ *\r
+ * This source code is free software; you can redistribute it and/or modify it\r
+ * under the terms of the GNU General Public License version 2 as published by the\r
+ * Free Software Foundation; See <http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt>.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but\r
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\r
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License\r
+ * for more details.\r
+ * -------------------------------- Arctic Core ------------------------------*/\r
+\r
+#include <assert.h>\r
+#include <stdlib.h>\r
+//#include "System.h"\r
+#include "mpc55xx.h"\r
+#include "Modules.h"\r
+#include "Mcu.h"\r
+#include "Adc.h"\r
+#include "Det.h"\r
+#include "Os.h"\r
+#include "isr.h"\r
+#include "irq.h"\r
+#include "arc.h"\r
+\r
+/* Uncomment and use DMA for 5606 only if you now what you are doing */\r
+#define DONT_USE_DMA_IN_ADC_MPC560X\r
+\r
+/* Are we gonna use Dma? */\r
+#if ( defined(CFG_MPC5606S) && !defined(DONT_USE_DMA_IN_ADC_MPC560X) )\r
+ #define ADC_USES_DMA\r
+ #include "Dma.h"\r
+#endif\r
+\r
+#if ( defined(ADC_USES_DMA) && !defined(USE_DMA) )\r
+ #error Adc is configured to use Dma but the module is not enabled.\r
+#endif\r
+\r
+#define ADC_GROUP0 0\r
+\r
+typedef enum\r
+{\r
+ ADC_UNINIT,\r
+ ADC_INIT,\r
+}Adc_StateType;\r
+\r
+/* Function prototypes. */\r
+static void Adc_ConfigureADC (const Adc_ConfigType *ConfigPtr);\r
+static void Adc_ConfigureADCInterrupts (void);\r
+\r
+void Adc_GroupConversionComplete (Adc_GroupType group);\r
+\r
+/* Development error checking. */\r
+static Std_ReturnType Adc_CheckReadGroup (Adc_GroupType group);\r
+static Std_ReturnType Adc_CheckStartGroupConversion (Adc_GroupType group);\r
+static Std_ReturnType Adc_CheckStopGroupConversion (Adc_GroupType group);\r
+static Std_ReturnType Adc_CheckInit (const Adc_ConfigType *ConfigPtr);\r
+#if (ADC_DEINIT_API == STD_ON)\r
+static Std_ReturnType Adc_CheckDeInit (void);\r
+#endif\r
+static Std_ReturnType Adc_CheckSetupResultBuffer (Adc_GroupType group);\r
+static Std_ReturnType Adc_CheckGetStreamLastPointer (Adc_GroupType group);\r
+\r
+/* static variable declarations */\r
+static Adc_StateType adcState = ADC_UNINIT;\r
+static const Adc_ConfigType *AdcConfigPtr; /* Pointer to configuration structure. */\r
+\r
+/* Validate functions used for development error check */\r
+#if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
+Std_ReturnType ValidateInit(Adc_APIServiceIDType api)\r
+{\r
+ Std_ReturnType res = E_OK;\r
+ if(!(ADC_INIT == adcState)) {\r
+ Det_ReportError(MODULE_ID_ADC,0,api,ADC_E_UNINIT );\r
+ res = E_NOT_OK;\r
+ }\r
+ return res;\r
+}\r
+Std_ReturnType ValidateGroup(Adc_GroupType group,Adc_APIServiceIDType api)\r
+{\r
+ Std_ReturnType res = E_OK;\r
+ if(!((group >= 0) && (group < AdcConfig->nbrOfGroups))) {\r
+ Det_ReportError(MODULE_ID_ADC,0,api,ADC_E_PARAM_GROUP );\r
+ res = E_NOT_OK;\r
+ }\r
+ return res;\r
+}\r
+#endif\r
+\r
+#if (ADC_DEINIT_API == STD_ON)\r
+Std_ReturnType Adc_DeInit (const Adc_ConfigType *ConfigPtr)\r
+{\r
+ (void)ConfigPtr;\r
+\r
+ if (E_OK == Adc_CheckDeInit())\r
+ {\r
+ for(Adc_GroupType group = ADC_GROUP0; group < AdcConfigPtr->nbrOfGroups; group++)\r
+ {\r
+ /* Set group status to idle. */\r
+ AdcConfigPtr->groupConfigPtr[group].status->groupStatus = ADC_IDLE;\r
+ }\r
+\r
+ /* Disable DMA transfer*/\r
+#ifndef CFG_MPC5604B\r
+ ADC_0.DMAE.B.DMAEN = 0;\r
+#endif\r
+ /* Power down ADC */\r
+ ADC_0.MCR.R = 0x0001;\r
+\r
+ /* Disable all interrupt*/\r
+ ADC_0.IMR.R = 0;\r
+\r
+ /* Clean internal status. */\r
+ AdcConfigPtr = (Adc_ConfigType *)NULL;\r
+ adcState = ADC_UNINIT;\r
+ }\r
+\r
+ return (E_OK);\r
+}\r
+#endif\r
+\r
+Std_ReturnType Adc_Init (const Adc_ConfigType *ConfigPtr)\r
+{\r
+ if (E_OK == Adc_CheckInit(ConfigPtr))\r
+ {\r
+ /* First of all, store the location of the configuration data. */\r
+ AdcConfigPtr = ConfigPtr;\r
+\r
+ /* Enable ADC. */\r
+ Adc_ConfigureADC(ConfigPtr);\r
+\r
+ Adc_ConfigureADCInterrupts();\r
+\r
+ /* Move on to INIT state. */\r
+ adcState = ADC_INIT;\r
+ return E_OK;\r
+ }\r
+ else\r
+ {\r
+ return E_NOT_OK;\r
+ }\r
+}\r
+\r
+Std_ReturnType Adc_SetupResultBuffer (Adc_GroupType group, Adc_ValueGroupType *bufferPtr)\r
+{\r
+ Std_ReturnType returnValue = E_NOT_OK;\r
+\r
+ /* Check for development errors. */\r
+ if (E_OK == Adc_CheckSetupResultBuffer (group))\r
+ {\r
+ AdcConfigPtr->groupConfigPtr[group].status->resultBufferPtr = bufferPtr;\r
+ \r
+ returnValue = E_OK;\r
+ }\r
+\r
+ return (returnValue);\r
+}\r
+\r
+Adc_StreamNumSampleType Adc_GetStreamLastPointer(Adc_GroupType group, Adc_ValueGroupType** PtrToSamplePtr)\r
+{\r
+ Adc_StreamNumSampleType nofSample = 0;\r
+ Adc_GroupDefType *groupPtr = (Adc_GroupDefType *)&AdcConfigPtr->groupConfigPtr[group];\r
+ \r
+ /** @req ADC216 */\r
+ /* Check for development errors. */\r
+ if ( (E_OK == Adc_CheckGetStreamLastPointer (group)) &&\r
+ (groupPtr->status->groupStatus != ADC_BUSY) )\r
+ {\r
+ /* Set resultPtr to application buffer. */\r
+ if(groupPtr->status->currSampleCount > 0){\r
+ *PtrToSamplePtr = &groupPtr->status->resultBufferPtr[groupPtr->status->currSampleCount-1];\r
+ }\r
+\r
+ if ((ADC_CONV_MODE_ONESHOT == groupPtr->conversionMode) &&\r
+ (ADC_STREAM_COMPLETED == groupPtr->status->groupStatus))\r
+ {\r
+ /** @req ADC327. */\r
+ groupPtr->status->groupStatus = ADC_IDLE;\r
+ }\r
+ else if ((ADC_CONV_MODE_CONTINOUS == groupPtr->conversionMode) &&\r
+ (ADC_ACCESS_MODE_STREAMING == groupPtr->accessMode) &&\r
+ (ADC_STREAM_BUFFER_LINEAR == groupPtr->streamBufferMode) &&\r
+ (ADC_STREAM_COMPLETED == groupPtr->status->groupStatus))\r
+ {\r
+ /** @req ADC327. */\r
+ groupPtr->status->groupStatus = ADC_IDLE;\r
+ }\r
+ else if ( (ADC_CONV_MODE_CONTINOUS == groupPtr->conversionMode) &&\r
+ ((ADC_STREAM_COMPLETED == groupPtr->status->groupStatus) ||\r
+ (ADC_COMPLETED == groupPtr->status->groupStatus)) )\r
+ {\r
+ /* Restart continous mode, and reset result buffer */\r
+ if ((ADC_CONV_MODE_CONTINOUS == groupPtr->conversionMode) &&\r
+ (ADC_STREAM_COMPLETED == groupPtr->status->groupStatus))\r
+ {\r
+ /* Start continous conversion again */\r
+ Adc_StartGroupConversion(group);\r
+ }\r
+ /** @req ADC326 */\r
+ /** @req ADC328 */\r
+ }\r
+ else{/* Keep status. */}\r
+ }\r
+ else\r
+ {\r
+ /* Some condition not met */\r
+ *PtrToSamplePtr = NULL;\r
+ }\r
+\r
+ return nofSample;\r
+\r
+}\r
+\r
+#if (ADC_READ_GROUP_API == STD_ON)\r
+Std_ReturnType Adc_ReadGroup (Adc_GroupType group, Adc_ValueGroupType *dataBufferPtr)\r
+{\r
+ Std_ReturnType returnValue = E_OK;\r
+ uint8_t channel;\r
+ Adc_GroupDefType *groupPtr = (Adc_GroupDefType *)&AdcConfigPtr->groupConfigPtr[group];\r
+\r
+ if (E_OK == Adc_CheckReadGroup (group))\r
+ {\r
+ /* Copy the result to application buffer. */\r
+ for (channel = 0; channel < groupPtr->numberOfChannels; channel++)\r
+ {\r
+ if(groupPtr->status->currSampleCount > 0){\r
+ dataBufferPtr[channel] = (&(groupPtr->status->resultBufferPtr[groupPtr->status->currSampleCount-1]))[channel];\r
+ }else{\r
+ dataBufferPtr[channel] = groupPtr->status->resultBufferPtr[channel];\r
+ }\r
+ }\r
+\r
+ if ((ADC_CONV_MODE_ONESHOT == groupPtr->conversionMode) &&\r
+ (ADC_STREAM_COMPLETED == groupPtr->status->groupStatus))\r
+ {\r
+ /** @req ADC330. */\r
+ groupPtr->status->groupStatus = ADC_IDLE;\r
+ }\r
+ else if ((ADC_CONV_MODE_CONTINOUS == groupPtr->conversionMode) &&\r
+ (ADC_STREAM_BUFFER_LINEAR == groupPtr->streamBufferMode) &&\r
+ (ADC_ACCESS_MODE_STREAMING == groupPtr->accessMode) &&\r
+ (ADC_STREAM_COMPLETED == groupPtr->status->groupStatus))\r
+ {\r
+ /** @req ADC330. */\r
+ groupPtr->status->groupStatus = ADC_IDLE;\r
+ }\r
+ else if ((ADC_CONV_MODE_CONTINOUS == groupPtr->conversionMode) &&\r
+ ((ADC_STREAM_COMPLETED == groupPtr->status->groupStatus) ||\r
+ (ADC_COMPLETED == groupPtr->status->groupStatus)))\r
+ {\r
+ /** @req ADC329 */\r
+ /* Restart continous mode, and reset result buffer */\r
+ if ((ADC_CONV_MODE_CONTINOUS == groupPtr->conversionMode) &&\r
+ (ADC_STREAM_COMPLETED == groupPtr->status->groupStatus))\r
+ {\r
+ /* Start continous conversion again */\r
+ Adc_StartGroupConversion(group);\r
+ }\r
+ /** @req ADC329 */\r
+ /** @req ADC331 */\r
+ }\r
+ else{/* Keep status. */}\r
+ }\r
+ else\r
+ {\r
+ /* An error have been raised from Adc_CheckReadGroup(). */\r
+ returnValue = E_NOT_OK;\r
+ }\r
+\r
+ return (returnValue);\r
+}\r
+#endif\r
+\r
+Adc_StatusType Adc_GetGroupStatus (Adc_GroupType group)\r
+{\r
+ Adc_StatusType returnValue;\r
+\r
+#if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
+ if( (ValidateInit(ADC_GETGROUPSTATUS_ID) == E_NOT_OK) ||\r
+ (ValidateGroup(group, ADC_GETGROUPSTATUS_ID) == E_NOT_OK))\r
+ {\r
+ returnValue = ADC_IDLE;\r
+ }\r
+ else\r
+ {\r
+ returnValue = AdcConfigPtr->groupConfigPtr[group].status->groupStatus;\r
+ }\r
+#else\r
+ returnValue = AdcConfigPtr->groupConfigPtr[group].status->groupStatus;\r
+#endif\r
+ return (returnValue);\r
+}\r
+\r
+void Adc_GroupConversionComplete (Adc_GroupType group)\r
+{\r
+ Adc_GroupDefType *adcGroup = (Adc_GroupDefType *)&AdcConfigPtr->groupConfigPtr[group];\r
+\r
+ if(ADC_ACCESS_MODE_SINGLE == adcGroup->accessMode )\r
+ {\r
+ adcGroup->status->groupStatus = ADC_STREAM_COMPLETED;\r
+ /* Call notification if enabled. */\r
+ #if (ADC_GRP_NOTIF_CAPABILITY == STD_ON)\r
+ if (adcGroup->status->notifictionEnable && adcGroup->groupCallback != NULL)\r
+ {\r
+ adcGroup->groupCallback();\r
+ }\r
+ #endif\r
+ /* Disable trigger normal conversions for ADC0 */\r
+ ADC_0.MCR.B.NSTART=0;\r
+ }\r
+ else\r
+ {\r
+ if(ADC_STREAM_BUFFER_LINEAR == adcGroup->streamBufferMode)\r
+ {\r
+ adcGroup->status->currSampleCount++;\r
+ if(adcGroup->status->currSampleCount < adcGroup->streamNumSamples)\r
+ {\r
+ adcGroup->status->currResultBufPtr += adcGroup->numberOfChannels;\r
+ adcGroup->status->groupStatus = ADC_COMPLETED;\r
+\r
+#if defined (ADC_USES_DMA)\r
+ /* Increase current result buffer ptr */\r
+ Dma_ConfigureDestinationAddress((uint32_t)adcGroup->status->currResultBufPtr, adcGroup->dmaResultChannel);\r
+#endif\r
+\r
+ ADC_0.IMR.B.MSKECH = 1;\r
+ ADC_0.MCR.B.NSTART=1;\r
+ }\r
+ else\r
+ {\r
+ /* All sample completed. */\r
+ adcGroup->status->groupStatus = ADC_STREAM_COMPLETED;\r
+\r
+ /* Call notification if enabled. */\r
+ #if (ADC_GRP_NOTIF_CAPABILITY == STD_ON)\r
+ if (adcGroup->status->notifictionEnable && adcGroup->groupCallback != NULL){\r
+ adcGroup->groupCallback();\r
+ }\r
+ #endif\r
+ /* Disable trigger normal conversions for ADC0 */\r
+ ADC_0.MCR.B.NSTART=0;\r
+ }\r
+ }\r
+ else if(ADC_STREAM_BUFFER_CIRCULAR == adcGroup->streamBufferMode)\r
+ {\r
+ adcGroup->status->currSampleCount++;\r
+ if(adcGroup->status->currSampleCount < adcGroup->streamNumSamples)\r
+ {\r
+ adcGroup->status->currResultBufPtr += adcGroup->numberOfChannels;\r
+#if defined (ADC_USES_DMA)\r
+ /* Increase current result buffer ptr */\r
+ Dma_ConfigureDestinationAddress((uint32_t)adcGroup->status->currResultBufPtr, adcGroup->dmaResultChannel);\r
+#endif\r
+ adcGroup->status->groupStatus = ADC_COMPLETED;\r
+\r
+ ADC_0.IMR.B.MSKECH = 1;\r
+ ADC_0.MCR.B.NSTART=1;\r
+ }\r
+ else\r
+ {\r
+ /* Sample completed. */\r
+ /* Disable trigger normal conversions for ADC*/\r
+ ADC_0.MCR.B.NSTART=0;\r
+ adcGroup->status->groupStatus = ADC_STREAM_COMPLETED;\r
+ /* Call notification if enabled. */\r
+ #if (ADC_GRP_NOTIF_CAPABILITY == STD_ON)\r
+ if (adcGroup->status->notifictionEnable && adcGroup->groupCallback != NULL)\r
+ {\r
+ adcGroup->groupCallback();\r
+ }\r
+ #endif\r
+ }\r
+ }\r
+ else\r
+ {\r
+ //nothing to do.\r
+ }\r
+ }\r
+}\r
+void Adc_Group0ConversionComplete (void)\r
+{\r
+ /* Clear ECH Flag and disable interruput */\r
+ ADC_0.ISR.B.ECH = 1;\r
+ ADC_0.IMR.B.MSKECH = 0;\r
+\r
+ // Check which group is busy, only one is allowed to be busy at a time in a hw unit\r
+ for (int group = 0; group < ADC_NBR_OF_GROUPS; group++)\r
+ {\r
+ if((AdcConfigPtr->groupConfigPtr[group].status->groupStatus == ADC_BUSY) ||\r
+ (AdcConfigPtr->groupConfigPtr[group].status->groupStatus == ADC_COMPLETED))\r
+ {\r
+#if !defined (ADC_USES_DMA)\r
+ /* Copy to result buffer */\r
+ for(uint8 index=0; index < AdcConfigPtr->groupConfigPtr[group].numberOfChannels; index++)\r
+ {\r
+#if defined(CFG_MPC5606S)\r
+ AdcConfigPtr->groupConfigPtr[group].status->currResultBufPtr[index] = ADC_0.CDR[32+AdcConfigPtr->groupConfigPtr[group].channelList[index]].B.CDATA;\r
+#else\r
+ AdcConfigPtr->groupConfigPtr[group].status->currResultBufPtr[index] = ADC_0.CDR[AdcConfigPtr->groupConfigPtr[group].channelList[index]].B.CDATA;\r
+#endif\r
+ }\r
+#endif\r
+\r
+ Adc_GroupConversionComplete((Adc_GroupType)group);\r
+ break;\r
+ }\r
+ }\r
+}\r
+\r
+void Adc_WatchdogError (void){\r
+}\r
+void Adc_ADCError (void){\r
+}\r
+\r
+static void Adc_ConfigureADC (const Adc_ConfigType *ConfigPtr)\r
+{\r
+ /* Set ADC CLOCK */\r
+ ADC_0.MCR.B.ADCLKSEL = ConfigPtr->hwConfigPtr->adcPrescale;\r
+\r
+ ADC_0.DSDR.B.DSD = 254;\r
+\r
+ /* Power on ADC */\r
+ ADC_0.MCR.B.PWDN = 0;\r
+\r
+#if defined(ADC_USES_DMA)\r
+ /* Enable DMA. */\r
+ ADC_0.DMAE.B.DMAEN = 1;\r
+#endif\r
+}\r
+\r
+void Adc_ConfigureADCInterrupts (void)\r
+{\r
+ ISR_INSTALL_ISR2( "Adc_Err", Adc_ADCError, ADC_ER_INT, 2, 0 );\r
+ ISR_INSTALL_ISR2( "Adc_Grp", Adc_Group0ConversionComplete, ADC_EOC_INT, 2, 0 );\r
+ ISR_INSTALL_ISR2( "Adc_Wdg", Adc_WatchdogError, ADC_WD_INT, 2, 0 );\r
+}\r
+\r
+#if (ADC_ENABLE_START_STOP_GROUP_API == STD_ON)\r
+void Adc_StartGroupConversion (Adc_GroupType group)\r
+{\r
+ Adc_GroupDefType *groupPtr = (Adc_GroupDefType *)&AdcConfigPtr->groupConfigPtr[group];\r
+\r
+ /* Run development error check. */\r
+ if (E_OK == Adc_CheckStartGroupConversion (group))\r
+ {\r
+ /* Disable trigger normal conversions for ADC0 */\r
+ ADC_0.MCR.B.NSTART = 0;\r
+\r
+ /* Set group state to BUSY. */\r
+ groupPtr->status->groupStatus = ADC_BUSY;\r
+\r
+ groupPtr->status->currSampleCount = 0;\r
+ groupPtr->status->currResultBufPtr = groupPtr->status->resultBufferPtr; /* Set current result buffer */\r
+\r
+#if defined(ADC_USES_DMA)\r
+ Dma_ConfigureChannel ((Dma_TcdType *)groupPtr->groupDMAResults, groupPtr->dmaResultChannel);\r
+ Dma_ConfigureDestinationAddress ((uint32_t)groupPtr->status->currResultBufPtr, groupPtr->dmaResultChannel);\r
+#endif\r
+ /* Always use single shot in streaming mode */\r
+ if( groupPtr->accessMode == ADC_ACCESS_MODE_STREAMING)\r
+ {\r
+ /* Set conversion mode. */\r
+ ADC_0.MCR.B.MODE = ADC_CONV_MODE_ONESHOT;\r
+ }\r
+ else\r
+ {\r
+ /* Set conversion mode. */\r
+ ADC_0.MCR.B.MODE = groupPtr->conversionMode;\r
+ }\r
+\r
+ /* Enable Overwrite*/\r
+ ADC_0.MCR.B.OWREN = 1;\r
+\r
+ /* Set Conversion Time. */\r
+#if defined(CFG_MPC5606S)\r
+ uint32 groupChannelIdMask = 0;\r
+\r
+ ADC_0.CTR[1].B.INPLATCH = groupPtr->adcChannelConvTime.INPLATCH;\r
+ ADC_0.CTR[1].B.INPCMP = groupPtr->adcChannelConvTime.INPCMP;\r
+ ADC_0.CTR[1].B.INPSAMP = groupPtr->adcChannelConvTime.INPSAMP;\r
+\r
+ for(uint8 i =0; i < groupPtr->numberOfChannels; i++)\r
+ {\r
+ groupChannelIdMask |= (1 << groupPtr->channelList[i]);\r
+ }\r
+\r
+#if defined(ADC_USES_DMA)\r
+ ADC_0.DMAE.R = 0x01;\r
+ /* Enable DMA Transfer */\r
+ ADC_0.DMAR[1].R = groupChannelIdMask;\r
+ Dma_StartChannel(DMA_ADC_GROUP0_RESULT_CHANNEL); /* Enable EDMA channel for ADC */\r
+#endif\r
+\r
+ /* Enable Normal conversion */\r
+ ADC_0.NCMR[1].R = groupChannelIdMask;\r
+\r
+ /* Enable Channel Interrupt */\r
+ ADC_0.CIMR[1].R = groupChannelIdMask;\r
+\r
+#else\r
+ uint32 groupChannelIdMask[3] = {0,0,0};\r
+\r
+ ADC_0.CTR[0].B.INPLATCH = groupPtr->adcChannelConvTime.INPLATCH;\r
+ ADC_0.CTR[0].B.INPCMP = groupPtr->adcChannelConvTime.INPCMP;\r
+ ADC_0.CTR[0].B.INPSAMP = groupPtr->adcChannelConvTime.INPSAMP;\r
+ ADC_0.CTR[1].B.INPLATCH = groupPtr->adcChannelConvTime.INPLATCH;\r
+ ADC_0.CTR[1].B.INPCMP = groupPtr->adcChannelConvTime.INPCMP;\r
+ ADC_0.CTR[1].B.INPSAMP = groupPtr->adcChannelConvTime.INPSAMP;\r
+ ADC_0.CTR[2].B.INPLATCH = groupPtr->adcChannelConvTime.INPLATCH;\r
+ ADC_0.CTR[2].B.INPCMP = groupPtr->adcChannelConvTime.INPCMP;\r
+ ADC_0.CTR[2].B.INPSAMP = groupPtr->adcChannelConvTime.INPSAMP;\r
+\r
+ for(uint8 i =0; i < groupPtr->numberOfChannels; i++)\r
+ {\r
+ if(groupPtr->channelList[i] <= 15){\r
+ groupChannelIdMask[0] |= (1 << groupPtr->channelList[i]);\r
+ }else if((groupPtr->channelList[i] >= 32) && (groupPtr->channelList[i] <=47)){\r
+ groupChannelIdMask[1] |= (1 << (groupPtr->channelList[i] - 32));\r
+ }else if((groupPtr->channelList[i] >= 64) && (groupPtr->channelList[i] <=95)){\r
+ groupChannelIdMask[2] |= (1 << (groupPtr->channelList[i] - 64));\r
+ }\r
+ }\r
+\r
+ /* Enable Normal conversion */\r
+ ADC_0.NCMR[0].R = groupChannelIdMask[0];\r
+ ADC_0.NCMR[1].R = groupChannelIdMask[1];\r
+ ADC_0.NCMR[2].R = groupChannelIdMask[2];\r
+\r
+ /* Enable Channel Interrupt */\r
+ ADC_0.CIMR[0].R = groupChannelIdMask[0];\r
+ ADC_0.CIMR[1].R = groupChannelIdMask[1];\r
+ ADC_0.CIMR[2].R = groupChannelIdMask[2];\r
+#endif\r
+ /* Clear interrupts */\r
+ ADC_0.ISR.B.ECH = 1;\r
+ /* Enable ECH interrupt */\r
+ ADC_0.IMR.B.MSKECH = 1;\r
+\r
+ /* Trigger normal conversions for ADC0 */\r
+ ADC_0.MCR.B.NSTART = 1;\r
+ }\r
+ else\r
+ {\r
+ /* Error have been set within Adc_CheckStartGroupConversion(). */\r
+ }\r
+}\r
+\r
+void Adc_StopGroupConversion (Adc_GroupType group)\r
+{\r
+ if (E_OK == Adc_CheckStopGroupConversion (group))\r
+ {\r
+ /* Disable trigger normal conversions for ADC0 */\r
+ ADC_0.MCR.B.NSTART = 0;\r
+\r
+ /* Set group state to IDLE. */\r
+ AdcConfigPtr->groupConfigPtr[group].status->groupStatus = ADC_IDLE;\r
+\r
+ /* Disable group notification if enabled. */\r
+ if(1 == AdcConfigPtr->groupConfigPtr[group].status->notifictionEnable){\r
+ Adc_DisableGroupNotification (group);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ /* Error have been set within Adc_CheckStartGroupConversion(). */\r
+ }\r
+}\r
+#endif /* endof #if (ADC_ENABLE_START_STOP_GROUP_API == STD_ON) */\r
+\r
+#define SYSTEM_CLOCK_DIVIDE(f) ((f / 2) - 1)\r
+\r
+#if (ADC_GRP_NOTIF_CAPABILITY == STD_ON)\r
+void Adc_EnableGroupNotification (Adc_GroupType group)\r
+{\r
+ Std_ReturnType res;\r
+\r
+#if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
+ if( (ValidateInit(ADC_ENABLEGROUPNOTIFICATION_ID) == E_NOT_OK) ||\r
+ (ValidateGroup(group, ADC_ENABLEGROUPNOTIFICATION_ID) == E_NOT_OK))\r
+ {\r
+ res = E_NOT_OK;\r
+ }\r
+ else if (AdcConfigPtr->groupConfigPtr[group].groupCallback == NULL)\r
+ {\r
+ res = E_NOT_OK;\r
+ Det_ReportError(MODULE_ID_ADC,0,ADC_ENABLEGROUPNOTIFICATION_ID ,ADC_E_NOTIF_CAPABILITY );\r
+ }\r
+ else\r
+ {\r
+ /* Nothing strange. Go on... */\r
+ res = E_OK;\r
+ }\r
+#else\r
+ res = E_OK;\r
+#endif\r
+ if (E_OK == res){\r
+ AdcConfigPtr->groupConfigPtr[group].status->notifictionEnable = 1;\r
+ }\r
+}\r
+\r
+void Adc_DisableGroupNotification (Adc_GroupType group)\r
+{\r
+ Std_ReturnType res;\r
+\r
+#if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
+ if( (ValidateInit(ADC_DISABLEGROUPNOTIFICATION_ID) == E_NOT_OK) ||\r
+ (ValidateGroup(group, ADC_DISABLEGROUPNOTIFICATION_ID) == E_NOT_OK))\r
+ {\r
+ res = E_NOT_OK;\r
+ }\r
+ else if (AdcConfigPtr->groupConfigPtr[group].groupCallback == NULL)\r
+ {\r
+ res = E_NOT_OK;\r
+ Det_ReportError(MODULE_ID_ADC,0,ADC_DISABLEGROUPNOTIFICATION_ID ,ADC_E_NOTIF_CAPABILITY );\r
+ }\r
+ else\r
+ {\r
+ /* Nothing strange. Go on... */\r
+ res = E_OK;\r
+ }\r
+#else\r
+ res = E_OK;\r
+#endif\r
+ if (E_OK == res){\r
+ AdcConfigPtr->groupConfigPtr[group].status->notifictionEnable = 0;\r
+ }\r
+}\r
+#endif\r
+\r
+\r
+\r
+/* Development error checking functions. */\r
+#if (ADC_READ_GROUP_API == STD_ON)\r
+static Std_ReturnType Adc_CheckReadGroup (Adc_GroupType group)\r
+{\r
+ Std_ReturnType returnValue = E_OK;\r
+\r
+#if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
+\r
+ if( (ValidateInit(ADC_READGROUP_ID) == E_NOT_OK) ||\r
+ (ValidateGroup(group, ADC_READGROUP_ID) == E_NOT_OK))\r
+ {\r
+ returnValue = E_NOT_OK;\r
+ }\r
+ else if (ADC_IDLE == AdcConfigPtr->groupConfigPtr[group].status->groupStatus)\r
+ {\r
+ /* ADC388. */\r
+ returnValue = E_NOT_OK;\r
+ Det_ReportError(MODULE_ID_ADC,0,ADC_READGROUP_ID ,ADC_E_IDLE );\r
+ }\r
+ else\r
+ {\r
+ /* Nothing strange. Go on... */\r
+ returnValue = E_OK;\r
+ }\r
+#endif\r
+ return (returnValue);\r
+}\r
+#endif\r
+\r
+#if (ADC_ENABLE_START_STOP_GROUP_API == STD_ON)\r
+static Std_ReturnType Adc_CheckStartGroupConversion (Adc_GroupType group)\r
+{\r
+ Std_ReturnType returnValue = E_OK;\r
+\r
+#if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
+\r
+ if( (ValidateInit(ADC_STARTGROUPCONVERSION_ID) == E_NOT_OK) ||\r
+ (ValidateGroup(group, ADC_STARTGROUPCONVERSION_ID) == E_NOT_OK))\r
+ {\r
+ returnValue = E_NOT_OK;\r
+ }\r
+ else if ( NULL == AdcConfigPtr->groupConfigPtr[group].status->resultBufferPtr )\r
+ {\r
+ /* ResultBuffer not set, ADC424 */\r
+ Det_ReportError(MODULE_ID_ADC,0,ADC_STARTGROUPCONVERSION_ID, ADC_E_BUFFER_UNINIT );\r
+ returnValue = E_NOT_OK;\r
+ }\r
+ else if (!(ADC_TRIGG_SRC_SW == AdcConfigPtr->groupConfigPtr[group].triggerSrc))\r
+ {\r
+ /* Wrong trig source, ADC133. */\r
+ Det_ReportError(MODULE_ID_ADC,0,ADC_STARTGROUPCONVERSION_ID, ADC_E_WRONG_TRIGG_SRC);\r
+ returnValue = E_NOT_OK;\r
+ }\r
+ else if (!((ADC_IDLE == AdcConfigPtr->groupConfigPtr[group].status->groupStatus) ||\r
+ (ADC_STREAM_COMPLETED == AdcConfigPtr->groupConfigPtr[group].status->groupStatus)))\r
+ {\r
+ /* Group status not OK, ADC351, ADC428 */\r
+ Det_ReportError(MODULE_ID_ADC,0,ADC_STARTGROUPCONVERSION_ID, ADC_E_BUSY );\r
+\r
+ //returnValue = E_NOT_OK;\r
+ returnValue = E_OK;\r
+ }\r
+ else\r
+ {\r
+ returnValue = E_OK;\r
+ }\r
+#endif\r
+\r
+ return (returnValue);\r
+}\r
+\r
+static Std_ReturnType Adc_CheckStopGroupConversion (Adc_GroupType group)\r
+{\r
+ Std_ReturnType returnValue = E_OK;\r
+\r
+#if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
+ if( (ValidateInit(ADC_STOPGROUPCONVERSION_ID) == E_NOT_OK) ||\r
+ (ValidateGroup(group, ADC_STOPGROUPCONVERSION_ID) == E_NOT_OK))\r
+ {\r
+ returnValue = E_NOT_OK;\r
+ }\r
+ else if (!(ADC_TRIGG_SRC_SW == AdcConfigPtr->groupConfigPtr[group].triggerSrc))\r
+ {\r
+ /* Wrong trig source, ADC164. */\r
+ Det_ReportError(MODULE_ID_ADC,0,ADC_STOPGROUPCONVERSION_ID, ADC_E_WRONG_TRIGG_SRC);\r
+ returnValue = E_NOT_OK;\r
+ }\r
+ else if (ADC_IDLE == AdcConfigPtr->groupConfigPtr[group].status->groupStatus)\r
+ {\r
+ /* Group status not OK, ADC241 */\r
+ Det_ReportError(MODULE_ID_ADC,0,ADC_STOPGROUPCONVERSION_ID, ADC_E_IDLE );\r
+ returnValue = E_NOT_OK;\r
+ }\r
+ else\r
+ {\r
+ returnValue = E_OK;\r
+ }\r
+#endif\r
+\r
+ return (returnValue);\r
+}\r
+#endif\r
+\r
+static Std_ReturnType Adc_CheckInit (const Adc_ConfigType *ConfigPtr)\r
+{\r
+ Std_ReturnType returnValue = E_OK;\r
+\r
+#if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
+ if (!(ADC_UNINIT == adcState))\r
+ {\r
+ /* Oops, already initialised. */\r
+ Det_ReportError(MODULE_ID_ADC,0,ADC_INIT_ID, ADC_E_ALREADY_INITIALIZED );\r
+ returnValue = E_NOT_OK;\r
+ }\r
+ else if (ConfigPtr == NULL)\r
+ {\r
+ /* Wrong config! */\r
+ Det_ReportError(MODULE_ID_ADC,0,ADC_INIT_ID, ADC_E_PARAM_CONFIG );\r
+ returnValue = E_NOT_OK;\r
+ }\r
+ else\r
+ {\r
+ /* Looks good!! */\r
+ returnValue = E_OK;\r
+ }\r
+#endif\r
+ return (returnValue);\r
+}\r
+\r
+#if (ADC_DEINIT_API == STD_ON)\r
+static Std_ReturnType Adc_CheckDeInit (void)\r
+{\r
+ Std_ReturnType returnValue = E_OK;\r
+\r
+#if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
+ if(ValidateInit(ADC_DEINIT_ID) == E_OK)\r
+ {\r
+ for (Adc_GroupType group = ADC_GROUP0; group < AdcConfigPtr->nbrOfGroups; group++)\r
+ {\r
+ /* Check ADC is IDLE or COMPLETE*/\r
+ if((AdcConfigPtr->groupConfigPtr[group].status->groupStatus != ADC_IDLE) && (AdcConfigPtr->groupConfigPtr[group].status->groupStatus != ADC_STREAM_COMPLETED))\r
+ {\r
+ Det_ReportError(MODULE_ID_ADC,0,ADC_DEINIT_ID, ADC_E_BUSY );\r
+ returnValue = E_NOT_OK;\r
+ }\r
+ }\r
+ }\r
+ else\r
+ {\r
+ returnValue = E_NOT_OK;\r
+ }\r
+#endif\r
+ return (returnValue);\r
+}\r
+#endif\r
+\r
+static Std_ReturnType Adc_CheckSetupResultBuffer (Adc_GroupType group)\r
+{\r
+ Std_ReturnType returnValue = E_OK;\r
+\r
+#if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
+ if(ValidateGroup(group, ADC_SETUPRESULTBUFFER_ID) == E_NOT_OK)\r
+ {\r
+ returnValue = E_NOT_OK;\r
+ }\r
+#endif\r
+ return (returnValue);\r
+}\r
+\r
+static Std_ReturnType Adc_CheckGetStreamLastPointer (Adc_GroupType group)\r
+{\r
+ Std_ReturnType returnValue = E_OK;\r
+\r
+#if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
+ if( (ValidateInit(ADC_GETSTREAMLASTPOINTER_ID) == E_NOT_OK) ||\r
+ (ValidateGroup(group, ADC_GETSTREAMLASTPOINTER_ID) == E_NOT_OK))\r
+ {\r
+ returnValue = E_NOT_OK;\r
+ }\r
+ else if(AdcConfigPtr->groupConfigPtr[group].status->groupStatus == ADC_IDLE)\r
+ { /** @req ADC215 Check ADC is not in IDLE */\r
+ Det_ReportError(MODULE_ID_ADC,0,ADC_GETSTREAMLASTPOINTER_ID, ADC_E_IDLE );\r
+ returnValue = E_NOT_OK;\r
+ }\r
+#endif\r
+ return (returnValue);\r
+}\r
+\r
+\r
+\r
#include "irq.h"\r
#include "arc.h"\r
\r
-/* Uncomment and use DMA for 5606 only if you now what you are doing */\r
-#define DONT_USE_DMA_IN_ADC_MPC560X\r
-\r
-/* Are we gonna use Dma? */\r
-#if ( !defined(CFG_MPC560X) || \\r
- ( defined(CFG_MPC5606S) && !defined(DONT_USE_DMA_IN_ADC_MPC560X) ) )\r
- #define ADC_USES_DMA\r
- #include "Dma.h"\r
-#endif\r
+#define ADC_USES_DMA\r
+#include "Dma.h"\r
\r
#if ( defined(ADC_USES_DMA) && !defined(USE_DMA) )\r
#error Adc is configured to use Dma but the module is not enabled.\r
\r
#define ADC_GROUP0 0\r
\r
-#if !defined(CFG_MPC560X)\r
typedef union\r
{\r
vuint32_t R;\r
.INT_MAJ = 0,\r
.START = 0\r
};\r
-#endif\r
\r
typedef enum\r
{\r
}Adc_StateType;\r
\r
/* Function prototypes. */\r
-#if defined(CFG_MPC560X)\r
-static void Adc_ConfigureADC (const Adc_ConfigType *ConfigPtr);\r
-static void Adc_ConfigureADCInterrupts (void);\r
-#else\r
static void Adc_ConfigureEQADC (const Adc_ConfigType *ConfigPtr);\r
static void Adc_ConfigureEQADCInterrupts (void);\r
static void Adc_EQADCCalibrationSequence (void);\r
static void Adc_WriteEQADCRegister (Adc_EQADCRegisterType reg, Adc_EQADCRegister value);\r
static Adc_EQADCRegister Adc_ReadEQADCRegister (Adc_EQADCRegisterType reg);\r
-#endif\r
\r
void Adc_GroupConversionComplete (Adc_GroupType group);\r
\r
Std_ReturnType Adc_DeInit (const Adc_ConfigType *ConfigPtr)\r
{\r
(void)ConfigPtr;\r
-#if defined(CFG_MPC560X)\r
-\r
- if (E_OK == Adc_CheckDeInit())\r
- {\r
- for(Adc_GroupType group = ADC_GROUP0; group < AdcConfigPtr->nbrOfGroups; group++)\r
- {\r
- /* Set group status to idle. */\r
- AdcConfigPtr->groupConfigPtr[group].status->groupStatus = ADC_IDLE;\r
- }\r
-\r
- /* Disable DMA transfer*/\r
-#ifndef CFG_MPC5604B\r
- ADC_0.DMAE.B.DMAEN = 0;\r
-#endif\r
- /* Power down ADC */\r
- ADC_0.MCR.R = 0x0001;\r
-\r
- /* Disable all interrupt*/\r
- ADC_0.IMR.R = 0;\r
-\r
- /* Clean internal status. */\r
- AdcConfigPtr = (Adc_ConfigType *)NULL;\r
- adcState = ADC_UNINIT;\r
- }\r
-\r
- return (E_OK);\r
- \r
-#else\r
\r
Adc_eQADCQueueType queue;\r
Adc_GroupType group;\r
adcState = ADC_UNINIT;\r
}\r
return (E_OK);\r
-#endif /* ENDOF defined(CFG_MPC560X) */\r
}\r
#endif\r
\r
Std_ReturnType Adc_Init (const Adc_ConfigType *ConfigPtr)\r
{\r
-#if defined(CFG_MPC560X)\r
-\r
- if (E_OK == Adc_CheckInit(ConfigPtr))\r
- {\r
- /* First of all, store the location of the configuration data. */\r
- AdcConfigPtr = ConfigPtr;\r
-\r
- /* Enable ADC. */\r
- Adc_ConfigureADC(ConfigPtr);\r
-\r
- Adc_ConfigureADCInterrupts();\r
-\r
- /* Move on to INIT state. */\r
- adcState = ADC_INIT;\r
- return E_OK;\r
- }\r
- else\r
- {\r
- return E_NOT_OK;\r
- }\r
-\r
-#else\r
-\r
Std_ReturnType returnValue;\r
Adc_InternalChannelIdType channel;\r
Adc_InternalChannelIdType channelId;\r
}\r
\r
return (returnValue); \r
-#endif \r
}\r
\r
Std_ReturnType Adc_SetupResultBuffer (Adc_GroupType group, Adc_ValueGroupType *bufferPtr)\r
adcGroup->groupCallback();\r
}\r
#endif\r
-#if defined(CFG_MPC560X)\r
- /* Disable trigger normal conversions for ADC0 */\r
- ADC_0.MCR.B.NSTART=0;\r
-#else\r
/* Disable trigger. */\r
EQADC.CFCR[group].B.MODE = 0;\r
-#endif\r
}\r
else\r
{\r
Dma_ConfigureDestinationAddress((uint32_t)adcGroup->status->currResultBufPtr, adcGroup->dmaResultChannel);\r
#endif\r
\r
-#if defined(CFG_MPC560X)\r
- ADC_0.IMR.B.MSKECH = 1;\r
- ADC_0.MCR.B.NSTART=1;\r
-#else\r
/* Set single scan enable bit */\r
EQADC.CFCR[group].B.SSE = 1;\r
-#endif\r
}\r
else\r
{\r
adcGroup->groupCallback();\r
}\r
#endif\r
-#if defined(CFG_MPC560X)\r
- /* Disable trigger normal conversions for ADC0 */\r
- ADC_0.MCR.B.NSTART=0;\r
-#else\r
/* Disable trigger. */\r
EQADC.CFCR[group].B.MODE = 0;\r
-#endif\r
}\r
}\r
else if(ADC_STREAM_BUFFER_CIRCULAR == adcGroup->streamBufferMode)\r
#endif\r
adcGroup->status->groupStatus = ADC_COMPLETED;\r
\r
-#if defined(CFG_MPC560X)\r
- ADC_0.IMR.B.MSKECH = 1;\r
- ADC_0.MCR.B.NSTART=1;\r
-#else\r
/* Set single scan enable bit */\r
EQADC.CFCR[group].B.SSE = 1;\r
-#endif\r
}\r
else\r
{\r
/* Sample completed. */\r
-#if defined(CFG_MPC560X)\r
- /* Disable trigger normal conversions for ADC*/\r
- ADC_0.MCR.B.NSTART=0;\r
-#else\r
/* Disable trigger. */\r
EQADC.CFCR[group].B.MODE = 0;\r
-#endif\r
adcGroup->status->groupStatus = ADC_STREAM_COMPLETED;\r
/* Call notification if enabled. */\r
#if (ADC_GRP_NOTIF_CAPABILITY == STD_ON)\r
}\r
}\r
}\r
-#if defined(CFG_MPC560X)\r
-void Adc_Group0ConversionComplete (void)\r
-{\r
- /* Clear ECH Flag and disable interruput */\r
- ADC_0.ISR.B.ECH = 1;\r
- ADC_0.IMR.B.MSKECH = 0;\r
-\r
- // Check which group is busy, only one is allowed to be busy at a time in a hw unit\r
- for (int group = 0; group < ADC_NBR_OF_GROUPS; group++)\r
- {\r
- if((AdcConfigPtr->groupConfigPtr[group].status->groupStatus == ADC_BUSY) ||\r
- (AdcConfigPtr->groupConfigPtr[group].status->groupStatus == ADC_COMPLETED))\r
- {\r
-#if !defined (ADC_USES_DMA)\r
- /* Copy to result buffer */\r
- for(uint8 index=0; index < AdcConfigPtr->groupConfigPtr[group].numberOfChannels; index++)\r
- {\r
-#if defined(CFG_MPC5606S)\r
- AdcConfigPtr->groupConfigPtr[group].status->currResultBufPtr[index] = ADC_0.CDR[32+AdcConfigPtr->groupConfigPtr[group].channelList[index]].B.CDATA;\r
-#else\r
- AdcConfigPtr->groupConfigPtr[group].status->currResultBufPtr[index] = ADC_0.CDR[AdcConfigPtr->groupConfigPtr[group].channelList[index]].B.CDATA;\r
-#endif\r
- }\r
-#endif\r
-\r
- Adc_GroupConversionComplete((Adc_GroupType)group);\r
- break;\r
- }\r
- }\r
-}\r
-\r
-void Adc_WatchdogError (void){\r
-}\r
-void Adc_ADCError (void){\r
-}\r
-\r
-static void Adc_ConfigureADC (const Adc_ConfigType *ConfigPtr)\r
-{\r
- /* Set ADC CLOCK */\r
- ADC_0.MCR.B.ADCLKSEL = ConfigPtr->hwConfigPtr->adcPrescale;\r
-\r
- ADC_0.DSDR.B.DSD = 254;\r
-\r
- /* Power on ADC */\r
- ADC_0.MCR.B.PWDN = 0;\r
-\r
-#if defined(ADC_USES_DMA)\r
- /* Enable DMA. */\r
- ADC_0.DMAE.B.DMAEN = 1;\r
-#endif\r
-}\r
-\r
-void Adc_ConfigureADCInterrupts (void)\r
-{\r
- ISR_INSTALL_ISR2( "Adc_Err", Adc_ADCError, ADC_ER_INT, 2, 0 );\r
- ISR_INSTALL_ISR2( "Adc_Grp", Adc_Group0ConversionComplete, ADC_EOC_INT, 2, 0 );\r
- ISR_INSTALL_ISR2( "Adc_Wdg", Adc_WatchdogError, ADC_WD_INT, 2, 0 );\r
-}\r
-\r
-#if (ADC_ENABLE_START_STOP_GROUP_API == STD_ON)\r
-void Adc_StartGroupConversion (Adc_GroupType group)\r
-{\r
- Adc_GroupDefType *groupPtr = (Adc_GroupDefType *)&AdcConfigPtr->groupConfigPtr[group];\r
-\r
- /* Run development error check. */\r
- if (E_OK == Adc_CheckStartGroupConversion (group))\r
- {\r
- /* Disable trigger normal conversions for ADC0 */\r
- ADC_0.MCR.B.NSTART = 0;\r
-\r
- /* Set group state to BUSY. */\r
- groupPtr->status->groupStatus = ADC_BUSY;\r
-\r
- groupPtr->status->currSampleCount = 0;\r
- groupPtr->status->currResultBufPtr = groupPtr->status->resultBufferPtr; /* Set current result buffer */\r
-\r
-#if defined(ADC_USES_DMA)\r
- Dma_ConfigureChannel ((Dma_TcdType *)groupPtr->groupDMAResults, groupPtr->dmaResultChannel);\r
- Dma_ConfigureDestinationAddress ((uint32_t)groupPtr->status->currResultBufPtr, groupPtr->dmaResultChannel);\r
-#endif\r
- /* Always use single shot in streaming mode */\r
- if( groupPtr->accessMode == ADC_ACCESS_MODE_STREAMING)\r
- {\r
- /* Set conversion mode. */\r
- ADC_0.MCR.B.MODE = ADC_CONV_MODE_ONESHOT;\r
- }\r
- else\r
- {\r
- /* Set conversion mode. */\r
- ADC_0.MCR.B.MODE = groupPtr->conversionMode;\r
- }\r
-\r
- /* Enable Overwrite*/\r
- ADC_0.MCR.B.OWREN = 1;\r
-\r
- /* Set Conversion Time. */\r
-#if defined(CFG_MPC5606S)\r
- uint32 groupChannelIdMask = 0;\r
-\r
- ADC_0.CTR[1].B.INPLATCH = groupPtr->adcChannelConvTime.INPLATCH;\r
- ADC_0.CTR[1].B.INPCMP = groupPtr->adcChannelConvTime.INPCMP;\r
- ADC_0.CTR[1].B.INPSAMP = groupPtr->adcChannelConvTime.INPSAMP;\r
-\r
- for(uint8 i =0; i < groupPtr->numberOfChannels; i++)\r
- {\r
- groupChannelIdMask |= (1 << groupPtr->channelList[i]);\r
- }\r
-\r
-#if defined(ADC_USES_DMA)\r
- ADC_0.DMAE.R = 0x01;\r
- /* Enable DMA Transfer */\r
- ADC_0.DMAR[1].R = groupChannelIdMask;\r
- Dma_StartChannel(DMA_ADC_GROUP0_RESULT_CHANNEL); /* Enable EDMA channel for ADC */\r
-#endif\r
-\r
- /* Enable Normal conversion */\r
- ADC_0.NCMR[1].R = groupChannelIdMask;\r
-\r
- /* Enable Channel Interrupt */\r
- ADC_0.CIMR[1].R = groupChannelIdMask;\r
-\r
-#else\r
- uint32 groupChannelIdMask[3] = {0,0,0};\r
-\r
- ADC_0.CTR[0].B.INPLATCH = groupPtr->adcChannelConvTime.INPLATCH;\r
- ADC_0.CTR[0].B.INPCMP = groupPtr->adcChannelConvTime.INPCMP;\r
- ADC_0.CTR[0].B.INPSAMP = groupPtr->adcChannelConvTime.INPSAMP;\r
- ADC_0.CTR[1].B.INPLATCH = groupPtr->adcChannelConvTime.INPLATCH;\r
- ADC_0.CTR[1].B.INPCMP = groupPtr->adcChannelConvTime.INPCMP;\r
- ADC_0.CTR[1].B.INPSAMP = groupPtr->adcChannelConvTime.INPSAMP;\r
- ADC_0.CTR[2].B.INPLATCH = groupPtr->adcChannelConvTime.INPLATCH;\r
- ADC_0.CTR[2].B.INPCMP = groupPtr->adcChannelConvTime.INPCMP;\r
- ADC_0.CTR[2].B.INPSAMP = groupPtr->adcChannelConvTime.INPSAMP;\r
-\r
- for(uint8 i =0; i < groupPtr->numberOfChannels; i++)\r
- {\r
- if(groupPtr->channelList[i] <= 15){\r
- groupChannelIdMask[0] |= (1 << groupPtr->channelList[i]);\r
- }else if((groupPtr->channelList[i] >= 32) && (groupPtr->channelList[i] <=47)){\r
- groupChannelIdMask[1] |= (1 << (groupPtr->channelList[i] - 32));\r
- }else if((groupPtr->channelList[i] >= 64) && (groupPtr->channelList[i] <=95)){\r
- groupChannelIdMask[2] |= (1 << (groupPtr->channelList[i] - 64));\r
- }\r
- }\r
-\r
- /* Enable Normal conversion */\r
- ADC_0.NCMR[0].R = groupChannelIdMask[0];\r
- ADC_0.NCMR[1].R = groupChannelIdMask[1];\r
- ADC_0.NCMR[2].R = groupChannelIdMask[2];\r
-\r
- /* Enable Channel Interrupt */\r
- ADC_0.CIMR[0].R = groupChannelIdMask[0];\r
- ADC_0.CIMR[1].R = groupChannelIdMask[1];\r
- ADC_0.CIMR[2].R = groupChannelIdMask[2];\r
-#endif\r
- /* Clear interrupts */\r
- ADC_0.ISR.B.ECH = 1;\r
- /* Enable ECH interrupt */\r
- ADC_0.IMR.B.MSKECH = 1;\r
-\r
- /* Trigger normal conversions for ADC0 */\r
- ADC_0.MCR.B.NSTART = 1;\r
- }\r
- else\r
- {\r
- /* Error have been set within Adc_CheckStartGroupConversion(). */\r
- }\r
-}\r
-\r
-void Adc_StopGroupConversion (Adc_GroupType group)\r
-{\r
- if (E_OK == Adc_CheckStopGroupConversion (group))\r
- {\r
- /* Disable trigger normal conversions for ADC0 */\r
- ADC_0.MCR.B.NSTART = 0;\r
-\r
- /* Set group state to IDLE. */\r
- AdcConfigPtr->groupConfigPtr[group].status->groupStatus = ADC_IDLE;\r
-\r
- /* Disable group notification if enabled. */\r
- if(1 == AdcConfigPtr->groupConfigPtr[group].status->notifictionEnable){\r
- Adc_DisableGroupNotification (group);\r
- }\r
- }\r
- else\r
- {\r
- /* Error have been set within Adc_CheckStartGroupConversion(). */\r
- }\r
-}\r
-#endif /* endof #if (ADC_ENABLE_START_STOP_GROUP_API == STD_ON) */\r
-\r
-#else /* End of mpc5606s unique */\r
\r
void Adc_Group0ConversionComplete (void)\r
{\r
assert (0);\r
}\r
}\r
-#endif\r
\r
#define SYSTEM_CLOCK_DIVIDE(f) ((f / 2) - 1)\r
\r