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); }
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); }
//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 }
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; }
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; } }
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(); }
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); }
/*********************************************************************** #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 {
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; }