智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 12768|回复: 44
打印 上一主题 下一主题

K10DMA采集图像问题 摄像头OV7620

  [复制链接]

7

主题

149

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1404
QQ
威望
656
贡献
612
兑换币
12
注册时间
2011-3-1
在线时间
68 小时
跳转到指定楼层
1#
发表于 2012-4-12 23:01:30 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
首先我采用的是摄像头的PCLK信号作为DMA的触发信号。
然后发现这个信号触发不了,用示波器一看,发现PCLK出来的是个三角波,而且周期是74ns.
所以触发不了,也是很正常的。

然后我就直接将HREF行中断信号作为触发DMA的请求信号。因为来一个行中断,这个时候就应该用DMA传送一行数据了。
结果我发现还是不行。因为还要使能通道:DMA_ERQ|=DMA_ERQ_ERQ0_MASK;//使能通道0硬件DMA请求

这就有问题了,因为一个是DMA的中断触发,和这个使能是个什么样的关系呢。
为了采到数据,我直接在主函数中先执行DMA_ERQ|=DMA_ERQ_ERQ0_MASK;
然后我始终只能采回来一行数据。
求解,该怎么做?

附上代码吧
/*
* ImageAcquisition.h
*
*  Created on: 2012-3-27
*      Author: damon
*/
#ifndef IMAGE_ACQUISITION_H
#define IMAGE_ACQUISITION_H
#include "derivative.h" /* include peripheral declarations */
#define ENDROW 240        //OV7620,每场240行
#define  H 27
#define  V 160
typedef unsigned char  uint8;  /*  8 bits */
typedef unsigned short int uint16; /* 16 bits */
typedef unsigned long int uint32; /* 32 bits */
typedef char       int8;   /*  8 bits */
typedef short int         int16;  /* 16 bits */
typedef long int      int32;  /* 32 bits */

unsigned int row=0;//摄像头行计数,最大240
uint8 video[H][V];//存放数据数组
unsigned int imagerow=0;//采集行计数,最大H
unsigned int const data_table[H]={46,53,68,83,97,109,120,130,139,147,
                                  155,163,170,178,186,192,197,202,206,210,
                                  214,218,222,225,228,231,234};//需采集数据的行,2cm一行实际测得
void caiji_IO_init()
{
SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK | SIM_SCGC5_PORTB_MASK ;
PORTA_PCR4= PORT_PCR_MUX(1)|PORT_PCR_IRQC(9);  //A4引脚设置为GPIO模式,上升沿中断,行中断
PORTB_PCR10= PORT_PCR_MUX(1)|PORT_PCR_IRQC(10); //B10引脚设置为GPIO模式,下降沿中断,场中断
PORTA_PCR5=PORT_PCR_MUX(1)|PORT_PCR_IRQC(1); //A5引脚设置为GPIO模式,上升沿触发DMA请求

/*PTD0-PTD7 as GPIO input*/
PORTD_PCR0 = PORT_PCR_MUX(1); //PTD0 as open drain input
PORTD_PCR1 = PORT_PCR_MUX(1); //PTD1 as open drain input
PORTD_PCR2 = PORT_PCR_MUX(1); //PTD2 as open drain input
PORTD_PCR3 = PORT_PCR_MUX(1); //PTD3 as open drain input
PORTD_PCR4 = PORT_PCR_MUX(1); //PTD4 as open drain input
PORTD_PCR5 = PORT_PCR_MUX(1); //PTD5 as open drain input
PORTD_PCR6 = PORT_PCR_MUX(1); //PTD6 as open drain input
PORTD_PCR7 = PORT_PCR_MUX(1); //PTD7 as open drain input
GPIOD_PDDR = 0x0;    //PTD0-PED7 as GPIO input;
}
void DMA0_Init(void)
{
SIM_SCGC6|=SIM_SCGC6_DMAMUX_MASK;//打开DMA多路复用器时钟
SIM_SCGC7|=SIM_SCGC7_DMA_MASK;//打开DMA模块时钟
DMAMUX_CHCFG0=DMAMUX_CHCFG_SOURCE(49);//DMA通道0对应49号DMA请求,即PORTA


DMA_TCD0_CITER_ELINKNO=DMA_CITER_ELINKNO_CITER(V);//当前主循环次数,采集点数
DMA_TCD0_BITER_ELINKNO=DMA_BITER_ELINKNO_BITER(V);//起始主循环次数,采集点数
DMA_TCD0_SADDR=(uint32)&GPIOD_PDIR;//设置源地址GPIO口,PORTD


DMA_TCD0_SOFF=0;//每次传送源地址不变
//DMA_TCD1_NBYTES_MLOFFYES=DMA_NBYTES_MLOFFYES_NBYTES(1)+DMA_NBYTES_MLOFFNO_SMLOE_MASK+DMA_NBYTES_MLOFFYES_MLOFF(-4);//传送4字节
DMA_TCD0_NBYTES_MLNO=DMA_NBYTES_MLNO_NBYTES(1);//每次读取一字节
DMA_TCD0_SLAST=0;//主循环结束后源地址0回写tcd
DMA_TCD0_DLASTSGA=0;//主循环结束后目的地址0回写tcd
DMA_TCD0_DADDR=(uint32)video;//设置目的地址,video数组第一个元素
DMA_TCD0_DOFF=1;//每次写目的地址加1
DMA_TCD0_ATTR=DMA_ATTR_SSIZE(0)+DMA_ATTR_DSIZE(0);//源数据宽度8bit,目的数据宽度8bit
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_ERQ|=DMA_ERQ_ERQ0_MASK;//使能通道0硬件DMA请求  (我在初如化的时候来开启,这样才进了中断,不然不能进中断。因为我用HREF来触发DMA,而又要在DMA中才来开启使能,所以进不了中断。我想这应该是原因

}
void DMA_CHO_ISR(void)
{
DMA_INT|=DMA_INT_INT0_MASK;//清除通道0中断
row_F[imagerow]=1;//采集完成标志
imagerow++;
}
void enable_irq (int irq)
{
    int div;
    if (irq > 91) irq=91;//确定irq号为有效的irq号
    div = irq/32;//确定对应的寄存器号
    switch (div)
    {
     case 0x0:
              NVICICPR0 = 1 << (irq%32);
              NVICISER0 = 1 << (irq%32);
              break;
     case 0x1:
              NVICICPR1 = 1 << (irq%32);
              NVICISER1 = 1 << (irq%32);
              break;
     case 0x2:
              NVICICPR2 = 1 << (irq%32);
              NVICISER2 = 1 << (irq%32);
              break;
    }              
}
//-------------------------------------------------------------------------*
//函数名: disable_irq                                                      *
//功  能: 禁止irq中断                                                      *
//参  数: irq:irq号                *
//返  回: 无                                                               *
//说  明: irq号不是中断向量号                                              *
//-------------------------------------------------------------------------*
void disable_irq (int irq)
{
    int div;
   
    //确定irq号为有效的irq号
    if (irq > 91) irq=91;
   
    //确定对应的NVICISER
    div = irq/32;
   
    switch (div)
    {
     case 0x0:
               NVICICER0 = 1 << (irq%32);
              break;
     case 0x1:
              NVICICER1 = 1 << (irq%32);
              break;
     case 0x2:
              NVICICER2 = 1 << (irq%32);
              break;
    }              
}
void PORTB_ISR(void)//场中断,B10,下降沿中断
{
PORTA_PCR5|=PORT_PCR_ISF_MASK;//清除中断标志
DMA0_Init();
enable_irq(0);//使能DMA通道0完成中断
row=0;//初始化行
imagerow=0;//初始化采集行
enable_irq (87);//使能A口中断 ,A4行中断
}
void PORTA_ISR(void)
{
PORTA_PCR4|=PORT_PCR_ISF_MASK;//清除中断标志位
row++; //行计数
if(row==data_table[imagerow])//如果当前行数据应该采集
{
  DMA_ERQ|=DMA_ERQ_ERQ0_MASK;//使能通道0硬件DMA请求  
}
else if(row>=ENDROW) //一场完成,关闭行中断
{
  disable_irq (87);
    }
}
void Delay(unsigned int count)
{
unsigned int i;
for(;count > 0;count--)
  for(i = 0;i < 50000;i++);
}
#endif
//这个程序只能采集一行数据,求解解决方法

0

主题

14

帖子

0

精华

高级会员

Rank: 4

积分
525
威望
303
贡献
146
兑换币
10
注册时间
2012-3-13
在线时间
38 小时
毕业学校
徐工
45#
发表于 2012-7-22 10:30:12 | 只看该作者
太牛了
回复 支持 反对

使用道具 举报

2

主题

11

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
271
威望
171
贡献
38
兑换币
0
注册时间
2012-5-3
在线时间
31 小时
44#
发表于 2012-7-8 20:18:37 | 只看该作者
luojihao24669 发表于 2012-4-13 00:32
DMA_TCD0_NBYTES_MLNO=DMA_NBYTES_MLNO_NBYTES(1);//每次读取一字节
你用GPIOA05来当行触发DMA,每来一个行 ...

不好意思,麻烦您帮我解决个问题吧:
void GPIO_Init()
{
        PORTD_PCR0=PORT_PCR_MUX(1);
        PORTD_PCR1=PORT_PCR_MUX(1);
        PORTD_PCR2=PORT_PCR_MUX(1);
        PORTD_PCR3=PORT_PCR_MUX(1);
        PORTD_PCR4=PORT_PCR_MUX(1);//如果需要修改灰度,这里加上DMA的地址
        PORTD_PCR5=PORT_PCR_MUX(1);
        PORTD_PCR6=PORT_PCR_MUX(1);
        PORTD_PCR7=PORT_PCR_MUX(1);           
        GPIOD_PDDR&=0XFFFFFF00;//D0~D7设置为输入,数字摄像头8位灰度输入
        PORTB_PCR22=PORT_PCR_MUX(1)|PORT_PCR_IRQC(1);   //rise edge to triger the DMA transfer
        GPIOB_PDDR&=~(1<<22);                           //use as input
        PORTB_PCR23=PORT_PCR_MUX(1)|PORT_PCR_IRQC(9);   //rise edge to triger the HREF interrput
        GPIOB_PDDR&=~(1<<23);                           //use as input
        PORTA_PCR27=PORT_PCR_MUX(1)|PORT_PCR_IRQC(10);  //faling edge to triger the VSYNC interrput
        GPIOA_PDDR&=~(1<<27);                           //use as input         
不理解:最后的B22 B23 A27口的定义  比如PORTA_PCR27=PORT_PCR_MUX(1)|PORT_PCR_IRQC(10);  这里面的10是什么意思?怎么定义?要是我把A27改成A18脚,那括号里面的10 变不变???
求解决

回复 支持 反对

使用道具 举报

7

主题

149

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1404
QQ
威望
656
贡献
612
兑换币
12
注册时间
2011-3-1
在线时间
68 小时
43#
 楼主| 发表于 2012-7-8 18:26:34 | 只看该作者
tujunjie 发表于 2012-7-6 08:52
您好!我的DMA采集程序和你差不多,但我现在还是没有采集出来,能不能请教一下呢?谢谢

补充内容 (2012-7- ...

279788046
回复 支持 反对

使用道具 举报

42

主题

299

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4405
QQ
威望
2280
贡献
1049
兑换币
767
注册时间
2011-11-29
在线时间
538 小时
42#
发表于 2012-7-6 08:52:37 | 只看该作者
您好!我的DMA采集程序和你差不多,但我现在还是没有采集出来,能不能请教一下呢?谢谢

补充内容 (2012-7-6 11:00):
·兄弟,qq交流一下,可以吗
回复 支持 反对

使用道具 举报

3

主题

386

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2879
威望
1542
贡献
801
兑换币
568
注册时间
2011-3-14
在线时间
268 小时
41#
发表于 2012-6-6 12:21:17 | 只看该作者
小顺子 发表于 2012-6-3 20:28
那程序应该怎样改 呢?说的是中断

如果你开始用PCLK触发DMA中断,那么现在只需要将PWM模拟的PCLK接到你触发DMA中断的管脚上,而摄像头的PCLK上不用接出来了瑟
回复 支持 反对

使用道具 举报

4

主题

487

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2981

活跃会员奖章优秀会员奖章

QQ
威望
2216
贡献
489
兑换币
53
注册时间
2010-11-10
在线时间
138 小时
40#
发表于 2012-6-4 11:02:12 | 只看该作者
lemon~cmc 发表于 2012-4-18 22:05
只有英文资料。给个建议就是还是静下心来看英文资料。我可以发你个例程。然后配合着看。别像我,带着猜想 ...


麻烦给我发一份例程呗 谢谢啦 刚刚开始弄K10的DMA 需向你请教一些问题
邮箱:xinmengwangran@sina.com

回复 支持 反对

使用道具 举报

5

主题

315

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2729
QQ
威望
1332
贡献
539
兑换币
76
注册时间
2011-2-27
在线时间
429 小时
39#
发表于 2012-6-3 23:31:58 | 只看该作者
小顺子 发表于 2012-6-3 20:26
怎样降低分辨率,难不成调焦距?

一个是选则小分辨率模式,2是分频采样
回复 支持 反对

使用道具 举报

0

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
400
威望
248
贡献
94
兑换币
4
注册时间
2012-3-11
在线时间
29 小时
毕业学校
厦门理工
38#
发表于 2012-6-3 20:28:06 | 只看该作者
筱明 发表于 2012-5-5 16:36
哥们儿,这个我也遇到了问题了 ,我们开始考虑的是用分频器分频PCLK,  后来选择了用PWM模拟PCLK  结果还是 ...

那程序应该怎样改 呢?说的是中断
回复 支持 反对

使用道具 举报

0

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
400
威望
248
贡献
94
兑换币
4
注册时间
2012-3-11
在线时间
29 小时
毕业学校
厦门理工
37#
发表于 2012-6-3 20:26:31 | 只看该作者
luojihao24669 发表于 2012-4-13 00:53
74ns---------13多M,我K60 100M 主频采20M的信号都可以。如果你想用PCLK同步触发DMA的话,要么你7620用低 ...

怎样降低分辨率,难不成调焦距?
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-28 06:42 , Processed in 0.048905 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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