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

Tango Tang 2014-11-13 08:24:51
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的。
...全文
2014 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tango Tang 2014-11-25
  • 打赏
  • 举报
回复
已经解决了,数组没有用对,
fly 100% 2014-11-14
  • 打赏
  • 举报
回复
写是不会卡死的 看不到波形不好查

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧