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長(zhǎng)度*/
/* 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ù)長(zhǎng)度*/
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;
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
設(shè)備
+關(guān)注
關(guān)注
2文章
4835瀏覽量
73734 -
I2C
+關(guān)注
關(guān)注
28文章
1556瀏覽量
131242
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
熱點(diǎn)推薦
I2C總線—電平轉(zhuǎn)換
我們先來看一張圖,熟悉I2C的人一看,這不是I2C的level shifter電路嘛,在Philip的I2C標(biāo)準(zhǔn)里面有,沒有啥復(fù)雜的。
i2c總線ppt(I2C總線器件應(yīng)用)
I2C總線器件應(yīng)用第一節(jié) I2C總線器件應(yīng)用概述I2C總線工作原理I2C總線系統(tǒng)結(jié)構(gòu)I2C總線系統(tǒng)結(jié)構(gòu)如圖7-1所示。其中,SCL是時(shí)鐘線,
發(fā)表于 08-13 17:34
?0次下載
i2c總線的特點(diǎn)
i2c總線的特點(diǎn):2 I2C 總線使設(shè)計(jì)人員和廠商都得益.. 3
2.1 設(shè)計(jì)人員的得益.. 4
2.2 廠商的得益. 5
3 介紹I2C 總線規(guī)范 6
4
發(fā)表于 08-05 09:05
?26次下載
I2C總線規(guī)范與I2C器件C51讀寫程序
I2C總線規(guī)范與I2C器件C51讀寫程序:本文簡(jiǎn)要介紹了I2C總線,并給出了I2C器件的C51讀
發(fā)表于 08-22 17:51
?95次下載
I2C Guid I2C指南
I2C Guid I2C指南
The I2C bus is used in a wide rangeof applications because it is simpleand
發(fā)表于 04-23 13:55
?36次下載
基于CPLD的I2C總線接口設(shè)計(jì)
在電路設(shè)計(jì)中,I2C總線是比較常用的兩線式串行通信方式,大多數(shù)的CPU都擅長(zhǎng)于并口操作,不具備直接操作I2C總線接口的能力。為了使不具備I2C總線接口能力的CPU通過對(duì)并口的簡(jiǎn)單操作實(shí)現(xiàn)對(duì)I2
發(fā)表于 02-12 16:11
?96次下載
I2C LCD 器件通過驅(qū)動(dòng)帶有 I2C 接口的 2 線式 16 字符 LCD
I2C LCD 器件通過驅(qū)動(dòng)帶有 I2C 接口的 2 線式 16 字符 LCD
發(fā)表于 10-10 08:22
?13次下載
硬件I2C與模擬I2C
硬件I2C對(duì)應(yīng)芯片上的I2C外設(shè),有相應(yīng)I2C驅(qū)動(dòng)電路,其所使用的I2C管腳也是專用的,因而效率要遠(yuǎn)高于軟件模擬的I2C;一般也較為穩(wěn)定,但
發(fā)表于 12-28 19:14
?82次下載
ESP 12E I2c基卡的I2C IO卡設(shè)計(jì)
電子發(fā)燒友網(wǎng)站提供《ESP 12E I2c基卡的I2C IO卡設(shè)計(jì).zip》資料免費(fèi)下載
發(fā)表于 08-15 09:27
?3次下載
I2C子系統(tǒng)SW Architecture
I2C SW Architecture 【driver 驅(qū)動(dòng)層】由普通驅(qū)動(dòng)工程師負(fù)責(zé),【i2c 核心層】由 Linux 提供,【i2c 核心層】以下由芯片原廠負(fù)責(zé)。 I2C 子系統(tǒng)
I2C和I3C的區(qū)別有哪些
I2C 和 I3C 主要區(qū)別如下: I2C 雖然也是兩條線,但是很多時(shí)候傳感器需要一條額外的中斷線,來告訴主控?cái)?shù)據(jù)已經(jīng)準(zhǔn)備好。I3C 允許從設(shè)備直接在總線上產(chǎn)生中斷,不再需要一條額外的
i2c采樣是上升沿嗎?
i2c采樣是上升沿嗎?? I2C采樣是指在I2C總線上對(duì)數(shù)據(jù)進(jìn)行采樣。在I2C總線上,數(shù)據(jù)的傳輸是通過2條線傳遞。一條是時(shí)鐘線(SCL),另
I2C先寫后讀是什么
評(píng)論