Hi :
I am trying to implement the MCR_ADC( ADC1 ) peripheral of the AM437x in general-purpose mode to digitize 1 AIs (AIN4) on evm board. As a foundation for my code, I am using code found in the am437x StarterWare examples
I am having trouble getting the ADC1 to work properly. the data ADC1(AIN4) sampled is not corrented
here is my code, can anybody check it ?and give me some advice?
#define PRCM_MOD_EN 0x2
#define ADC_MCR (0x4834C000U)
#define CM_WKUP_ADC_MCR_CLKCTRL (0x44df8800U + 0x230U)/* ADC */
#define MCR_ADC_SS_SYSCONFIG (ADC_MCR + 0x010) /* SYSCONFIG */
#define MCR_ADC_SS_CTRL (ADC_MCR + 0x040) /* CTRL */
#define MCR_ADC_SS_ADC_CLKDIV (ADC_MCR + 0x04C) /* ADC_CLKDIV */
#define MCR_ADC_SS_STEPENABLE (ADC_MCR + 0x054) /* STEPENABLE */
#define MCR_ADC_SS_STEPCONFIG1 (ADC_MCR + 0x064) /* STEPCONFIG1 */
#define MCR_ADC_SS_FIFO0COUNT (ADC_MCR + 0x0E4) /* FIFO0COUNT */
#define MCR_ADC_SS_FIFO0DATA (ADC_MCR + 0x100) /* FIFO0DATA */
----------------------------
...
/* ADC clock enable */
HW_WR_FIELD32_RAW(CM_WKUP_ADC_MCR_CLKCTRL, 0x00000003U, 0U, PRCM_MOD_EN);
while(PRCM_MOD_EN != HW_RD_FIELD32_RAW(CM_WKUP_ADC_MCR_CLKCTRL, 0x00000003U, 0U));
/* Unprotect step registers, TSC_ADC_SS module disabled because configuration in progress */
// HW_WR_FIELD32(MCR_ADC_SS_CTRL, PRCM_CM_PER_MAG_CARD_CLKCTRL_IDLEST, 0x00000004);
// while(0 != HW_RD_FIELD32(
// MCR_ADC_SS_CTRL, PRCM_CM_PER_MAG_CARD_CLKCTRL_IDLEST));
/* No idle mode */
HW_WR_FIELD32_RAW(MCR_ADC_SS_SYSCONFIG,0x0000000cU, 2U, 0x00000004);
/* ADC clock 100KHz. Master clock is 24 MHz */
HW_WR_FIELD32_RAW(MCR_ADC_SS_ADC_CLKDIV, 0x0000ffffU, 0U, (24000000)/100000);
/* Enable step 1 (because it is the first one) */
HW_WR_FIELD32_RAW(MCR_ADC_SS_STEPENABLE, 0x00000002U, 1U, 0x00000002);
/* VREFN, AIN4, VREFP, Data in FIFO 16 samples average, SW enabled, continuous */
HW_WR_FIELD32_RAW(MCR_ADC_SS_STEPCONFIG1, 0x01FFFFFFU, 0U, 0x01A7B011);
/* TSC_ADC_SS module enabled */
HW_WR_FIELD32_RAW(MCR_ADC_SS_CTRL, 0x00000001U, 0U, 0x00000001);
while(0 == HW_RD_FIELD32_RAW(MCR_ADC_SS_CTRL, 0x00000001U, 0U));
/* Wait for a value in FIFO */
while (1){
udelay(5000);
CONSOLEUtilsPrintf("FIFO count number %d \n",HW_RD_FIELD32_RAW(MCR_ADC_SS_FIFO0COUNT, 0x000007FU, 0U));
// tempo=5000; /* 5 msec */
// while((HW_RD_FIELD32_RAW(MCR_ADC_SS_FIFO0COUNT, 0x000007FU, 0U) & 0x7F)== 0 && --tempo)
// if(tempo==0)
// {
// CONSOLEUtilsPrintf("!!! Error: ADC stuck... in IDLE step ?\n\n");
// return(-1);
// }
/* Displays the voltage being given VREFP=1800 mV VREFN=0 */
//voltage = (1800*(HW_RD_FIELD32_RAW(MCR_ADC_SS_FIFO0DATA, 0x000007FEU, 1U) & 0xFFF))/0xFFF;
voltage = (VOLTAGE_RESOLUTION*(HW_RD_FIELD32_RAW(MCR_ADC_SS_FIFO0DATA, 0x000007FEU, 1U) & 0xFFF))/1000U;
CONSOLEUtilsPrintf("Voltage is %d mV\n",voltage);
.....