#include "I2C.h" #include "timeout.h" void delay_us(uint32_t nUs) { uint32_t i=0,j=0; for(i=0;i250) { i2c_stop(); return 1; } } IIC_SCL(0);//IIC_SCL=0; return 0; } /*----------------------------------------------------- * I2C 产生应答 * ---------------------------------------------------*/ void i2c_Ack(void) { IIC_SCL(0);//IIC_SCL = 0; SDA_OUT(); IIC_SDA(0);//IIC_SDA = 0; delay_us(4); IIC_SCL(1);//IIC_SCL = 1; delay_us(2); IIC_SCL(0);//IIC_SCL = 0; } /*----------------------------------------------------- * I2C 没有产生应答 * ---------------------------------------------------*/ void i2c_NAck(void) { IIC_SCL(0);//IIC_SCL = 0; SDA_OUT(); IIC_SDA(1);//IIC_SDA = 1; delay_us(4); IIC_SCL(1);//IIC_SCL = 1; delay_us(2); IIC_SCL(0);//IIC_SCL = 0; } /*----------------------------------------------------- * IIC 发送一个字节 * 返回 1:有应答 0:无应答 * ---------------------------------------------------*/ void i2c_send_byte(uint8_t txd) { uint8_t t; IIC_SCL(0);//IIC_SCL=0;// 电平置低,开始传输数据 SDA_OUT(); for(t=0;t<8;t++) { // IIC_SDA=(txd&0x80)>>7; if((txd&0x80)>>7) IIC_SDA(1); else IIC_SDA(0); txd<<=1; delay_us(4); // IIC_SCL(1);//IIC_SCL=1; delay_us(2); IIC_SCL(0);//IIC_SCL=0; delay_us(2); } } /*------------------------------------------------- * 读1个字节,ack=1时,发送ACK,ack=0,发送nACK * -------------------------------------------------*/ uint8_t i2c_read_byte(uint8_t ack) { uint8_t i,receive=0; SDA_IN();//SDA设置为输入 for(i=0;i<8;i++ ) { IIC_SCL(0);//IIC_SCL=0; delay_us(4); IIC_SCL(1);//IIC_SCL=1; receive<<=1; if(READ_SDA)receive++; delay_us(1); } if(!ack) i2c_NAck();//发送nACK else i2c_Ack(); //发送ACK return receive; }