#include "i2c_user.h" #include "tof.h" /************************************************ 函数名称 : uDelay 功 能 : 延时微秒(非精确延时) 参 数 : uint32_t cnt---延时时间 返 回 值 : 无 *************************************************/ void uDelay(uint32_t cnt) { while(cnt) { __NOP();__NOP(); __NOP();__NOP(); __NOP();__NOP(); __NOP();__NOP(); __NOP();__NOP(); __NOP();__NOP(); cnt--; } } /************************************************ 函数名称 : I2C_Start 功 能 : I2C开始 参 数 : 无 返 回 值 : 无 *************************************************/ void I2C_Start(void) { I2C_SCL_HIGH(); //SCL高 uDelay(5); I2C_SDA_HIGH(); //SDA高 -> 低 uDelay(5); I2C_SDA_LOW(); //SDA低 uDelay(5); I2C_SCL_LOW(); //SCL低(待写地址/数据) uDelay(5); } /************************************************ 函数名称 : I2C_Stop 功 能 : I2C停止 参 数 : 无 返 回 值 : 无 *************************************************/ void I2C_Stop(void) { I2C_SDA_LOW(); //SDA低 -> 高 uDelay(5); I2C_SCL_HIGH(); //SCL高 uDelay(5); I2C_SDA_HIGH(); //SDA高 uDelay(5); } /************************************************ 函数名称 : I2C_PutAck 功 能 : I2C主机产生应答(或非应答)位 参 数 : I2C_ACK ----- 应答 I2C_NOACK --- 非应答 返 回 值 : 无 *************************************************/ void I2C_PutAck(uint8_t Ack) { I2C_SCL_LOW(); //SCL低 uDelay(30); if(I2C_ACK == Ack) I2C_SDA_LOW(); //应答 else I2C_SDA_HIGH(); //非应答 uDelay(30); I2C_SCL_HIGH(); //SCL高 -> 低 uDelay(30); I2C_SCL_LOW(); //SCL低 uDelay(30); } /************************************************ 函数名称 : I2C_GetAck 功 能 : I2C主机读取应答(或非应答)位 参 数 : 无 返 回 值 : I2C_ACK ----- 应答 I2C_NOACK --- 非应答 *************************************************/ uint8_t I2C_GetAck(void) { uint8_t ack; I2C_SCL_LOW(); //SCL低 -> 高 uDelay(30); I2C_SDA_HIGH(); //释放SDA(开漏模式有效) uDelay(30); I2C_SCL_HIGH(); //SCL高(读取应答位) uDelay(30); if(Read_I2C_SDA()) ack = I2C_NOACK; //非应答 else ack = I2C_ACK; //应答 I2C_SCL_LOW(); //SCL低 uDelay(30); return ack; } /************************************************ 函数名称 : I2C_WriteByte 功 能 : I2C写一字节 参 数 : Data --- 数据 返 回 值 : 无 *************************************************/ void I2C_WriteByte(uint8_t Data) { uint8_t cnt; for(cnt=0; cnt<8; cnt++) { I2C_SCL_LOW(); //SCL低(SCL为低电平时变化SDA有效) uDelay(30); if(Data & 0x80) I2C_SDA_HIGH(); //SDA高 else I2C_SDA_LOW(); //SDA低 Data <<= 1; I2C_SCL_HIGH(); //SCL高(发送数据) uDelay(30); } I2C_SCL_LOW(); //SCL低(等待应答信号) uDelay(30); I2C_GetAck(); //读取应答位 } /************************************************ 函数名称 : I2C_WriteByte7 功 能 : I2C写一字节 参 数 : Data --- 数据 返 回 值 : 无 *************************************************/ void I2C_WriteByte7(uint8_t Data) { uint8_t cnt; for(cnt=0; cnt<7; cnt++) { I2C_SCL_LOW(); //SCL低(SCL为低电平时变化SDA有效) uDelay(30); if(Data & 0x80) I2C_SDA_HIGH(); //SDA高 else I2C_SDA_LOW(); //SDA低 Data <<= 1; uDelay(30); I2C_SCL_HIGH(); //SCL高(发送数据) uDelay(30); } I2C_SCL_LOW(); //SCL低(等待应答信号) uDelay(30); I2C_GetAck(); //读取应答位 } /************************************************ 函数名称 : I2C_ReadByte 功 能 : I2C读一字节 参 数 : ack --------- 产生应答(或者非应答)位 返 回 值 : data -------- 读取的一字节数据 *************************************************/ uint8_t I2C_ReadByte(uint8_t ack) { uint8_t cnt; uint8_t data; I2C_SCL_LOW(); //SCL低 uDelay(30); I2C_SDA_HIGH(); //释放SDA(开漏模式有效) for(cnt=0; cnt<8; cnt++) { I2C_SCL_HIGH(); //SCL高(读取数据) uDelay(30); data <<= 1; if(Read_I2C_SDA()) data |= 0x01; //SDA为高(数据有效) I2C_SCL_LOW(); //SCL低 uDelay(30); } I2C_PutAck(ack); //产生应答(或者非应答)位 return data; //返回数据 }