Esempio n. 1
0
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
}
Esempio n. 4
0
// 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;
}