I2C的软件模拟,平台STM32

//iic起始信号void I2C_Start(void){ I2C_SDA_1(); I2C_SCL_1(); //空闲时,时钟和数据线保持高电平 I2C_Delay(); I2C_SDA_0(); //发送数据时,数据线产生一个从高向低的跳变 I2C_Delay(); I2C_SCL_0(); I2C_Delay();}
//iic结束信号void I2C_Stop(void){ I2C_SDA_0(); I2C_SCL_1(); //停止时,时钟高电平,数据产生从低到高的跳变 I2C_Delay(); I2C_SDA_1(); I2C_Delay(); }
发送设备地址7位, 当时钟为高电平时,产生数据
xxxxxxxxxx//iic发送void I2C_Write_Byte(uint8_t data){ uint8_t i; for(i=0;i<8;i++) { if(data & 0x80) { I2C_SDA_1(); } else { I2C_SDA_0(); } I2C_Delay(); I2C_SCL_1(); I2C_Delay(); I2C_SCL_0(); I2C_Delay(); if(i==7) { I2C_SDA_1(); //释放控制权 } data<<=1; } }
xxxxxxxxxx//iic接收uint8_t I2C_Read_Byte(void){ uint8_t i; uint8_t temp = 0; for(i=0;i<8;i++) { temp<<=1; I2C_SCL_1(); I2C_Delay(); if( I2C_SDA_READ()==1 ) { temp += 1; } I2C_SCL_0(); I2C_Delay(); } return temp;}xxxxxxxxxx//iic应答void I2C_ASK(void){ I2C_SDA_0(); I2C_SCL_1(); I2C_Delay(); I2C_SCL_0(); I2C_Delay(); I2C_SDA_1(); I2C_Delay(); }xxxxxxxxxx//iic非应答void I2C_NASK(void){ I2C_SDA_1(); I2C_SCL_1(); I2C_Delay(); I2C_SCL_0(); I2C_Delay(); }xxxxxxxxxx//iic等待应答uint8_t I2C_Wait_ASK(void){ uint8_t reply; I2C_SDA_1(); //释放控制权 I2C_SCL_1(); I2C_Delay(); if( I2C_SDA_READ()==1 ) { reply = 1; } else { reply = 0; } I2C_SCL_0(); I2C_Delay(); return reply;}xxxxxxxxxx//不同板子,需要进行调整void I2C_Delay(void){ for(uint8_t i = 0; i < 10; ++i);}xxxxxxxxxx//软件模拟iic,需根据实际修改PORT和PIN 