|
static void SCCB_Delay_10us(word time)
{
word i , j ;
for(i = 0 ; i < time ; i++)
for(j = 0 ; j < 125 ; j++) ;
}
/* SCCB初始化 */
void SCCB_Init(void)
{
SCL_OUT() ; // 设置SCL引脚为输出引脚
SDA_OUT() ; // 设置SDA引脚为输出引脚
}
/* SCCB协议开始信号 */
static void Sccb_Start(void)
{
CLOCK_HIGH(); //开始信号为在时钟为高时数据有一个下降沿
DATA_HIGH() ;
SCCB_Delay_10us(1);
DATA_LOW();
SCCB_Delay_10us(1);
CLOCK_LOW();
SCCB_Delay_10us(1);
}
/* SCCB协议结束信号 */
static void Sccb_End(void)
{
DATA_LOW(); //结束信号为在时钟为高时数据有一个上升沿
SCCB_Delay_10us(1);
CLOCK_HIGH();
SCCB_Delay_10us(1);
DATA_HIGH();
SCCB_Delay_10us(1);
CLOCK_LOW() ;
SCCB_Delay_10us(1);
}
/* SCCB协议发送数据 */
static void Sccb_Send_Byte(byte data)
{
word i = 0 ;
for(i = 0 ; i < 8 ; i++) //并行数据转串行输出,串行数据输出的顺序为先高位再低位
{
if(data & 0x80) // 根据数据的最高位控制数据引脚
{ DATA_HIGH() ; }
else
{ DATA_LOW() ; }
SCCB_Delay_10us(1) ;
CLOCK_HIGH() ; // 通过发起时钟并延时发送1位数据
SCCB_Delay_10us(1) ;
CLOCK_LOW() ;
SCCB_Delay_10us(1) ;
data <<= 1 ; // 数据左移,即发送下一位数据
}
DATA_HIGH() ; // 发送第9位数据,可忽略
SCCB_Delay_10us(1) ;
CLOCK_HIGH() ;
SCCB_Delay_10us(1) ;
CLOCK_LOW() ;
SCCB_Delay_10us(1) ;
}
/* SCCB设置一个寄存器 */
void Sccb_Send_Data(byte add , byte data)
{
Sccb_Start() ; // 发送开始信号
Sccb_Send_Byte(OV7620) ; // 发送ov7620的地址
Sccb_Send_Byte(add) ; // 发送子地址(要设置的寄存器)
Sccb_Send_Byte(data) ; // 发送数据
Sccb_End() ; // 发送结束信号
SCCB_Delay_10us(10) ; // 延时
} |
|