高中生
最后登录1970-1-1
在线时间 小时
注册时间2015-12-18
|
买了野火的OV7725,打算用K60采集一副图像,串口发送给电脑,用matlab打开并显示图像,然后
这算是比较好的图像了,拍摄的是蓝色和黄绿色,还能开清楚一点点东西。大多数图像其实是这样的:
问题有:
OV7725寄存器配置成 80*60 的图像,和视频里的 320*240不一样,我只改了读数据的次数,还有寄存器配置,还要改其他的吗?
我把程序贴上来吧
while(1)
{
if(vs_flag==2)
{
RRST_L; // FIFO prepare
RCLK_L;
delay_few();
RCLK_H;
RRST_H;
RCLK_L;
ij=0;
for(ii=0;ii<60;ii++)
{
DMA_EN(DMA_CH0);
for(jj=0;jj<160;jj++) // 80个点 160个数据 ,PCLK上升沿时FIFO输出数据,DMA是由PCLK的下降沿触发
{
RCLK_H;
RCLK_L;
}
// DMA的目的地址是BUFF,传输次数为160次。
for(iii=0;iii<160;iii=iii+2) // 把80个点的RGB数据存放好
{
R[ij]=(BUFF[iii] & 248)>>3; // 先取的是高八位 RGB565 即 BUFF[iii]为高八位
B[ij]=(BUFF[iii+1]) & 31;
G[ij]=((BUFF[iii] & 7)<<3) | ((BUFF[iii+1] & 224)>>5);
ij++;
}
}
printf(" \n\n R \n "); // 把数据发送出去
for(iii=0;iii<4800;iii++)
{
temm=R[iii];
printf(" %d ",temm );
}
printf(" \n\n G \n ");
for(iii=0;iii<4800;iii++)
{
temm=G[iii];
printf(" %d ",temm );
}
printf(" \n\n B \n ");
for(iii=0;iii<4800;iii++)
{
temm=B[iii];
printf(" %d ",temm );
}
vs_flag=0;
printf(" a photo end");
}
}
}
/*!
* @brief PORTB中断服务函数
* @since v5.0
*/
void PORTB_IRQHandler()
{
uint8 n = 0; //引脚号
uint32 flag = PORTB_ISFR;
PORTB_ISFR = ~0; //清中断标志位
n = 18; //场中断
if(flag & (1 << n)) //PTB18触发中断
{
if(vs_flag==0)
{
WRST_L;
WE_H;
vs_flag=1;
WE_H;
WRST_H;
}
else if(vs_flag==1)
{
WE_L;
vs_flag=2;
}
//camera_vsync();
}
}
大概的采集程序就这些,是逐行采集数据,然后在matlab上打印。然而图像是错误的,应该是数据错乱了,火哥求指点。
|
|