This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

how can i Config AM437x ADC1 as general-purpose ADC?

Other Parts Discussed in Thread: SYSCONFIG

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);

.....