智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3374|回复: 10
打印 上一主题 下一主题

不得已发帖求助,CCD+ADC+DMA出问题了

[复制链接]

30

主题

838

帖子

0

精华

常驻嘉宾

mrguang.taobao.com

Rank: 8Rank: 8

积分
3047

资源大师奖章论坛元老奖章优秀会员奖章活跃会员奖章热心会员奖章在线王奖章

QQ
威望
1840
贡献
289
兑换币
15
注册时间
2010-12-3
在线时间
459 小时
跳转到指定楼层
1#
发表于 2012-4-23 02:04:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近搞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);
  }

求指点,感激不尽

5

主题

315

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2729
QQ
威望
1332
贡献
539
兑换币
76
注册时间
2011-2-27
在线时间
429 小时
2#
发表于 2012-4-23 07:19:14 | 只看该作者
DMA_ERQ|=DMA_ERQ_ERQ0_MASK;//加了这句后,行中断时序就乱了
这是硬件触发时能,你要用的是软触,还是硬件触发。
还有你一次DMA传输几字节。请把你DMA初始化的贴出来
回复 支持 反对

使用道具 举报

30

主题

838

帖子

0

精华

常驻嘉宾

mrguang.taobao.com

Rank: 8Rank: 8

积分
3047

资源大师奖章论坛元老奖章优秀会员奖章活跃会员奖章热心会员奖章在线王奖章

QQ
威望
1840
贡献
289
兑换币
15
注册时间
2010-12-3
在线时间
459 小时
3#
 楼主| 发表于 2012-4-23 13:53:55 | 只看该作者
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;
}
//谢谢 帮忙看下哈
回复 支持 反对

使用道具 举报

8

主题

91

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2322
QQ
威望
1352
贡献
508
兑换币
178
注册时间
2011-11-7
在线时间
231 小时
4#
发表于 2012-4-23 16:21:26 | 只看该作者
学习 ~求答案
回复 支持 反对

使用道具 举报

5

主题

315

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2729
QQ
威望
1332
贡献
539
兑换币
76
注册时间
2011-2-27
在线时间
429 小时
5#
发表于 2012-4-23 17:16:57 | 只看该作者
ROW=?????
回复 支持 反对

使用道具 举报

30

主题

838

帖子

0

精华

常驻嘉宾

mrguang.taobao.com

Rank: 8Rank: 8

积分
3047

资源大师奖章论坛元老奖章优秀会员奖章活跃会员奖章热心会员奖章在线王奖章

QQ
威望
1840
贡献
289
兑换币
15
注册时间
2010-12-3
在线时间
459 小时
6#
 楼主| 发表于 2012-4-23 19:49:43 | 只看该作者
luojihao24669 发表于 2012-4-23 17:16
ROW=?????

ROW=140
就是要采集的列数
回复 支持 反对

使用道具 举报

30

主题

838

帖子

0

精华

常驻嘉宾

mrguang.taobao.com

Rank: 8Rank: 8

积分
3047

资源大师奖章论坛元老奖章优秀会员奖章活跃会员奖章热心会员奖章在线王奖章

QQ
威望
1840
贡献
289
兑换币
15
注册时间
2010-12-3
在线时间
459 小时
7#
 楼主| 发表于 2012-4-23 19:50:01 | 只看该作者
luojihao24669 发表于 2012-4-23 17:16
ROW=?????

能不能加QQ聊下啊?
回复 支持 反对

使用道具 举报

5

主题

315

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2729
QQ
威望
1332
贡献
539
兑换币
76
注册时间
2011-2-27
在线时间
429 小时
8#
发表于 2012-4-23 23:26:22 | 只看该作者
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个点对吧??
回复 支持 反对

使用道具 举报

5

主题

315

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2729
QQ
威望
1332
贡献
539
兑换币
76
注册时间
2011-2-27
在线时间
429 小时
9#
发表于 2012-4-23 23:30:59 | 只看该作者
//DMA_ERQ|=DMA_ERQ_ERQ0_MASK;//加了这句后,行中断时序就乱了
但是你的DMA里设置的每次传输的字节数是ROW=140,你本想行来了,想采140个点,结果程序中每一个点就开启DMA传输140个字节。你看这是不是有问题。
回复 支持 反对

使用道具 举报

30

主题

838

帖子

0

精华

常驻嘉宾

mrguang.taobao.com

Rank: 8Rank: 8

积分
3047

资源大师奖章论坛元老奖章优秀会员奖章活跃会员奖章热心会员奖章在线王奖章

QQ
威望
1840
贡献
289
兑换币
15
注册时间
2010-12-3
在线时间
459 小时
10#
 楼主| 发表于 2012-4-23 23:35:51 | 只看该作者
luojihao24669 发表于 2012-4-23 23:30
//DMA_ERQ|=DMA_ERQ_ERQ0_MASK;//加了这句后,行中断时序就乱了
但是你的DMA里设置的每次传输的字节数是R ...

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-7-3 11:24 , Processed in 0.051979 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表