ATK-OV7670模块图像采集过程
1.等待OV7670帧同步信号(vsync)
2.fiofo写指针复位(fifo_wrst=0)
3.fifo写使能(fifo_wfn=1)
4.等待第二个帧同步信号(vsync)
5.fifo写禁止(fifo_wen=0)
ATK-ov7670模块图像采集过程
1.等待ov7670帧同步信号(vsync)
2.fifo写指针复位(fifo_wrst=0)
3.fifo写使能(fifo_wen=1)
4.等待第二个帧同步信号(vsy’n’c)
5.fifo写禁止(fifo_wen=0)
ATK-OV7670模块图像数据读取过程
1.fifo读指针复位(fifo_rrst=0)
2.输出读fifo时钟(fifo_rclk)
3.读第一个像素高字节(D【7:0】)
4.输出读fifo时钟(fifo_rck)
5.读第一个像素低字节(D[7:0])
6.输出读fifo时钟(fifo_rclk)
7.读第二像素的高字节(D[7:0])
8…输出读fifo时钟(fifo_rclk)
9.循环
驱动函数
SCCB_INIT
//IO操作函数
#define SCCB_SCL PDout(3) //SCL
#define SCCB_SDA PGout(13) //SDA
#define SCCB_SDA_IN() {GPIOG->CRH&=0XFF0FFFFF;GPIOG->CRH|=0X00800000;}
//GPIOG->CRH&=0XFF0FFFFF清除GPIOG->CRH|=0X00800000;}13位设置为8.就是带上拉的输入。
#define SCCB_SDA_OUT() {GPIOG->CRH&=0XFF0FFFFF;GPIOG->CRH|=0X00300000;}
//GPIOG->CRH&=0XFF0FFFFF清除,GPIOG->CRH|=0X00300000;}设置为3,就是推完输出
接下来初始化SCCB接口
//初始化SCCB接口
//CHECK OK
void SCCB_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE); //使能PB端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; // 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_SetBits(GPIOG,GPIO_Pin_13); // 输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; // 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //输输出
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_SetBits(GPIOD,GPIO_Pin_3); // 输出高
SCCB_SDA_OUT(); //推完输出模式
}
//SCCB起始信号
//当时钟为高的时候,数据线的高到低,为SCCB起始信号
//在激活状态下,SDA和SCL均为低电平
void SCCB_Start(void)
{
SCCB_SDA=1; //数据线高电平
SCCB_SCL=1; //在时钟线高的时候数据线由高至低
delay_us(50);
SCCB_SDA=0;
delay_us(50);
SCCB_SCL=0; //数据线恢复低电平,单操作函数必要
}
//SCCB停止信号
//当时钟为高的时候,数据线的低到高,为SCCB停止信号
//空闲状况下,SDA,SCL均为高电平
void SCCB_Stop(void)
{
SCCB_SDA=0;
delay_us(50);
SCCB_SCL=1;
delay_us(50);
SCCB_SDA=1;
delay_us(50);
}
//产生NA信号
void SCCB_No_Ack(void)
{
delay_us(50);
SCCB_SDA=1;
SCCB_SCL=1;
delay_us(50);
SCCB_SCL=0;
delay_us(50);
SCCB_SDA=0;
delay_us(50);
}