static uint8_t I2C_ReceiveByte(void) { uint8_t i, i2c_data = 0; gpio_set(I2C_port, I2C_SDA); gpio_clear(I2C_port, I2C_SCL); for(i=0; i<8; i++) { gpio_set(I2C_port, I2C_SCL); delay_us(10); i2c_data<<=1; if(gpio_get(I2C_port, I2C_SDA)) i2c_data|=0x01; gpio_clear(I2C_port, I2C_SCL); delay_us(10); } I2C_SendNACK(); return i2c_data; }
uint8_t I2C_ReadByte(uint8_t ack) { uint8_t i,receive=0; I2C_WriteBitSDA(1); for(i=0; i<8; i++) { I2C_WriteBitSCL(0); I2C_delay_us(2); I2C_WriteBitSCL(1); receive<<=1; if(I2C_ReadBitSDA()) receive++; I2C_delay_us(1); } if(ack) I2C_SendACK(); else I2C_SendNACK(); return receive; }
int I2C_ReadRepeated(I2C_ConfigStruct* conf, uint8_t addr, uint8_t* data, uint32_t len) { int i; I2C_Start(conf); //Write addr | read command if(I2C_WriteByte(conf, (addr | 1)) != 0) { printf("Received NACK at address phase!!\r\n"); return -1; } //Read data for(i=0; i<len; i++) { data[i] = I2C_ReadByte(conf); if( i == (len - 1) ) I2C_SendNACK(conf); else I2C_SendACK(conf); } return 0;//success }
// I2C模拟接收一个字节 u8 I2C_ReceiveByte(void) { u8 i,i2c_data; I2C_SDA_H; I2C_SCL_L; i2c_data=0; for(i=0;i<8;i++) { I2C_SCL_H; I2C_NOP; i2c_data<<=1; if(I2C_SDA_STATE) i2c_data|=0x01; I2C_SCL_L; I2C_NOP; } I2C_SendNACK(); return i2c_data; }