[MCU] EDMA应用于AD7616采样中问题

[复制链接]
145|1
 楼主 | 2019-11-18 14:55 | 显示全部楼层 ||阅读模式
本帖最后由 zhaojianguo 于 2019-11-18 15:01 编辑

大家好:
    采用外部AD芯片采样,在采样过程中使用AM335X中控芯片的EDMA功能,但是并未触发采样CS,采到的数据也不对,麻烦大家给看下,问题出在哪里。

  1. static void adc_edma_config(void)
  2. {
  3.         int result = 0;

  4.         unsigned int BRCnt = 0;
  5.         int srcbidx = 0;
  6.         int desbidx = 0;
  7.         int srccidx = 0;
  8.         int descidx = 0;
  9.         struct edmacc_param param_set;

  10.         /* Set B count reload as B count. */
  11.         BRCnt = ADC_EDMA_BCNT;

  12.         /* Setting up the SRC/DES Index */
  13.         srcbidx = 0;
  14.         desbidx = ADC_EDMA_ACNT;

  15.         /* A Sync Transfer Mode */
  16.         srccidx = 0;
  17.         descidx = ADC_EDMA_ACNT;

  18.         // gpmc channel
  19.         result = edma_alloc_channel (ADC_EDMA_GPMCEVT_CHAN, callback1, NULL, EVENTQ_0);

  20.         if (result < 0) {
  21.                 printk("edma_adc_config:edma_alloc_channel ""failed for dma_ch1, error:%d\n", result);
  22.                 return result;
  23.         }

  24.         dma_ch1 = result;
  25.         edma_set_src (dma_ch1, (unsigned long)(g_gpmc_cs1_base), INCR, W16BIT);
  26.         edma_set_dest (dma_ch1, (unsigned long)(TI_SRAM_BASE), INCR, W16BIT);
  27.         edma_set_src_index (dma_ch1, srcbidx, srccidx);
  28.         edma_set_dest_index (dma_ch1, desbidx, descidx);
  29.         edma_set_transfer_params (dma_ch1, ADC_EDMA_ACNT, ADC_EDMA_BCNT, ADC_EDMA_CCNT, BRCnt, ASYNC);

  30.         /* Enable the Interrupts on Channel 1 */
  31.         edma_read_slot (dma_ch1, &param_set);
  32.         param_set.opt |= (1 << ITCINTEN_SHIFT);
  33.         param_set.opt |= (1 << TCINTEN_SHIFT);
  34.         param_set.opt |= EDMA_TCC(EDMA_CHAN_SLOT(dma_ch1));
  35.         edma_write_slot(dma_ch1, &param_set);

  36.         return 0;

  37. }
复制代码

  1. static int adc_sram_init(void)
  2. {
  3.         padc_dots = ioremap(TI_SRAM_BASE, SZ_16K);
  4.         if(!padc_dots)
  5.         {
  6.                 printk("%s: ioremap error\r\n", __func__);
  7.                 return -1;
  8.         }
  9.         
  10.         g_adc_pdata = padc_dots;
  11.         
  12.         return 0;
  13. }
复制代码

  1. int adc_init(void)
  2. {
  3.         int i;
  4.         u32 rc;
  5.         u16 w;
  6.         int ret;
  7.         void __iomem *p_REGS;

  8.         //配置CS1,时序  U9 GPMC_CSN1
  9.         ret = gpio_gpmc_csn_init(GPMC_CS1, 16, &g_gpmc_cs1_base, &g_gpmc_cs1_vbase, &ad7616_timings);
  10.         if(ret)
  11.         {
  12.                 printk("%s: CS%d init error\r\n" ,GPMC_CS1);
  13.                 return -1;
  14.         }
  15.         
  16.         g_addr_cs[0] = g_gpmc_cs1_vbase;

  17.         p_REGS = ioremap(SOC_CONTROL_REGS, SZ_8K);
  18.         if(!p_REGS)
  19.         {
  20.                 printk("%s:ioremap(%x) error\r\n", __func__, SOC_CONTROL_REGS);
  21.                 return -1;
  22.         }
  23.         g_SOC_CONTROL_REGS = (unsigned int)p_REGS;


  24.         p_REGS = ioremap(SOC_GPIO_0_REGS, SZ_4K);
  25.         if(!p_REGS)
  26.         {
  27.                 printk("%s:ioremap(%x) error\r\n", __func__, SOC_GPIO_0_REGS);
  28.                 iounmap((void __iomem *)g_SOC_CONTROL_REGS);
  29.                 return -1;
  30.         }
  31.         g_SOC_GPIO_0_REGS = (unsigned int)p_REGS;

  32.         p_REGS = ioremap(SOC_GPIO_1_REGS, SZ_4K);
  33.         if(!p_REGS)
  34.         {
  35.                 printk("%s:ioremap(%x) error\r\n", __func__, SOC_GPIO_1_REGS);
  36.                 iounmap((void __iomem *)g_SOC_CONTROL_REGS);
  37.                 return -1;
  38.         }
  39.         g_SOC_GPIO_1_REGS = (unsigned int)p_REGS;

  40.         p_REGS = ioremap(SOC_GPIO_2_REGS, SZ_4K);
  41.         if(!p_REGS)
  42.         {
  43.                 printk("%s:ioremap(%x) error\r\n", __func__, SOC_GPIO_2_REGS);
  44.                 iounmap((void __iomem *)g_SOC_CONTROL_REGS);
  45.                 return -1;
  46.         }
  47.         g_SOC_GPIO_2_REGS = (unsigned int)p_REGS;

  48.         //配置CS1 功能
  49.         HWREG((unsigned int)g_SOC_CONTROL_REGS + CONTROL_CONF_GPMC_CSN(1)) =
  50.         (CONTROL_CONF_PULLUDDISABLE  | CONTROL_CONF_MUXMODE(0));
  51.         GPIODirModeSet((unsigned int)g_SOC_GPIO_1_REGS, 30, GPIO_DIR_OUTPUT);
  52.         
  53.         //配置GPMC_A7 gpio1_23   reset 上拉输出
  54.         HWREG((unsigned int)g_SOC_CONTROL_REGS + CONTROL_CONF_GPMC_A(7)) =
  55.                         (CONTROL_CONF_PULLUDDISABLE | CONTROL_CONF_MUXMODE(7));
  56.         GPIODirModeSet((unsigned int)g_SOC_GPIO_1_REGS, 23, GPIO_DIR_OUTPUT);

  57.         GPIOPinWrite((unsigned int)g_SOC_GPIO_1_REGS, 23, GPIO_PIN_LOW);
  58.         ustimer_delay(1*USTIMER_MS);  // 全复位至少1.2us
  59.         GPIOPinWrite((unsigned int)g_SOC_GPIO_1_REGS, 23, GPIO_PIN_HIGH);
  60.         ustimer_delay(20*USTIMER_MS); // RESET到CONVST最少15ms

  61.         //配置XDMA_EVENT_INTR0管脚为输入.此管脚对应AD7616的BUSY管脚
  62.         HWREG((unsigned int)g_SOC_CONTROL_REGS + CONTROL_CONF_XDMA_EVENT_INTR(0)) =
  63.                         (CONTROL_CONF_PULLUPSEL | CONTROL_CONF_MUXMODE(7));
  64.         GPIODirModeSet((unsigned int)g_SOC_GPIO_0_REGS, 19, GPIO_DIR_INPUT);

  65.         // 外部AD软件初始化
  66.         for(i=0; i<EQU_SLOT_AC_NUM; i++)
  67.         {
  68.             
  69.             // 写0正式启动转换
  70.             *(u32*)g_addr_cs[i] = 0;
  71.         }
  72.         adc_sram_init();
  73.         adc_edma_config();
  74.         edma_start(dma_ch1);

  75.         return 0;        
  76. }
复制代码

使用特权

评论回复
| 2019-11-18 21:44 | 显示全部楼层
用的emif接口吗   先检测一下你的操作时序   比如cs变化  数据线是否有变化等

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表