I2C 讀
I2C 先寫后讀
其實所謂的 I2C 讀,都是先寫后讀。
I2C spec 規(guī)定如下
詳細解析如下(詳細看圖)
對從機進行讀操作時,主設(shè)備發(fā)出開始標志 (S) 和讀地址 (從機地址加一個 R/W 位,1 為讀,0 為寫)。等待從機產(chǎn)生應(yīng)答信號。然后發(fā)送寄存器地址,告訴從機讀哪一個寄存器。緊接著,收到應(yīng)答信號后,主設(shè)備再發(fā)一個開始信號,然后發(fā)送從設(shè)備讀地址。從機產(chǎn)生應(yīng)答信號并開始發(fā)送寄存器數(shù)據(jù)。通信以主設(shè)備產(chǎn)生的拒絕應(yīng)答信號 (NACK) 和結(jié)束標志 (P) 結(jié)束。
舉例(例子進行了兩次封裝)
void ap3216c_readdata(struct ap3216c_dev *dev)
{
unsigned char i =0;
unsigned char buf[6];
/* 循環(huán)讀取所有傳感器數(shù)據(jù) */
for(i = 0; i < 6; i++)
{
buf[i] = ap3216c_read_reg(dev, AP3216C_IRDATALOW + i);
}
}
static unsigned char ap3216c_read_reg(struct ap3216c_dev *dev, u8 reg)
{
u8 data = 0;
ap3216c_read_regs(dev, reg, &data, 1);
return data;
}
static int ap3216c_read_regs(struct ap3216c_dev *dev, u8 reg, void *val, int len)
{
int ret;
struct i2c_msg msg[2];
struct i2c_client *client = (struct i2c_client *)dev- >private_data;
/* msg[0]為發(fā)送要讀取的首地址 */
msg[0].addr = client- >addr; /* ap3216c地址 */
msg[0].flags = 0; /* 標記為發(fā)送數(shù)據(jù) */
msg[0].buf = ? /* 讀取的首地址 */
msg[0].len = 1; /* reg長度*/
/* msg[1]讀取數(shù)據(jù) */
msg[1].addr = client- >addr; /* ap3216c地址 */
msg[1].flags = I2C_M_RD; /* 標記為讀取數(shù)據(jù)*/
msg[1].buf = val; /* 讀取數(shù)據(jù)緩沖區(qū) */
msg[1].len = len; /* 要讀取的數(shù)據(jù)長度*/
ret = i2c_transfer(client- >adapter, msg, 2);
if(ret == 2) {
ret = 0;
} else {
printk("i2c rd failed=%d reg=%06x len=%dn",ret, reg, len);
ret = -EREMOTEIO;
}
return ret;
}
-
設(shè)備
+關(guān)注
關(guān)注
2文章
4423瀏覽量
70462 -
I2C
+關(guān)注
關(guān)注
28文章
1469瀏覽量
122853
發(fā)布評論請先 登錄
相關(guān)推薦
評論