i2c读写8bit跟16bit

写一个16位寄存器8位数据的操作:

static int hm5065_i2c_txdata(u16 saddr,u8 *txdata,int length)
{
       struct i2c_msg msg[] = {
       {
              .addr  = saddr,         //设备地址
              .flags = 0,            //写的标志位
              .len = length,        //长度是3
              .buf = txdata,        //前2个buff,是寄存器的地址,后一个buff是要写的data
       },
       };
       if (i2c_transfer(hm5065_client->adapter, msg, 1) < 0)       //这里的数据时按msgs的长度定的
              return -EIO;
       else
              return 0;
}
读一个16位寄存器8位数据的操作:
static int hm5065_i2c_rxdata(unsigned short saddr,
                              unsigned char *rxdata,
                              int length)
{
       struct i2c_msg msgs[] = {
       {
              .addr   = saddr,     //设备地址
              .flags = 0,          //写的标志位
              .len   = 2,          //应为地址是16位的,所以要写2次
              .buf   = rxdata,     //2个buff,2个8位的,高8位,低8位是一个完整的寄存器地址
       },
       {
              .addr   = saddr,
              .flags = I2C_M_RD,    //读的标志位
              .len   = length,     //1个长度
              .buf   = rxdata,     //返回一个8位的data
       },
       };

       if (i2c_transfer(hm5065_client->adapter, msgs, 2) < 0) {      //这里的数据时按msgs的长度定的
              CDBG("hm5065_i2c_rxdata failed!\n");
              return -EIO;
       }
       return 0;
}

你可能感兴趣的:(i2c)