对OV2640的寄存器进行改写和读取操作
(全部操作均基于OV2640的代码实现)
一、操作原理
1、(对OV2640的寄存器进行写入操作)使用函数:
SCCB_WR_Reg(u8 reg,u8 data);
(1)返回值:0,成功;1,失败;
(2)源代码:
u8 SCCB_WR_Reg(u8 reg,u8 data)
{
u8 res=0;
SCCB_Start(); //启动SCCB传输
if(SCCB_WR_Byte(SCCB_ID))res=1; //写器件ID
delay_us(100);
if(SCCB_WR_Byte(reg))res=1; //写寄存器地址
delay_us(100);
if(SCCB_WR_Byte(data))res=1; //写数据
SCCB_Stop();
return res;
}
2、(读寄存器)使用函数:
SCCB_RD_Reg(u8 reg);
(1)返回值:读到的寄存器的值;
(2)源代码:
u8 SCCB_RD_Reg(u8 reg)
{
u8 val=0;
SCCB_Start(); //启动SCCB传输
SCCB_WR_Byte(SCCB_ID); //写器件ID
delay_us(100);
SCCB_WR_Byte(reg); //写寄存器地址
delay_us(100);
SCCB_Stop();
delay_us(100);
//设置寄存器地址,然后才是读
SCCB_Start();
SCCB_WR_Byte(SCCB_ID|0X01); //发送读命令
delay_us(100);
val=SCCB_RD_Byte(); //读取数据
SCCB_No_Ack();
SCCB_Stop();
return val;
}
3、实例:
(1)对OV2640的寄存器进行改写,并进行读取后显示在LCD上(源代码):
u16 test;
SCCB_WR_Reg(0x24,0x77);
test=SCCB_RD_Reg(0x24);
LCD_ShowNum(10,20,test,4,16);
LCD_ShowNum(20,40,test,5,16);
LCD_ShowNum(30,60,test,6,16);
LCD_ShowNum(40,80,test,5,16);
LCD_ShowNum(50,100,test,6,16);
LCD_ShowNum(60,120,test,7,16);
LCD_ShowNum(70,140,test,8,16);
LCD_ShowNum(80,240,test,9,16);
(2)对OV2640的芯片地址(厂家地址)进行读取并显示(源代码):
SCCB_Init(); //初始化SCCB接口
u16 reg;
reg=SCCB_RD_Reg(OV2640_SENSOR_MIDH); //读取厂家ID高八位
reg|=SCCB_RD_Reg(OV2640_SENSOR_MIDL); //读取厂家ID低八位
reg=SCCB_RD_Reg(OV2640_SENSOR_PIDH); //读取厂家ID高八位
reg<<=8;
reg|=SCCB_RD_Reg(OV2640_SENSOR_PIDL); //读取厂家ID低八位
//依次显示厂家ID
LCD_ShowNum(10,20,reg,4,16);
LCD_ShowNum(20,40,reg,5,16);
LCD_ShowNum(30,60,reg,6,16);
LCD_ShowNum(40,80,reg,5,16);
LCD_ShowNum(50,100,reg,6,16);
LCD_ShowNum(60,120,reg,7,16);
LCD_ShowNum(70,140,reg,8,16);
LCD_ShowNum(80,240,reg,9,16);