I2C 寫
I2C spec 規(guī)定如下
詳細(xì)解析如下
對從機(jī)進(jìn)行寫操作時,主設(shè)備發(fā)出開始標(biāo)志 (S) 和寫地址 (從機(jī)地址加一個 R/W 位,1 為讀,0 為寫)。從機(jī)產(chǎn)生應(yīng)答信號。然后主設(shè)備開始傳送寄存器地址 (RA),接到應(yīng)答后,開始傳送寄存器數(shù)據(jù),然后仍然要有應(yīng)答信號,連續(xù)寫入多字節(jié)時依次推。
舉例(例子進(jìn)行了兩次封裝)
static int ap3216c_open(struct inode *inode, struct file *filp)
{
filp- >private_data = &ap3216cdev;
/* 初始化AP3216C */
ap3216c_write_reg(&ap3216cdev, AP3216C_SYSTEMCONG, 0x04); /* 復(fù)位AP3216C */
mdelay(50); /* AP3216C復(fù)位最少10ms */
ap3216c_write_reg(&ap3216cdev, AP3216C_SYSTEMCONG, 0X03); /* 開啟ALS、PS+IR */
return 0;
}
static void ap3216c_write_reg(struct ap3216c_dev *dev, u8 reg, u8 data)
{
u8 buf = 0;
buf = data;
ap3216c_write_regs(dev, reg, &buf, 1);
}
static s32 ap3216c_write_regs(struct ap3216c_dev *dev, u8 reg, u8 *buf, u8 len)
{
u8 b[256];
struct i2c_msg msg;
struct i2c_client *client = (struct i2c_client *)dev- >private_data;
b[0] = reg; /* 寄存器首地址 */
memcpy(&b[1],buf,len); /* 將要寫入的數(shù)據(jù)拷貝到數(shù)組b里面 */
msg.addr = client- >addr; /* ap3216c地址 */
msg.flags = 0; /* 標(biāo)記為寫數(shù)據(jù) */
msg.buf = b; /* 要寫入的數(shù)據(jù)緩沖區(qū) */
msg.len = len + 1; /* 要寫入的數(shù)據(jù)長度 */
return i2c_transfer(client- >adapter, &msg, 1);
}
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
6772瀏覽量
88649 -
I2C
+關(guān)注
關(guān)注
28文章
1469瀏覽量
122846
發(fā)布評論請先 登錄
相關(guān)推薦
評論