智能车制作

标题: 不得已发帖求助,CCD+ADC+DMA出问题了 [打印本页]

作者: 568581185    时间: 2012-4-23 02:04
标题: 不得已发帖求助,CCD+ADC+DMA出问题了
最近搞K60,一直在搞采集数据,今天发现一旦在行中断里使能了DMA通道就会出现行中断时间被拉长很多倍,基本感觉是2S一次行中断,这个和PAL制式的行中断差了317倍,实在想不通,求高手指点指点
void porta_isr(void)   //hang interrupt
{

  PORTA_PCR28 |= PORT_PCR_ISF_MASK;
  gpio_turn(PORTA,14);    //指示行中断

  line++;
  if(line==line_tab[row])
  {
    for(j=0;j<=170;j++)
    {
      if(j<30)  {;}
      else
      {
        LIU_ADC_SE_Get(ADC0_BASE_PTR, 16);   //设置ADC读值通道,此处使用了ADC0_SEL16
       //DMA_ERQ|=DMA_ERQ_ERQ0_MASK;//加了这句后,行中断时序就乱了
      }
    }
    row++;
    if(line==310)  image_over_flag = 1;
  }
if (line > 310)
  {
        disable_irq(87);
  }

求指点,感激不尽

作者: luojihao24669    时间: 2012-4-23 07:19
DMA_ERQ|=DMA_ERQ_ERQ0_MASK;//加了这句后,行中断时序就乱了
这是硬件触发时能,你要用的是软触,还是硬件触发。
还有你一次DMA传输几字节。请把你DMA初始化的贴出来
作者: 568581185    时间: 2012-4-23 13:53
luojihao24669 发表于 2012-4-23 07:19
DMA_ERQ|=DMA_ERQ_ERQ0_MASK;//加了这句后,行中断时序就乱了
这是硬件触发时能,你要用的是软触,还是硬件 ...

void dma_init(){
  SIM_SCGC6|=SIM_SCGC6_DMAMUX_MASK;//打开DMA多路复用器时钟
  SIM_SCGC7|=SIM_SCGC7_DMA_MASK;//打开DMA模块时钟
  DMAMUX_CHCFG0=DMAMUX_CHCFG_SOURCE(40);//DMA通道0对应40号DMA请求,即ADC0
  DMA_TCD0_SADDR = (uint32_t)&(ADC_R_REG(ADC0_BASE_PTR, 0));
  
  DMA_TCD0_SOFF = 0;//每次传送源地址不变
  DMA_TCD0_CITER_ELINKNO=DMA_CITER_ELINKNO_CITER(ROW);//当前主循环次数,采集点数
  DMA_TCD0_BITER_ELINKNO=DMA_BITER_ELINKNO_BITER(ROW);//起始主循环次数,采集点数
  DMA_TCD0_ATTR = DMA_ATTR_SSIZE(0) | DMA_ATTR_DSIZE(0);//源数据宽度8bit,目的数据宽度8bit
  DMA_TCD0_NBYTES_MLNO = DMA_NBYTES_MLNO_NBYTES(1);//每次读取一字节
  DMA_TCD0_SLAST = 0;//主循环结束后源地址0回写tcd
  DMA_TCD0_DLASTSGA = 0;
  DMA_TCD0_DADDR=(uint32)video;//设置目的地址,video数组第一个元素
  DMA_TCD0_DOFF=1;//每次写目的地址加1
  DMA_TCD0_CSR= DMA_CSR_DREQ_MASK;//DMA通道0主循环结束后停止硬件请求
  DMA_TCD0_CSR|=DMA_CSR_INTMAJOR_MASK;//使能DMA0中断
  DMAMUX_CHCFG0|=DMAMUX_CHCFG_ENBL_MASK;//DMA通道0使能
  //DMA_TCD0_CSR|=DMA_CSR_START_MASK;
}
//谢谢 帮忙看下哈
作者: ai756036    时间: 2012-4-23 16:21
学习 ~求答案
作者: luojihao24669    时间: 2012-4-23 17:16
ROW=?????
作者: 568581185    时间: 2012-4-23 19:49
luojihao24669 发表于 2012-4-23 17:16
ROW=?????

ROW=140
就是要采集的列数

作者: 568581185    时间: 2012-4-23 19:50
luojihao24669 发表于 2012-4-23 17:16
ROW=?????

能不能加QQ聊下啊?
作者: luojihao24669    时间: 2012-4-23 23:26
if(line==line_tab[row])
  {
    for(j=0;j<=170;j++)
    {
      if(j<30)  {;}
      else
      {
        LIU_ADC_SE_Get(ADC0_BASE_PTR, 16);   //设置ADC读值通道,此处使用了ADC0_SEL16
       //DMA_ERQ|=DMA_ERQ_ERQ0_MASK;//加了这句后,行中断时序就乱了
      }
    }
    row++;
中的:
for(j=0;j<=170;j++)
    {
      if(j<30)  {;}
      else
      {
        LIU_ADC_SE_Get(ADC0_BASE_PTR, 16);   //设置ADC读值通道,此处使用了ADC0_SEL16
       //DMA_ERQ|=DMA_ERQ_ERQ0_MASK;//加了这句后,行中断时序就乱了
      }
你一个行中断来,就采集170-30---140个点对吧??
作者: luojihao24669    时间: 2012-4-23 23:30
//DMA_ERQ|=DMA_ERQ_ERQ0_MASK;//加了这句后,行中断时序就乱了
但是你的DMA里设置的每次传输的字节数是ROW=140,你本想行来了,想采140个点,结果程序中每一个点就开启DMA传输140个字节。你看这是不是有问题。
作者: 568581185    时间: 2012-4-23 23:35
luojihao24669 发表于 2012-4-23 23:30
//DMA_ERQ|=DMA_ERQ_ERQ0_MASK;//加了这句后,行中断时序就乱了
但是你的DMA里设置的每次传输的字节数是R ...

哦,已经找到了大概原因,但是出来的灰度值貌似不太像图像呢。。。
串口看到的图像大部分都是黑的[attach]23545[/attach]


作者: 笨鹅    时间: 2012-7-9 08:15
楼主行场中断怎么初始化的呀?我的行场中断进不去呀




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2