i2c_smbus系列函数有:
s32 i2c_smbus_read_byte(const struct i2c_client *client);
s32 i2c_smbus_write_byte(const struct i2c_client *client, u8 value);
s32 i2c_smbus_read_byte_data(const struct i2c_client *client, u8 command);
s32 i2c_smbus_write_byte_data(const struct i2c_client *client,u8 command, u8 value);
s32 i2c_smbus_read_word_data(const struct i2c_client *client, u8 command);
s32 i2c_smbus_write_word_data(const struct i2c_client *client,u8 command, u16 value);
s32 i2c_smbus_read_block_data(const struct i2c_client *client,u8 command, u8 *values);
s32 i2c_smbus_write_block_data(const struct i2c_client *client,u8 command, u8 length, const u8 *values);
s32 i2c_smbus_read_i2c_block_data(const struct i2c_client *client,u8 command, u8 length, u8 *values);
s32 i2c_smbus_write_i2c_block_data(const struct i2c_client *client,u8 command, u8 length, const u8 *values);
i2c_smbus_read_byte()、i2c_smbus_write_byte()
这两个函数是没有太大意义的,如果是read,则连读的基地址都没有,如果是write,则是简单将value发送过去了,设备或许都不知道这是发送写的基地址还是写的数据,这两个函数有点类似于i2c_master_recv()、i2c_master_send()。i2c_smbus_read_byte_data()、i2c_smbus_write_byte_data()
首先是read,如果是read将传送两个msg,第一个msg用来传送读的基地址,第二个msg用来读取数据。
然后是write,write只传送一个msg,只发送一个msg不好的地方是只能单方向传输,比如写就只能写,读就只能读(注意读的基地址是写方向)。但是这里为什么可以只传送一个msg呢,因为传输的方向并没有改变,包括写基地址,写数据都是写方向,但是写数据的长度为2,写基地址还是command,写的数据为value。i2c_smbus_read_word_data()、i2c_smbus_write_word_data()
同上面类似,只是一次读写两个字节。i2c_smbus_read_block_data()、i2c_smbus_write_block_data()
读注意,这里并没有指定读数据的长度。i2c_smbus_read_i2c_block_data()、i2c_smbus_write_i2c_block_data()
同上面不一样的是,read时有长度指定。
而write同上面不同的是,i2c_smbus_write_block_data()函数会将发送数据的长度一起发送给设备,而这里则不会。
上面的一系列函数最终都是调用的i2c_smbus_xfer()函数,可以自己构造i2c_msg,然后调用i2c_transfer来发送数据。