I2C 寫
I2C spec 規(guī)定如下
詳細解析如下
對從機進行寫操作時,主設備發(fā)出開始標志 (S) 和寫地址 (從機地址加一個 R/W 位,1 為讀,0 為寫)。從機產生應答信號。然后主設備開始傳送寄存器地址 (RA),接到應答后,開始傳送寄存器數據,然后仍然要有應答信號,連續(xù)寫入多字節(jié)時依次推。
舉例(例子進行了兩次封裝)
static int ap3216c_open(struct inode *inode, struct file *filp)
{
filp- >private_data = &ap3216cdev;
/* 初始化AP3216C */
ap3216c_write_reg(&ap3216cdev, AP3216C_SYSTEMCONG, 0x04); /* 復位AP3216C */
mdelay(50); /* AP3216C復位最少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); /* 將要寫入的數據拷貝到數組b里面 */
msg.addr = client- >addr; /* ap3216c地址 */
msg.flags = 0; /* 標記為寫數據 */
msg.buf = b; /* 要寫入的數據緩沖區(qū) */
msg.len = len + 1; /* 要寫入的數據長度 */
return i2c_transfer(client- >adapter, &msg, 1);
}
-
數據
+關注
關注
8文章
7292瀏覽量
93367 -
I2C
+關注
關注
28文章
1543瀏覽量
129761
發(fā)布評論請先 登錄
i2c總線ppt(I2C總線器件應用)
i2c總線技術 (非常詳細)
I2C Guid I2C指南
硬件I2C與模擬I2C

評論