微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > FIFO程序有问题!求解答。。。。。

FIFO程序有问题!求解答。。。。。

时间:10-02 整理:3721RD 点击:
以下是我写的FIFO(AL422B)的程序,不知道哪里出错了。求解答。(我是想用OV760+FIFO的采集图片的,但是调试的时候调不出来)

说明:操作平台为MC9S12芯片,频率为40MHZ。
FIFO(AL422B)的RE和OE引脚接在一起为CS
//FIFO 读复位
void AL422B_readreset(void) {
    AL422B_CS_L = 0;  //读使能
    AL422B_RRST_L =0;        //读指针复位
    AL422B_RCLK_L;          //至少需要一个时钟周期的跳变才能复位
    AL422B_RCLK_H;
    AL422B_RCLK_L;         
    AL422B_RCLK_H;
    AL422B_RRST_L = 1;
}
//FIFO 读数据
void AL422B_read(void) {
   AL422B_readreset(); //读复位.复位的下一个脉冲到来时,就输出有用数据了
   for(i_row=0;i_row<ROW;i_row++) {
      for(j_column=0;j_column<COLUMN;j_column++) {
              AL422B_RCLK_L;
                                  __asm();
                                 __asm();
                          AL422B_RCLK_H;
                                  __asm();
                                 __asm();
                    Image_Data[i_row][j_column]= PORTA;        ////在上升沿的时候读取数据
                            }
      }
    AL422B_CS_L = 1;//关闭读使能
}

// 中断处理函数
interrupt 8 void VSYN_Interrupt(void)
{
  if(0==OV7670_VSYN_C) {
     AL422B_WRST_L = 1;
      _asm();
     AL422B_WRST_L = 0; //写指针复位  
     AL422B_WEN_H = 1; //写使能,跟OV7670的HREF接到与非门,与非门的输出端接FIFO的/WE
      Delay(6000);
    AL422B_WEN_H = 1; //写使能
     AL422B_WRST_L = 1;
     OV7670_VSYN_C = 1;
     }
  else if(1==OV7670_VSYN_C) {
   AL422B_WEN_H = 0;  //禁止此时写数据
    OV7670_VSYN_C = 2;
     }
  TFLG1_C1F = 1; //清场中断
}

//延时函数
void Delay(uint time)               
{
    while(time--!=0);
}

看起来读FIFO似乎没有问题,倒是你的场中断处理似乎有问题,OV7670_VSYN_C这个变量是怎么控制的呢?在主程序中清零吗?
从你的程序思路来看,似乎是有个定时产生场同步的外设周期产生同步信号,这个同步信号接到了CPU的中断输入引脚上,然后在中断程序里面使能OV7670写FIFO,写一个固定时间后再禁止OV7670写入。
这样操作每帧读到的数据都不太可能会对齐,那么得到的图像显示就会是乱七八糟的。
我认为还是应该以OV7670的行同步、帧同步来控制FIFO的写入和读出,在帧同步中断中允许写FIFO,并根据像素速率计算好开始读出一帧数据的起始时间,启动定时器计时,然后退出中断。在定时器中断函数里读出一帧数据。
这里还要提一下的是,在图像数据处理时,外部中断处理函数中尽可能代码简洁、快速执行完毕,而不要在中断处理函数里放长延时和大量数据处理操作,这样CPU的效率会非常低。使用FIFO的目的除了解决速度匹配问题,还有一个重要原因就是为了避免图像数据的读写占用CPU的处理时间。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top