这些寄存器在代码里表现为一堆宏定义- /*OV7725寄存器宏定义*/
- #define GAIN 0x00
- #define BLUE 0x01
- #define RED 0x02
- #define GREEN 0x03
- #define BAVG 0x05
- #define GAVG 0x06
- …………
复制代码
模块初始化
引脚定义
- //D0~D7:PA0~PA7 VSYNC:PA8
- //WRST:PB13 RRST:PB14 OE:PB5 RCLK:PB6 WEN:PB7 SDA:PB8 SCL:PB9
- #define OV7725_VSYNC PAin(8)
- #define OV7725_WRST PBout(13)
- #define OV7725_WREN PBout(7)
- #define OV7725_RCK_H GPIOB->BSRR=1<<6
- #define OV7725_RCK_L GPIOB->BRR=1<<6
- #define OV7725_RRST PBout(14)
- #define OV7725_CS PBout(5)
复制代码
- #define SCCB_SCL PBout(9) //SCL
- #define SCCB_SDA PBout(8) //SDA
- #define SCCB_READ_SDA PBin(8) //ÊäÈëSDA
复制代码
我使用的是杜邦线连接如,IO口是自己重新定义的(全使用普通IO即可),STM32F1系列的PB3,PB4,PA13,PA14,PA15用于JTAG,如果有使用到其中的引脚,需要进行特殊配置,具体可参考网上更多教程。当时使用PB3,PB4作为SCCB的引脚,出现问题才发现这个原因。
初始化
写寄存器的函数,寄存器的配置都是通过这个函数
- u8 SCCB_WR_Reg(u8 reg,u8 data)
- {
- u8 res=0;
- SCCB_Start(); //启动SCCB传输
- if(SCCB_WR_Byte(SCCB_ID))res=1; //写器件ID,为0x42
- delay_us(100);
- if(SCCB_WR_Byte(reg))res=1; //写寄存器地址,直接写对应的寄存器地址
- delay_us(100);
- if(SCCB_WR_Byte(data))res=1; //写数据,根据寄存器功能写对应数据
- SCCB_Stop();
- return res;
- }
复制代码
将要配置的寄存器地址和对应的值,存在一个二维数组里边
- //初始化寄存器系列及其对应的值
- const u8 ov7725_init_reg_tb1[][2]=
- {
- /*输出窗口设置*/
- {CLKRC, 0x00}, //clock config
- {COM7, 0x06}, //VGA RGB565
- {HSTART, 0x3f}, //水平起始位置
- {HSIZE, 0x50}, //水平尺寸
- {VSTRT, 0x03}, //垂直其实位置
- ......
复制代码
初始化时,在循环语句调用写寄存器的函数,依次写入寄存器的地址和对应的值,即可完成寄存器的配置
- //初始化OV7725,采用QVGA分辨率(320*240)
- for(i=0;i<sizeof(ov7725_init_reg_tb1)/sizeof(ov7725_init_reg_tb1[0]);i++)
- {
- SCCB_WR_Reg(ov7725_init_reg_tb1[0],ov7725_init_reg_tb1[1]);
- }
复制代码
|