完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
以下是我写的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 for(j_column=0;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); } |
|
相关推荐
1个回答
|
|
看起来读FIFO似乎没有问题,倒是你的场中断处理似乎有问题,OV7670_VSYN_C这个变量是怎么控制的呢?在主程序中清零吗?
从你的程序思路来看,似乎是有个定时产生场同步的外设周期产生同步信号,这个同步信号接到了CPU的中断输入引脚上,然后在中断程序里面使能OV7670写FIFO,写一个固定时间后再禁止OV7670写入。 这样操作每帧读到的数据都不太可能会对齐,那么得到的图像显示就会是乱七八糟的。 我认为还是应该以OV7670的行同步、帧同步来控制FIFO的写入和读出,在帧同步中断中允许写FIFO,并根据像素速率计算好开始读出一帧数据的起始时间,启动定时器计时,然后退出中断。在定时器中断函数里读出一帧数据。 这里还要提一下的是,在图像数据处理时,外部中断处理函数中尽可能代码简洁、快速执行完毕,而不要在中断处理函数里放长延时和大量数据处理操作,这样CPU的效率会非常低。使用FIFO的目的除了解决速度匹配问题,还有一个重要原因就是为了避免图像数据的读写占用CPU的处理时间。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
991 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
970 浏览 2 评论
2080 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1177 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1599 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 21:44 , Processed in 0.569228 second(s), Total 72, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号