//等待应答信号到来 //返回值:1,接收应答失败 // 0,接收应答成功 u8 MPU_IIC_Wait_Ack(void) { u8 ucErrTime=0; MPU_SDA_IN(); //SDA设置为输入 MPU_IIC_SDA=1;MPU_IIC_Delay(); MPU_IIC_SCL=1;MPU_IIC_Delay(); while(MPU_READ_SDA) { ucErrTime++; if(ucErrTime>250) { MPU_IIC_Stop(); return 1; } } MPU_IIC_SCL=0;//时钟输出0 return 0; }
u8 MPU_I2C_readByte(u8 ack) { u8 i, recv = 0; MPU_SDA_IN(); for(i = 0;i < 8;i ++) { MPU_I2C_SCL = 0; MPU_I2C_DELAY(); MPU_I2C_SCL = 1; MPU_I2C_DELAY(); if(MPU_I2C_SDA_R) recv ++; recv <<= 1; MPU_I2C_DELAY(); } MPU_I2C_SCL = 0; MPU_I2C_respond(ack); return recv; }
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK u8 MPU_IIC_Read_Byte(unsigned char ack) { unsigned char i,receive=0; MPU_SDA_IN();//SDA设置为输入 for(i=0;i<8;i++ ) { MPU_IIC_SCL=0; MPU_IIC_Delay(); MPU_IIC_SCL=1; receive<<=1; if(MPU_READ_SDA)receive++; MPU_IIC_Delay(); } if (!ack) MPU_IIC_NAck();//发送nACK else MPU_IIC_Ack(); //发送ACK return receive; }
u8 MPU_I2C_waitACK() { u8 errTime = 0; //MPU_SDA_OUT(); //MPU_I2C_SCL = 0; //MPU_I2C_DELAY(); //MPU_I2C_SDA_W = 1; //MPU_I2C_DELAY(); MPU_I2C_SCL = 1; MPU_I2C_DELAY(); MPU_SDA_IN(); while(MPU_I2C_SDA_R) { errTime ++; if(errTime > 250) { MPU_I2C_stop(); return 1; } } MPU_I2C_SCL = 0;//拉低SCL,等待发送或接收数据 MPU_I2C_DELAY(); return 0; }