//不产生ACK应答 void MPU_IIC_NAck(void) { MPU_IIC_SCL=0; MPU_SDA_OUT(); MPU_IIC_SDA=1; MPU_IIC_Delay(); MPU_IIC_SCL=1; MPU_IIC_Delay(); MPU_IIC_SCL=0; }
//产生IIC起始信号 void MPU_IIC_Start(void) { MPU_SDA_OUT(); //sda线输出 MPU_IIC_SDA=1; MPU_IIC_SCL=1; MPU_IIC_Delay(); MPU_IIC_SDA=0;//START:when CLK is high,DATA change form high to low MPU_IIC_Delay(); MPU_IIC_SCL=0;//钳住I2C总线,准备发送或接收数据 }
//产生IIC停止信号 void MPU_IIC_Stop(void) { MPU_SDA_OUT();//sda线输出 MPU_IIC_SCL=0; MPU_IIC_SDA=0;//STOP:when CLK is high DATA change form low to high MPU_IIC_Delay(); MPU_IIC_SCL=1; MPU_IIC_SDA=1;//发送I2C总线结束信号 MPU_IIC_Delay(); }
void MPU_I2C_stop() { MPU_SDA_OUT(); MPU_I2C_SDA_W = 0; MPU_I2C_DELAY(); MPU_I2C_SCL = 1; MPU_I2C_DELAY(); MPU_I2C_SDA_W = 1; delayMs(10); }
void MPU_I2C_start() { MPU_SDA_OUT(); MPU_I2C_SDA_W = 1; MPU_I2C_DELAY(); MPU_I2C_SCL = 1; MPU_I2C_DELAY(); MPU_I2C_SDA_W = 0; MPU_I2C_DELAY(); //MPU_I2C_SCL = 0;//拉低SCL,等待发送或接收数据 }
void MPU_I2C_respond(u8 ack)//应答信号:在第9个时钟周期SCL为高时,SDA为低 { MPU_SDA_OUT(); MPU_I2C_SCL = 0;//拉低SCL,等待发送或接收数据 MPU_I2C_DELAY(); MPU_I2C_SDA_W = 1 - ack; MPU_I2C_DELAY(); MPU_I2C_SCL = 1; MPU_I2C_DELAY(); MPU_I2C_SCL = 0; MPU_I2C_DELAY(); }
//IIC发送一个字节 //返回从机有无应答 //1,有应答 //0,无应答 void MPU_IIC_Send_Byte(u8 txd) { u8 t; MPU_SDA_OUT(); MPU_IIC_SCL=0;//拉低时钟开始数据传输 for(t=0;t<8;t++) { MPU_IIC_SDA=(txd&0x80)>>7; txd<<=1; MPU_IIC_SCL=1; MPU_IIC_Delay(); MPU_IIC_SCL=0; MPU_IIC_Delay(); } }
void MPU_I2C_sendByte(u8 txd) { u8 i; MPU_SDA_OUT(); MPU_I2C_SCL = 0;//拉低SCL,等待发送数据 MPU_I2C_DELAY(); for(i = 0;i < 8;i ++) { MPU_I2C_SDA_W = (txd & 0x80) >> 7; txd <<= 1; MPU_I2C_DELAY(); MPU_I2C_SCL = 1; MPU_I2C_DELAY(); MPU_I2C_SCL = 0; MPU_I2C_DELAY(); } }