国产精品久久久久久亚洲,国产成人无码午夜视频在线观看 ,国产福利一区二区三区在线观看,国产av第一次处破,厨房玩弄丝袜人妻系列国产电影

首頁 >>> 公司新聞 >

公司新聞

芯片之I2C配置

I2C總線簡介
首先按照慣例俗套的說一下I2C總線的定義,I2C總線是由Philips公司開發(fā)的一種簡單、雙向二線制同步串行總線。它只需要兩根分別命名為SDA(串行數(shù)據(jù)線)和SCL(串行時鐘線)的信號線連接不同的器件即可傳輸信息。
I2C總線上的器件有主從之分,在嵌入式系統(tǒng)上的主器件一般是嵌入式主芯片(MCU),主器件負(fù)責(zé)啟動、終止數(shù)據(jù)傳送,產(chǎn)生時鐘信號。從器件一般是外部設(shè)備,像小編所在行業(yè)的外部設(shè)備包括溫度傳感器、Tunner、HDMI等。
I2C主設(shè)備配置
了解了I2C總線的定義和基本原理后,我們怎樣做才能讓I2C總線正常工作呢?
首先,我們得配置I2C(本文以Hi3798CV200芯片為例)。
步驟一:硬件確認(rèn),確認(rèn)連接MCU和外設(shè)用的那一組I2C通道。Hi3798CV200 芯片集成5個I2C控制器(一般命名為I2C0~I2C4),實現(xiàn)標(biāo)準(zhǔn)I2C主設(shè)備功能,可完成對I2C總線上的從設(shè)備的數(shù)據(jù)發(fā)送和接收,這里我們確認(rèn)的是I2C1。
步驟二:確認(rèn)硬件管腳復(fù)用情況。因為在嵌入芯片中,絕大多數(shù)管腳都是復(fù)用的。我們首先查一下芯片datasheet,看該管腳是否是復(fù)用的。從下圖可以看出來該I2C管腳是復(fù)用的:

步驟三:配置復(fù)用寄存器。從步驟二可以看出,我們使用的I2C1管腳是有復(fù)用的,所以我們要配置復(fù)用寄存器使當(dāng)前管腳發(fā)揮I2C的功能。查看datasheet得知,控制該組I2C的復(fù)用寄存器分別是ioshare_56和ioshare_57。
我們可以按照下圖所示的將寄存器的低三位配置為010,即此管腳就是執(zhí)行I2C1的數(shù)據(jù)線功能了。

同樣的方法配置ioshare_57。
配置完后我們將記錄配置信息相應(yīng)的分區(qū)文件燒錄的開發(fā)板中。在串口輸入如下命令可以查看I2C的信息:
Hi3798CV200:/ # cat /proc/hisi/msp/i2c 
---------Hisilicon Standard I2C Info---------
No. Rate
0 0
1 100000
2 0
3 0
4 0
此信息顯示I2C1,速率100K。
I2C總線調(diào)試
前面一節(jié)我們配置了I2C主器件,接下來就是調(diào)試該總線,調(diào)試之前需要確認(rèn)從設(shè)備在I2C總線上的地址、該設(shè)備內(nèi)部寄存器地址以及寄存器地址長度。
小編這里用到的是一款溫度傳感器。其設(shè)備地址為0x90,內(nèi)部寄存器地址是0x0,寄存器地址長度為1個字節(jié)。
海思芯片I2C調(diào)試起來很方便,因為它自帶了I2C控制命令,包含了讀寫等操作,省去了自己寫調(diào)試代碼。
串口命令行下輸入i2c_read,就會告訴你讀取操作使用方法:
Hi3798CV200:/ # i2c_read 
Usage: i2c_read i2c_channel device_addr register_addr register_addr_len read_bytes_number
參數(shù)含義說明:
  • i2c_channel:I2C通道
  • device_addr:I2C設(shè)備地址。
  • register_addr: i2c設(shè)備內(nèi)部寄存器地址。
  • register_addr_len: i2c設(shè)備內(nèi)部寄存器地址長度。
  • read_bytes_number:所需要讀取的數(shù)據(jù)長度。
于是我們就可以按照上面的方法調(diào)試I2C總線了,命令行下輸入:
Hi3798CV200:/ # i2c_read 1 0x90 0 2 2
得到以下結(jié)果:

從上圖看出來,我們執(zhí)行是錯誤的,那么是不是I2C沒有配置好呢?別急,繼續(xù)檢查一遍我們輸入的命令,發(fā)現(xiàn)第4個參數(shù)寫成了2,而前面我們介紹的是寄存器地址長度為1個字節(jié)。修改命令:
Hi3798CV200:/ # i2c_read 1 0x90 0 1 2
查看執(zhí)行結(jié)果:

成功啦,成功讀取到2個字節(jié)內(nèi)容的數(shù)據(jù)。到這里,說明我們對I2C的配置是正確的!
I2C總線的工作狀態(tài)
1、I2C開始和停止工作
開始:當(dāng)SCL是高電平時,SDA從高電平跳變到低電平,則I2C總線開始工作
結(jié)束:當(dāng)SCL是高電平時,SDA從低電平跳變到高電平,則I2C總線結(jié)束工作,如下圖:

2、開始狀態(tài)后緊跟著主器件會發(fā)送一個字節(jié)的數(shù)據(jù),這個字節(jié)數(shù)據(jù)由7bit從器件地址和1bit讀寫位組成。
3、當(dāng)從器件收到總線上的地址并匹配,發(fā)現(xiàn)與自己地址相同時,則在第9個時鐘周期回復(fù)一個應(yīng)答反饋信號。
應(yīng)答信號如下圖:

4、當(dāng)主器件收到從器件的應(yīng)答信號后繼續(xù)發(fā)送后面的數(shù)據(jù)。從器件收到數(shù)據(jù)后發(fā)送ACK則表示繼續(xù)傳輸,發(fā)送NACK則傳輸結(jié)束。
留在后面的作業(yè)
小編用示波器抓取了一張I2C總線的波形圖,下圖黃色為SCL時鐘信號,綠色為SDA數(shù)據(jù)信號。