I2C 讀
I2C 先寫后讀
其實(shí)所謂的 I2C 讀,都是先寫后讀。
I2C spec 規(guī)定如下
詳細(xì)解析如下(詳細(xì)看圖)
對(duì)從機(jī)進(jìn)行讀操作時(shí),主設(shè)備發(fā)出開始標(biāo)志 (S) 和讀地址 (從機(jī)地址加一個(gè) R/W 位,1 為讀,0 為寫)。等待從機(jī)產(chǎn)生應(yīng)答信號(hào)。然后發(fā)送寄存器地址,告訴從機(jī)讀哪一個(gè)寄存器。緊接著,收到應(yīng)答信號(hào)后,主設(shè)備再發(fā)一個(gè)開始信號(hào),然后發(fā)送從設(shè)備讀地址。從機(jī)產(chǎn)生應(yīng)答信號(hào)并開始發(fā)送寄存器數(shù)據(jù)。通信以主設(shè)備產(chǎn)生的拒絕應(yīng)答信號(hào) (NACK) 和結(jié)束標(biāo)志 (P) 結(jié)束。
舉例(例子進(jìn)行了兩次封裝)
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; /* 標(biāo)記為發(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; /* 標(biāo)記為讀取數(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文章
4665瀏覽量
71710 -
I2C
+關(guān)注
關(guān)注
28文章
1541瀏覽量
127692
發(fā)布評(píng)論請(qǐng)先 登錄
I2C總線—電平轉(zhuǎn)換

i2c總線ppt(I2C總線器件應(yīng)用)
i2c總線的特點(diǎn)
I2C總線規(guī)范與I2C器件C51讀寫程序
I2C Guid I2C指南
基于CPLD的I2C總線接口設(shè)計(jì)

I2C LCD 器件通過驅(qū)動(dòng)帶有 I2C 接口的 2 線式 16 字符 LCD

硬件I2C與模擬I2C

ESP 12E I2c基卡的I2C IO卡設(shè)計(jì)

I2C子系統(tǒng)SW Architecture

I2C和I3C的區(qū)別有哪些

評(píng)論