Пример #1
0
void acknowledge_poll(void){
	GPIO_InitTypeDef GPIO_InitStructure;
	uint8_t i;

	do{
		//delay_100ns(100);

		e2prom_start_condition();
		delay_100ns(5);
		e2prom_send_data(E2PROM_ADDR&0xFE);

		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //PB6--SCL  PB7--SDA 释放SDA信号线
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
		GPIO_Init(GPIOB, &GPIO_InitStructure);
	
		delay_100ns(5);
		set_scl;
		delay_100ns(8);
		if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7) == (uint8_t)Bit_RESET) i=0;
		else continue;
		delay_100ns(8);//(10);
		reset_scl;
		delay_100ns(13);
		//if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7) == (uint8_t)Bit_RESET) i=0;
		//else i = 0xFF;
		while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7) == (uint8_t)Bit_RESET);
	
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
		GPIO_Init(GPIOB, &GPIO_InitStructure);
	}while(i);
}
Пример #2
0
void e2prom_stop_condition(void){	//结束前,scl sda均为低,结束条件产生后scl信号线为低,sda信号线为高
	reset_scl_sda; delay_100ns(2);
	
	set_scl;
	delay_100ns(6);	 //tsu.sto   min:0.6us in 1.8Vcc, min:0.25us in 5.0Vcc
	set_sda;
	delay_100ns(13); //tbuf      min:1.3us in 1.8Vcc, min:0.5us in 5.0Vcc
	reset_scl;
	delay_100ns(6);

	//delay_us(50);
}
Пример #3
0
//IIC模拟时序驱动
void e2prom_start_condition(void){  //通信起始时,scl信号线为低,sda信号线为高,起始条件产生后均为低
	//起始条件
	reset_scl; set_sda;
	delay_100ns(2);

	set_scl;
	delay_100ns(6);  //tsu.sta   min:0.6us in 1.8Vcc, min:0.25us in 5.0Vcc
	reset_sda;
	delay_100ns(6);  //thd.sta   min:0.6us in 1.8Vcc, min:0.25us in 5.0Vcc
	reset_scl;
	delay_100ns(13); //tlow      min:1.3us in 1.8Vcc, min:0.4us in 5.0Vcc
}
Пример #4
0
uint8_t e2prom_read_byte(uint16_t add){
	GPIO_InitTypeDef GPIO_InitStructure;
	uint8_t data;
	uint8_t i;

	data = 0;
	
	//acknowledge_poll();

	e2prom_check_busy();

	e2prom_start_condition();

	e2prom_send_data((E2PROM_ADDR&0xFE));  //写入器件地址
	e2prom_waitfor_ack();
	e2prom_send_data(0xFF&(add>>8));
	e2prom_waitfor_ack();
	e2prom_send_data(0xFF&add);
	e2prom_waitfor_ack();

	e2prom_start_condition();

	e2prom_send_data((E2PROM_ADDR&0xFE)|0x01);  //写入器件地址
	e2prom_waitfor_ack();

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //PB6--SCL  PB7--SDA 释放SDA信号线
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	for(i=0; i<8; i++){
		set_scl;
		delay_100ns(5);
		if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7) == (uint8_t)Bit_SET) data = (data<<1) | 0x01;
		else data = data<<1;
		delay_100ns(5);
		reset_scl;
		delay_100ns(13);
	}
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
	GPIO_Init(GPIOB, &GPIO_InitStructure);

	e2prom_stop_condition();

	//acknowledge_poll();
	delay_us(50);

	return data;
}
Пример #5
0
void e2prom_send_data(uint8_t dat){	 //进入此函数时,scl确定为低
	uint8_t i;

	reset_scl;
	for(i=0; i<8; i++){
		//reset_scl;
		if(dat&0x80) set_sda;
		else reset_sda;
		delay_100ns(9);
		set_scl;
		delay_100ns(6);
		reset_scl;
		delay_100ns(13);
		dat <<= 1;
	}
}
Пример #6
0
void e2prom_reset(void){  //数据传输完成后,scl为低,sda为低
	uint8_t i;
	e2prom_start_condition();
	//scl sda = 0	

	set_sda;
	delay_100ns(2);  //tsu.dat   min:100ns
	for(i=0; i<9; i++){
		set_scl;
		delay_100ns(6);  //thigh   min:0.6us in 1.8Vcc, min:0.4us in 5.0Vcc
		reset_scl;
		delay_100ns(13);
	}

	e2prom_start_condition();
	e2prom_stop_condition();
}
Пример #7
0
void e2prom_waitfor_ack(void){
	GPIO_InitTypeDef GPIO_InitStructure;

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //PB6--SCL  PB7--SDA 释放SDA信号线
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOB, &GPIO_InitStructure);

	set_scl;
	delay_100ns(2);
	while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7) == (uint8_t)Bit_SET);
	delay_100ns(10);
	reset_scl;

	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
}
Пример #8
0
/***********************************************************************
#ifdef	DOC
FUNCTION	: LensDrvSPIWriteUint
DESCRIPTION	: write Lens driver's registor
INPUT		: addr,wt_data
OUTPUT		: none
UPDATE		:
DATE		: 2011/02/21
#endif
***********************************************************************/
void LensDrvSPIWriteUint( uchar addr, uint wt_data )
{
	uchar i,j=0;

	SPI_CS_AN41908A_LOW;
    
	delay_100ns();
	SPI_SCK_AN41908A_HIGH;
	SPI_CS_AN41908A_HIGH;
    delay_100ns();

    for ( i = 0; i <8; i++)
	{
        SPI_SCK_AN41908A_LOW;
        delay_50ns();
		if( i<= 5)
		{
		  		SPI_SIN_AN41908A_MODE((addr&(1<<i)) >> i );
		} 
		else
	 	{
Пример #9
0
void an41908_check_work_state(void)
{

    SPI_CS_AN41908A_LOW;
    delay_100ns();

    if(SPI_SOUT_AN41908_PIN_GET)
    {
        an41908_work_state = 1;
    }      

    delay_100ns();
    SPI_CS_AN41908A_HIGH;
    delay_100ns();
    if(SPI_SOUT_AN41908_PIN_GET == 0)
    {
        an41908_work_state = 1;
    } 
    else
        an41908_work_state = 0; 

}