注册 登录
查看: 431|回复: 12

KL26摄像头每场只能采集一行

[复制链接]
发表于 2014-7-7 10:34:28 | 显示全部楼层 |阅读模式
用的是KL26但是每行只能采集一行,目的地址自加位DMA_DCR_DINC_MASK (传输后目的地址增加)也显示的是一,肿么破?
回复

使用道具 举报

发表于 2014-7-7 10:42:11 | 显示全部楼层
每行只能采集一行?什么意思?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-7 10:51:52 | 显示全部楼层
山外メ雲ジ 发表于 2014-7-7 10:42
每行只能采集一行?什么意思?

每场只能采集第一行,手残了一下
回复 支持 反对

使用道具 举报

发表于 2014-7-7 10:54:13 | 显示全部楼层
miss可可 发表于 2014-7-7 10:51
每场只能采集第一行,手残了一下

你用我们的鹰眼代码吗?

如果不是,那需要行中断里,设置下一行的地址,然后使能DMA硬件请求啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-7 11:02:57 | 显示全部楼层
就是这样设置的,用了一个数组作为目的地址,每次采集完地址加一,然后就使能了DMA硬件请求和中断
  1. if(usGather[usGetHang] == vusHangCount)                         //如果是所需要的行,使能DMA传输
  2.          {

  3.             DMA_EN(DMA_CH0);                                          //使能通道CHn 硬件请求
  4.             DMA_IRQ_EN(DMA_CH0);

  5.             usGetHang++;                                             //所需要的行
  6.          }
回复 支持 反对

使用道具 举报

发表于 2014-7-7 11:08:05 | 显示全部楼层
miss可可 发表于 2014-7-7 11:02
就是这样设置的,用了一个数组作为目的地址,每次采集完地址加一,然后就使能了DMA硬件请求和中断

目的地址,设置一下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-7 11:12:49 | 显示全部楼层
山外メ雲ジ 发表于 2014-7-7 10:54
你用我们的鹰眼代码吗?

如果不是,那需要行中断里,设置下一行的地址,然后使能DMA硬件请求啊

摄像头我用的是SONY CCD,我的DMA初始化是按照例程上的那样直接调用了一条DMA初始化语句,在行中断里把DMA通道关闭 并清除中断标志,设置下一行的地址不是在DMA初始化的函数里就有目的地址增量   DMA_DCR(CHn) =    (0
                       | DMA_DCR_SSIZE(byten)
                       | DMA_DCR_DSIZE(byten)
                       //| DMA_DCR_SINC_MASK                  //传输后源地址增加(根据位宽)
                      | DMA_DCR_DINC_MASK                  //传输后目的地址增加(根据位宽)
                       | DMA_DCR_CS_MASK                  // 0为不停得传输,直到BCR为0;1为一次请求传输一次
                       //| DMA_DCR_START_MASK               //软件触发传输
                       | DMA_DCR_ERQ_MASK                   //硬件触发传输(与上面START二选一)
                       | DMA_DCR_D_REQ_MASK                 //传输完成后硬件自动清ERQ

                       );
所以我就没有在行中断里设置下一行地址.
回复 支持 反对

使用道具 举报

发表于 2014-7-7 11:14:27 | 显示全部楼层
miss可可 发表于 2014-7-7 11:12
摄像头我用的是SONY CCD,我的DMA初始化是按照例程上的那样直接调用了一条DMA初始化语句,在行中断里把DMA ...

试下加入看看吧
另外,需要清PCLK的中断
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-7 11:18:25 | 显示全部楼层
山外メ雲ジ 发表于 2014-7-7 10:54
你用我们的鹰眼代码吗?

如果不是,那需要行中断里,设置下一行的地址,然后使能DMA硬件请求啊

这是我的DMA初始化函数。
void DMA_Init()
{
dma_portx2buff_init(DMA_CH0, (void * )&PTE_B2_IN, (void *)ucImageData, PTA17, DMA_BYTE1, 260);   
port_init(PTA17, ALT1 | DMA_RISING  | PULLDOWN | PF);
dma_repeat(DMA_CH0, (void *)&PTE_B2_IN, (void *)ucImageData,260);
}
这是我的DMA中断函数
  void DMA0_IRQHandler ()
{
  
  DMA_IRQ_DIS(DMA_CH0);
  DMA_IRQ_CLEAN(DMA_CH0);
  //DMA_IRQ_EN(DMA_CH0);                  
}
你看看有问题吗
回复 支持 反对

使用道具 举报

发表于 2014-7-7 11:32:17 | 显示全部楼层
miss可可 发表于 2014-7-7 11:18
这是我的DMA初始化函数。
void DMA_Init()
{

清pclk的中断标志位,就是 port里的标志位!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-7 16:51:01 | 显示全部楼层
山外メ雲ジ 发表于 2014-7-7 11:32
清pclk的中断标志位,就是 port里的标志位!!

我在port_int里加了PORT_ISFR_REG(PORTX_BASE(ptxn)) = (1<<PTn(ptxn));来清标志位。这样对吗?
然后我在行中断里加了
DMA_DAR(DMA_CH0) =  (uint32)ucImageData;
i++;
两条语句,但是还是只能采集一行。
是不是我没修改对啊?
回复 支持 反对

使用道具 举报

发表于 2014-7-7 17:16:52 | 显示全部楼层
miss可可 发表于 2014-7-7 16:51
我在port_int里加了PORT_ISFR_REG(PORTX_BASE(ptxn)) = (1

DMA_DAR(DMA_CH0) =  (uint32)ucImageData;

这里的地址,需要每一行的地址都不同吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-7 17:21:03 | 显示全部楼层
山外メ雲ジ 发表于 2014-7-7 17:16
DMA_DAR(DMA_CH0) =  (uint32)ucImageData;

这里的地址,需要每一行的地址都不同吧

我把imagedata设置成了一个数组uint8 ucImageData[HANG_MAX][ucLIE] = {0};
想要一行图像对应数组的一行
回复 支持 反对

使用道具 举报

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

本版积分规则

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