#include "sys.h"
#include "sccb.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////	 
//οguanfu_wang롣
//ALIENTEK MiniSTM32
//OV7670 	   
//ԭ@ALIENTEK
//̳:www.openedv.com
//޸:2012/10/31
//汾V1.0		    							    							  
//////////////////////////////////////////////////////////////////////////////////

//ʼSCCBӿ
//CHECK OK
void SCCB_Init(void)
{											   
   	RCC->APB2ENR|=1<<4;		//ʹPORTCʱ
 	//PC4,5 OUT  
	GPIOC->CRL&=0XFF00FFFF;
	GPIOC->CRL|=0X00330000;    
	GPIOC->ODR|=3<<4;   
	SCCB_SDA_OUT();	   
}			 

//SCCBʼź
//ʱΪߵʱ,ߵĸߵ,ΪSCCBʼź
//ڼ״̬,SDASCLΪ͵ƽ
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);
}
//SCCB,дһֽ
//ֵ:0,ɹ;1,ʧ. 
uint8_t SCCB_WR_Byte(uint8_t dat)
{
	uint8_t j,res;
	for(j=0;j<8;j++) //ѭ8η
	{
		if(dat&0x80)SCCB_SDA=1;	
		else SCCB_SDA=0;
		dat<<=1;
		delay_us(50);
		SCCB_SCL=1;	
		delay_us(50);
		SCCB_SCL=0;		   
	}			 
	SCCB_SDA_IN();		//SDAΪ 
	delay_us(50);
	SCCB_SCL=1;			//յھλ,жǷͳɹ
	delay_us(50);
	if(SCCB_READ_SDA)res=1;  //SDA=1ʧܣ1
	else res=0;         //SDA=0ͳɹ0
	SCCB_SCL=0;		 
	SCCB_SDA_OUT();		//SDAΪ    
	return res;  
}	 
//SCCB ȡһֽ
//SCL,
//ֵ:
uint8_t SCCB_RD_Byte(void)
{
	uint8_t temp=0,j;
	SCCB_SDA_IN();		//SDAΪ  
	for(j=8;j>0;j--) 	//ѭ8ν
	{		     	  
		delay_us(50);
		SCCB_SCL=1;
		temp=temp<<1;
		if(SCCB_READ_SDA)temp++;   
		delay_us(50);
		SCCB_SCL=0;
	}	
	SCCB_SDA_OUT();		//SDAΪ    
	return temp;
} 							    
//дĴ
//ֵ:0,ɹ;1,ʧ.
uint8_t SCCB_WR_Reg(uint8_t reg,uint8_t data)
{
	uint8_t 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;
}

//Ĵ
//ֵ:ļĴֵ
uint8_t SCCB_RD_Reg(uint8_t reg)
{
	uint8_t 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;
}















