注册 登录
查看: 446|回复: 3

KL26的DMA问题啊,求助

[复制链接]
发表于 2014-3-18 00:36:26 | 显示全部楼层 |阅读模式
用的摄像头是岱墨的OV7620,代码是参照他的K60例程,采集出来的的图像只有一行。。。而且第一行的250列之后也是没采集。。。如果是隔一行采集的就能采集到图像,连续的行就不能采集,为什么。。。
  1. #define IMAGE_ROW 40
  2. #define IMAGE_COL 320

  3. #define OV7620_PCLK   7//OV7620_PCLK --->>PORTA_7
  4. #define OV7620_HREF   5//OV7620_HREF --->>PORTA_5
  5. #define OV7620_VSYN   6//OV7620_VSYN --->>PORTA_6


  6. uint8 Image_Dispose_EN;
  7. uint8 ImageBuf[IMAGE_ROW][IMAGE_COL];//图像信息存储缓冲区
  8. uint8 SampleFlag = 0;
  9. void DMA_PORT_Init(void)
  10. {
  11.    
  12.     port_init(PTA5, ALT1 | IRQ_RISING  | PULLDOWN | PF);//H
  13.     port_init(PTA6, ALT1 | IRQ_FALLING  | PULLUP | PF);//V
  14.      
  15.    set_vector_handler(PORTA_VECTORn ,port_int_isr);//加入中断向量表
  16.     enable_irq(PORTA_IRQn);//开启A端口中断
  17. }

  18. void port_int_isr(void)
  19. {
  20. // DisableInterrupts;//关总中断
  21.   static uint8  RowCnt   = 0;


  22.   
  23.   //---HREF行中断处理
  24.   if(PORTA_ISFR & (1 << OV7620_HREF))//PTB17触发中断  
  25.   {
  26.     PORTA_ISFR |= (1 << OV7620_HREF);        //写1清中断标志位
  27.    
  28.        if ( SampleFlag == 0 )         //不足一场时返回
  29.         {
  30.           return;
  31.         }  
  32.         
  33.         //-------------DAM初始化通道0,数据源为PTE,每次存在数组ImageBuf[]指针中,PCLK接PTA7触发,每次传输1个字节,每次触发传输320次
  34.         dma_portx2buff_init (DMA_CH0, (void *)&PTE_B2_IN, ImageBuf[RowCnt], PTA7, DMA_BYTE1, IMAGE_COL);
  35.         //----使能DMA,初始化的时候禁止DMA
  36.         DMA_EN(DMA_CH0);
  37.         RowCnt++;

  38.         if(RowCnt == IMAGE_ROW)
  39.         {
  40.           RowCnt = 0;
  41.           DMA_DIS(DMA_CH0);
  42.          
  43.          
  44.         }
  45.    
  46.    
  47.   }
  48.    
  49.   //---VSYN场中断处理
  50.   if(PORTA_ISFR & (1 << OV7620_VSYN))//PTB18触发中断  场中断
  51.   {
  52.    
  53.     PORTA_ISFR |= (1 << OV7620_VSYN);//写1清中断标志位
  54.    
  55.       RowCnt = 0;
  56.       SampleFlag = 1;
  57.    
  58.   }
  59.    
  60. // EnableInterrupts;//开总中断  
  61. }
  62. /******************************************************************************/
  63. //DMA0中断底层入口函数

  64. void dma0_isr(void)
  65. {
  66.     DMA_IRQ_CLEAN(DMA_CH0);//清除通道传输中断标志位
  67.     DMA_IRQ_DIS(DMA_CH0);//禁止DMA
  68.     Image_Dispose_EN = 1;
  69. }
  70. /******************************************************************************/

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2014-3-18 00:45:34 | 显示全部楼层
下面这段是我隔行采集的程序,帮忙看下,为什么不能连续采集行?为什么每一行都只能到250?摄像头的分辨率是320*240的啊,难道DMA跟不上它的速度?
  1. #define IMAGE_ROW 40
  2. #define IMAGE_COL 320

  3. #define OV7620_PCLK   7//OV7620_PCLK --->>PORTA_7
  4. #define OV7620_HREF   5//OV7620_HREF --->>PORTA_5
  5. #define OV7620_VSYN   6//OV7620_VSYN --->>PORTA_6


  6. uint8 Image_Dispose_EN;
  7. uint8 ImageBuf[IMAGE_ROW][IMAGE_COL];//图像信息存储缓冲区
  8. uint8 image_data[IMAGE_ROW][IMAGE_COL];
  9. const uint8 HREF_Table[IMAGE_ROW] =
  10. {0,  5, 10, 15, 20, 25, 30, 35, 40, 45,
  11. 49, 53, 57, 61, 65, 69, 73, 77, 81, 85,
  12. 88, 91, 94, 96, 98, 100,102,104,106,108,
  13. 110,112,114,116,118,120,122,124,126,128};//最大行数到239,列数最多250
  14. /******************************************************************************/

  15. void DMA_PORT_Init(void)
  16. {
  17.    
  18.     port_init(PTA5, ALT1 | IRQ_RISING  | PULLDOWN | PF);//H
  19.     port_init(PTA6, ALT1 | IRQ_FALLING  | PULLUP | PF);//V
  20.     set_vector_handler(PORTA_VECTORn ,porte_int_isr);  
  21.     enable_irq(PORTA_IRQn);

  22. }

  23. //OV7620行场中断处理函数

  24. void porte_int_isr(void)
  25. {
  26.   static uint8  RowCnt   = 0;
  27.   static uint8  Imagerow = 0;

  28.   
  29.   //---HREF行中断处理
  30.   if(PORTA_ISFR & (1 << OV7620_HREF))//PTB17触发中断  
  31.   {
  32.     PORTA_ISFR |= (1 << OV7620_HREF);        //写1清中断标志位
  33.    
  34.     if(RowCnt == HREF_Table[Imagerow])
  35.     {
  36.       
  37.       
  38.       
  39.       //for(uint16 i=0; i<170; i++)  asm("nop");//延时一段时间
  40.       //DAM初始化通道0,数据源为PTE,每次存在数组ImageBuf[]指针中,PCLK接PTA7触发,每次传输1个字节,每次触发传输IMAGE_COL次
  41.       dma_portx2buff_init (DMA_CH0, (void *)&PTE_B2_IN, ImageBuf[Imagerow], PTA7, DMA_BYTE1, IMAGE_COL);
  42.       
  43.       //DMA_EN(DMA_CH0);
  44.       //允许DMA通道传输
  45.       Imagerow ++;
  46.     }
  47.     else    DMA_DIS(DMA_CH0);
  48.       
  49.     RowCnt ++;

  50.   }
  51.    
  52.   //---VSYN场中断处理
  53.   if(PORTA_ISFR & (1 << OV7620_VSYN))//PTB18触发中断  场中断
  54.   {
  55.     PORTA_ISFR |= (1 << OV7620_VSYN);//写1清中断标志位
  56.     DMA_DIS(DMA_CH0);
  57.     RowCnt   = 0;
  58.     Imagerow = 0;
  59.   }
  60.       
  61. }
  62. /******************************************************************************/
  63. //DMA0中断底层入口函数

  64. void dma0_isr(void)
  65. {
  66.     DMA_IRQ_CLEAN(DMA_CH0);//清除通道传输中断标志位
  67.     DMA_IRQ_DIS(DMA_CH0);//禁止DMA
  68.     Image_Dispose_EN = 1;
  69. }
  70. /******************************************************************************/

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2014-7-2 21:18:54 | 显示全部楼层
楼主,你解决这个问题了吗,我也遇到这个问题了,已经困扰了好几天了
回复 支持 反对

使用道具 举报

发表于 2014-7-2 23:15:13 | 显示全部楼层
Venice 发表于 2014-3-18 00:45
下面这段是我隔行采集的程序,帮忙看下,为什么不能连续采集行?为什么每一行都只能到250?摄像头的分辨率是 ...

速度跟不上,之前我用K60的时候,100M主频只能采240列左右,超频到120就可以才300列了,KL26,不建议超频太多,不稳定,到时候烦都烦死你
回复 支持 反对

使用道具 举报

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

本版积分规则

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