王官夫的SCCB

///////////////////////////////////////////////////////////////////////////
//功能:写OV7660寄存器
//返回:1-成功 0-失败
//guanfu_wang
unsigned char wr_Sensor_Reg(unsigned char regID, unsigned char regDat)
{
startSCCB();//发送SCCB 总线开始传输命令
if(0==SCCBwriteByte(0x42))//写地址
{
stopSCCB();//发送SCCB 总线停止传输命令
return(0);//错误返回
}
delay_us(100);
   if(0==SCCBwriteByte(regID))//积存器ID
{
stopSCCB();//发送SCCB 总线停止传输命令
return(0);//错误返回
}
delay_us(100);
   if(0==SCCBwriteByte(regDat))//写数据到积存器
{
stopSCCB();//发送SCCB 总线停止传输命令
return(0);//错误返回
}
   stopSCCB();//发送SCCB 总线停止传输命令

   return(1);//成功返回
}
////////////////////////////
//功能:读OV7660寄存器
//返回:1-成功 0-失败
//guanfu_wang
unsigned char rd_Sensor_Reg(unsigned char regID, unsigned char *regDat)
{
//通过写操作设置寄存器地址
startSCCB();
if(0==SCCBwriteByte(0x42))//写地址
{
stopSCCB();//发送SCCB 总线停止传输命令
return(0);//错误返回
}
delay_us(100);
   if(0==SCCBwriteByte(regID))//积存器ID
{
stopSCCB();//发送SCCB 总线停止传输命令
return(0);//错误返回
}
stopSCCB();//发送SCCB 总线停止传输命令

delay_us(100);

//设置寄存器地址后,才是读
startSCCB();
if(0==SCCBwriteByte(0x43))//读地址
{
stopSCCB();//发送SCCB 总线停止传输命令
return(0);//错误返回
}
delay_us(1000);
   *regDat=SCCBreadByte();//返回读到的值
   noAck();//发送NACK命令
   stopSCCB();//发送SCCB 总线停止传输命令
   return(1);//成功返回
}


/*
-----------------------------------------------
   功能: start命令,SCCB的起始信号
   参数: 无
 返回值: 无
-----------------------------------------------
*/
void startSCCB(void)
{
    SCCB_SID_H();     //数据线高电平
    delay_us(500);

    SCCB_SIC_H();    //在时钟线高的时候数据线由高至低
    delay_us(500);
 
    SCCB_SID_L();
    delay_us(500);

    SCCB_SIC_L();  //数据线恢复低电平,单操作函数必要
    delay_us(500);


}
/*
-----------------------------------------------
   功能: stop命令,SCCB的停止信号
   参数: 无
 返回值: 无
-----------------------------------------------
*/
void stopSCCB(void)
{
    SCCB_SID_L();
    delay_us(500);
 
    SCCB_SIC_H();
    delay_us(500);
  

    SCCB_SID_H();
    delay_us(500);
   
}

/*
-----------------------------------------------
   功能: noAck,用于连续读取中的最后一个结束周期
   参数: 无
 返回值: 无
-----------------------------------------------
*/
void noAck(void)
{

SCCB_SID_H();
delay_us(500);

SCCB_SIC_H();
delay_us(500);

SCCB_SIC_L();
delay_us(500);

SCCB_SID_L();
delay_us(500);

}

/*
-----------------------------------------------
   功能: 写入一个字节的数据到SCCB
   参数: 写入数据
 返回值: 发送成功返回1,发送失败返回0
-----------------------------------------------
*/
unsigned char SCCBwriteByte(unsigned char m_data)
{
unsigned char j,tem;

for(j=0;j<8;j++) //循环8次发送数据
{
if((m_data<<j)&0x80)
{
SCCB_SID_H();
}
else
{
SCCB_SID_L();
}
delay_us(500);
SCCB_SIC_H();
delay_us(500);
SCCB_SIC_L();
delay_us(500);

}
delay_us(100);
SCCB_SID_IN;/*设置SDA为输入*/
delay_us(500);
SCCB_SIC_H();
delay_us(100);
if(SCCB_SID_STATE){tem=0;}   //SDA=1发送失败,返回0}
else {tem=1;}   //SDA=0发送成功,返回1
SCCB_SIC_L();
delay_us(500);
        SCCB_SID_OUT;/*设置SDA为输出*/

return (tem);  
}

/*
-----------------------------------------------
   功能: 一个字节数据读取并且返回
   参数: 无
 返回值: 读取到的数据
-----------------------------------------------
*/
unsigned char SCCBreadByte(void)
{
unsigned char read,j;
read=0x00;

SCCB_SID_IN;/*设置SDA为输入*/
delay_us(500);
for(j=8;j>0;j--) //循环8次接收数据
{      
delay_us(500);
SCCB_SIC_H();
delay_us(500);
read=read<<1;
if(SCCB_SID_STATE) 
{
read=read+1;
}
SCCB_SIC_L();
delay_us(500);
}
        SCCB_SID_OUT;/*设置SDA为输出*/
return(read);
}
 
 

//功能:读OV7660寄存器
//返回:1-成功 0-失败
//guanfu_wang
unsigned char rd_Sensor_Reg(unsigned char regID, unsigned char *regDat)
{
//通过写操作设置寄存器地址
startSCCB();
if(0==SCCBwriteByte(0x42))//写地址
{
stopSCCB();//发送SCCB 总线停止传输命令
return(0);//错误返回
}
delay_us(100);
   if(0==SCCBwriteByte(regID))//积存器ID
{
stopSCCB();//发送SCCB 总线停止传输命令
return(0);//错误返回
}
stopSCCB();//发送SCCB 总线停止传输命令

delay_us(100);

//设置寄存器地址后,才是读
startSCCB();
if(0==SCCBwriteByte(0x43))//读地址
{
stopSCCB();//发送SCCB 总线停止传输命令
return(0);//错误返回
}
delay_us(1000);
   *regDat=SCCBreadByte();//返回读到的值
   noAck();//发送NACK命令
   stopSCCB();//发送SCCB 总线停止传输命令
   return(1);//成功返回
}

原文地址:https://www.cnblogs.com/tao560532/p/2490591.html