当前位置: 代码迷 >> 驱动开发 >> I2C IIC16位寄存器跟16数据的操作
  详细解决方案

I2C IIC16位寄存器跟16数据的操作

热度:458   发布时间:2016-04-28 10:04:16.0
I2C IIC16位寄存器和16数据的操作
unsigned long gpio_i2c_read16(unsigned char devaddress, int address)
{
    unsigned long rxdata;
    u8 i2c_buf[8];
    struct i2c_msg msgs[2];
    struct i2c_adapter *adapter;
    if(!mdin_i2c_client) {
        printk("mdin_i2c_client not register\n");
        return -1;
    }
    adapter = to_i2c_adapter(mdin_i2c_client->dev.parent);

    i2c_buf[0] = (address & 0xff00)>>8;
    i2c_buf[1] = address & 0xff;
    
    msgs[0].addr  = I2C_MDIN3xx_ADDR>>1;
    msgs[0].flags = 0;
    msgs[0].len   = 2;
    msgs[0].buf   = i2c_buf;

    i2c_buf[0] =i2c_buf[1] = 0;
    msgs[1].addr  = I2C_MDIN3xx_ADDR>>1;
    msgs[1].flags = I2C_M_RD;;
    msgs[1].len   = 2;
    msgs[1].buf   = i2c_buf;

    if(unlikely(i2c_transfer(adapter, msgs, 2) != 2)) {
        return -1;
    }

rxdata=(i2c_buf[0]<<8)|i2c_buf[1];
    return rxdata;
}

void gpio_i2c_write16(unsigned char devaddress, int address, int data)
{

    unsigned char high,low;
    u8 i2c_buf[8];
    struct i2c_msg msgs[2];
    struct i2c_adapter *adapter;

    if(!mdin_i2c_client) {
        printk("mdin_i2c_client not register\n");
        return -1;
    }

    adapter = to_i2c_adapter(mdin_i2c_client->dev.parent);

    i2c_buf[0] = (address & 0xff00)>>8;
    i2c_buf[1] = address & 0xff;
  
    msgs[0].addr  = I2C_MDIN3xx_ADDR>>1;
    msgs[0].flags = 0;
    msgs[0].len   = 2;
    msgs[0].buf   = i2c_buf;

    i2c_buf[0] = (data & 0xff00)>>8;
    i2c_buf[1] = data & 0xff;
    msgs[1].addr  = I2C_MDIN3xx_ADDR>>1;
    msgs[1].flags = 0;
    msgs[1].len   = 2;
    msgs[1].buf   = i2c_buf;

    if(unlikely(i2c_transfer(adapter, msgs, 2) != 2)) {
        return -1;
    }
}


16位寄存器,16位数据。读写函数如上,请问我这么写正确吗?我测试了,读函数可以得到数据,写函数不行,但是不会出错,操作的IC是mdin340的。
------解决思路----------------------
写是不会卡死的  看不到波形不好查
  相关解决方案