コード例 #1
0
ファイル: i2c.cpp プロジェクト: hendrixjl/rPi
size_t i2c::command(uint8_t slaveaddr,
                    uint8_t cmd,
                    const uint8_t* data_addr,
                    size_t data_size)
{
    reset_txfer_done();
    set_slave_address(slaveaddr);
    set_data_len(1 + data_size);
    initiate_write();
    write_byte(cmd);
    size_t bytes_sent=1;
    while (data_size>0)
    {
        if (write_byte(*data_addr))
        {
            data_addr++;
            data_size--;
            bytes_sent++;
        }
        // TODO check for error conditions
    }
    wait_for_done();
    clear_fifo();
    return bytes_sent;
}
コード例 #2
0
ファイル: i2c.cpp プロジェクト: panic1/quadcopter
bool I2C::write_word(uint8_t register_address, uint16_t value)
{
	set_slave_address();

	i2c_smbus_data data;
	data.word = value;

	return use_smbus_IOCTL(true, register_address, I2C_SMBUS_WORD_DATA, data);
}
コード例 #3
0
ファイル: i2c.cpp プロジェクト: panic1/quadcopter
bool I2C::write_byte(uint8_t register_address, uint8_t value)
{
	set_slave_address();

	i2c_smbus_data data;
    data.byte = value;

    return use_smbus_IOCTL(true, register_address, I2C_SMBUS_BYTE_DATA, data);
}
コード例 #4
0
ファイル: i2c.cpp プロジェクト: panic1/quadcopter
bool I2C::read_byte(uint8_t register_address, uint8_t& value)
{
    set_slave_address();

    i2c_smbus_data data;
    if( use_smbus_IOCTL(false, register_address, I2C_SMBUS_BYTE_DATA, data) != 0)
	{
		value = data.byte;
		return true;
	}
	else
	{
		return false;
	}
}
コード例 #5
0
ファイル: i2c.cpp プロジェクト: panic1/quadcopter
uint8_t I2C::read_block(uint8_t register_address, uint8_t* value, size_t length)
{
    set_slave_address();
    if( length > I2C_SMBUS_BLOCK_MAX )
    {
        length = I2C_SMBUS_BLOCK_MAX;
    }

    i2c_smbus_data data;
    data.block[0] = length;

    if( use_smbus_IOCTL(false, register_address, I2C_SMBUS_I2C_BLOCK_DATA, data) )
    {
        memcpy(value, &(data.block[1]), length);
        return data.block[0];
    }
    else
    {
        return 0;
    }
}
コード例 #6
0
ファイル: i2c.cpp プロジェクト: panic1/quadcopter
uint8_t I2C::write_block(uint8_t register_address, uint8_t* value, size_t length)
{
	set_slave_address();

	if( length > I2C_SMBUS_BLOCK_MAX )
    {
        length = I2C_SMBUS_BLOCK_MAX;
    }

    i2c_smbus_data data;

    memset(data.block, 0, length+1);
    memcpy( &(data.block[1]), value, length);
    data.block[0] = length;

    if (use_smbus_IOCTL(true, register_address, I2C_SMBUS_I2C_BLOCK_DATA, data))
    {
    	return length;
    }
    else
    {
    	return 0;
    }
}