예제 #1
0
void Multiple_Read_HMC5883L(void)
{   
	  u8 i;
    I2C_Start();                          //起始信号
    I2C_SendByte(0x3C);           //发送设备地址+写信号
    I2C_SendByte(0x03);                   //发送存储单元地址,从0x3开始	
    I2C_Start();                          //起始信号
    I2C_SendByte(0x3D);         //发送设备地址+读信号
	  for (i=0; i<6; i++)                      //连续读取6个地址数据,存储中BUF
    {
        BUF[i] = I2C_RecvByte();          //BUF[0]存储数据
        if (i == 5)
        {
           I2C_SendACK(1);                //最后一个数据需要回NOACK
        }
        else
        {
          I2C_SendACK(0);                 //回应ACK
        }
    }
    I2C_Stop();                           //停止信号


		M_X = BUFFER[0]<<8|BUFFER[1];
		M_Y = BUFFER[2]<<8|BUFFER[3];
		M_Z = BUFFER[4]<<8|BUFFER[5];
}
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;
}
예제 #3
0
static uint8_t I2C_ReceiveByte_WithACK(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_SendACK();

 	return i2c_data;
}
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
}
예제 #5
0
//==========================================
//连续读取6个数据
//==========================================
void HMC5883_Read_6Data(void)
{
	u8 i = 0;
	
	I2C_Start();                				//起始信号
	I2C_Write(SlaveAddress);    	//发送设备地址+写信号(+0)
	I2C_Write(0x03);    				 	//发送存储单元地址
	I2C_Start();                				//起始信号
	I2C_Write(SlaveAddress+1); 	//发送设备地址+读信号(+1)
	
	for(i = 0;i < 6;i++)
	{
		HMC5883_BUF[i] = I2C_Read();
		if(i == 5)
			I2C_SendACK(1);			
		else
			I2C_SendACK(0);
	}
	I2C_Stop();
}
예제 #6
0
//*******************************************************************************************************
//从I2C设备读取一个字节数据
//*******************************************************************************************************
uchar Single_ReadI2C(uchar REG_Address)
{
	uchar REG_data;
	I2C_Start();                   //起始信号
	I2C_SendByte(SlaveAddress);    //发送设备地址+写信号
	I2C_SendByte(REG_Address);     //发送存储单元地址,从0开始	
	I2C_Start();                   //起始信号
	I2C_SendByte(SlaveAddress+1);  //发送设备地址+读信号
	REG_data=I2C_RecvByte();       //读出寄存器数据
	I2C_SendACK(1);                //接收应答信号
	I2C_Stop();                    //停止信号
	return REG_data;
}
예제 #7
0
//**************************************
//I2C read a byte
//**************************************
u8 Single_ReadI2C(u8 REG_Address)
{
		u8 REG_data;
		I2C_Start();                   
		I2C_SendByte(SlaveAddress);    
		I2C_SendByte(REG_Address);     
		I2C_Start();                   
		I2C_SendByte(SlaveAddress+1); 
		REG_data=I2C_RecvByte();       
		I2C_SendACK(1);                
		I2C_Stop();                   
		return REG_data;
}
예제 #8
0
파일: I2C.c 프로젝트: ChenQingya/Pheonix
// I2C模拟接收一个字节并发送ACK
u8 I2C_ReceiveByte_WithACK(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_SendACK();
 	return i2c_data;
}