日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

I2C实验

發(fā)布時間:2023/12/10 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 I2C实验 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

參考:I2C 總線協(xié)議詳解
作者:一只青木呀
發(fā)布時間:2020-09-21 11:41:25
網(wǎng)址:https://blog.csdn.net/weixin_45309916/article/details/108705297

目錄

  • I2C 簡介
  • I2C 協(xié)議
  • I2C協(xié)議有關(guān)術(shù)語
    • 1、起始位
    • 2、停止位
    • 3、數(shù)據(jù)傳輸
    • 4、應(yīng)答信號
    • 5、I2C 寫時序(主機(jī)向從機(jī))
    • 6、I2C 讀時序(主機(jī)向從機(jī))
    • 7、I2C 多字節(jié)讀寫時序
  • I.MX6U I2C 簡介
  • AP3216C 簡介
  • 硬件原理分析
  • 實驗程序編寫
  • 編譯下載驗證
    • 編寫Makefile 和鏈接腳本
    • 編譯下載

I2C 是最常用的通信接口,眾多的傳感器都會提供I2C 接口來和主控相連,比如陀螺儀、加速度計、觸摸屏等等。所以I2C 是做嵌入式開發(fā)必須掌握的,I.MX6U 有4 個I2C 接口,可以通過這4 個I2C 接口來連接一些I2C 外設(shè)。I.MX6U-ALPHA 使用I2C1 接口連接了一個距離傳感器AP3216C,本章我們就來學(xué)習(xí)如何使用I.MX6U 的I2C 接口來驅(qū)動AP3216C,讀取AP3216C 的傳感器數(shù)據(jù)。


I2C 簡介

I2C 是很常見的一種總線協(xié)議, I2C 是 NXP 公司設(shè)計的, I2C 使用兩條線在主控制器和從機(jī)之間進(jìn)行數(shù)據(jù)通信。一條是 SCL(串行時鐘線),另外一條是 SDA(串行數(shù)據(jù)線),這兩條數(shù)據(jù)線需要接上拉電阻,總線空閑的時候 SCL 和 SDA 處于高電平。 I2C 總線標(biāo)準(zhǔn)模式下速度可以達(dá)到 100Kb/S,快速模式下可以達(dá)到 400Kb/S。 I2C 總線工作是按照一定的協(xié)議來運行的,接下來就看一下 I2C 協(xié)議。

I2C 協(xié)議

I2C 是支持多從機(jī)的,也就是一個 I2C 控制器下可以掛多個 I2C 從設(shè)備,這些不同的 I2C從設(shè)備有不同的器件地址,這樣 I2C 主控制器就可以通過 I2C 設(shè)備的器件地址訪問指定的 I2C設(shè)備了,一個 I2C 總線連接多個 I2C 設(shè)備如下圖所示:

上圖中 SDA 和 SCL 這兩根線必須要接一個上拉電阻,一般是 4.7K。其余的 I2C 從器件都掛接到 SDA 和 SCL 這兩根線上,這樣就可以通過 SDA 和 SCL 這兩根線來訪問多個 I2C設(shè)備。

I2C協(xié)議有關(guān)術(shù)語

1、起始位

顧名思義,也就是 I2C 通信起始標(biāo)志,通過這個起始位就可以告訴 I2C 從機(jī),“我”要開始進(jìn)行 I2C 通信了。在 SCL 為高電平的時候, SDA 出現(xiàn)下降沿就表示為起始位,如下圖所示:

2、停止位

停止位就是停止 I2C 通信的標(biāo)志位,和起始位的功能相反。在 SCL 位高電平的時候, SDA出現(xiàn)上升沿就表示為停止位,如下圖所示:

3、數(shù)據(jù)傳輸

I2C 總線在數(shù)據(jù)傳輸?shù)臅r候要保證在 SCL 高電平期間, SDA 上的數(shù)據(jù)穩(wěn)定,因此 SDA 上的數(shù)據(jù)變化只能在 SCL 低電平期間發(fā)生,如下圖所示:

4、應(yīng)答信號

當(dāng) I2C 主機(jī)發(fā)送完 8 位數(shù)據(jù)以后會將 SDA 設(shè)置為輸入狀態(tài),等待 I2C 從機(jī)應(yīng)答,也就是等到 I2C 從機(jī)告訴主機(jī)它接收到數(shù)據(jù)了。應(yīng)答信號是由從機(jī)發(fā)出的,主機(jī)需要提供應(yīng)答信號所需的時鐘,主機(jī)發(fā)送完 8 位數(shù)據(jù)以后緊跟著的一個時鐘信號就是給應(yīng)答信號使用的。從機(jī)通過將 SDA 拉低來表示發(fā)出應(yīng)答信號,表示通信成功,否則表示通信失敗。

5、I2C 寫時序(主機(jī)向從機(jī))

主機(jī)通過 I2C 總線與從機(jī)之間進(jìn)行通信不外乎兩個操作:寫和讀, I2C 總線單字節(jié)寫時序如下圖所示:

上圖就是 I2C 寫時序,我們來看一下寫時序的具體步驟:

  • 1)、開始信號。
  • 2)、發(fā)送 I2C 設(shè)備地址,每個 I2C 器件都有一個設(shè)備地址,通過發(fā)送具體的設(shè)備地址來決定訪問哪個 I2C 器件。這是一個 8 位的數(shù)據(jù),其中高 7 位是設(shè)備地址,最后 1 位是讀寫位,為1 的話表示這是一個讀操作,為 0 的話表示這是一個寫操作。
  • 3)、 I2C 器件地址后面跟著一個讀寫位,為 0 表示寫操作,為 1 表示讀操作。
  • 4)、從機(jī)發(fā)送的 ACK 應(yīng)答信號
  • 5)、重新發(fā)送開始信號。
  • 6)、發(fā)送要寫寫入數(shù)據(jù)的寄存器地址。
  • 7)、從機(jī)發(fā)送的 ACK 應(yīng)答信號
  • 8)、發(fā)送要寫入寄存器的數(shù)據(jù)。
  • 9)、從機(jī)發(fā)送的 ACK 應(yīng)答信號
  • 10)、停止信號。

6、I2C 讀時序(主機(jī)向從機(jī))

I2C 總線單字節(jié)讀時序如下圖所示:

I2C 單字節(jié)讀時序比寫時序要復(fù)雜一點,讀時序分為 4 大步,第一步是發(fā)送設(shè)備地址,第二步是發(fā)送要讀取的寄存器地址,第三步重新發(fā)送設(shè)備地址,最后一步就是 I2C 從器件輸出要讀取的寄存器值,我們具體來看一下這步。

  • 1)、主機(jī)發(fā)送起始信號。
  • 2)、主機(jī)發(fā)送要讀取的 I2C 從設(shè)備地址。
  • 3)、讀寫控制位,因為是向 I2C 從設(shè)備發(fā)送數(shù)據(jù),因此是寫信號。
  • 4)、從機(jī)發(fā)送的 ACK 應(yīng)答信號。
  • 5)、重新發(fā)送 START 信號。
  • 6)、主機(jī)發(fā)送要讀取的寄存器地址。
  • 7)、從機(jī)發(fā)送的 ACK 應(yīng)答信號。
  • 8)、重新發(fā)送 START 信號。
  • 9)、重新發(fā)送要讀取的 I2C 從設(shè)備地址。
  • 10)、讀寫控制位,這里是讀信號,表示接下來是從 I2C 從設(shè)備里面讀取數(shù)據(jù)。
  • 11)、從機(jī)發(fā)送的 ACK 應(yīng)答信號。
  • 12)、從 I2C 器件里面讀取到的數(shù)據(jù)。
  • 13)、主機(jī)發(fā)出 NO ACK 信號,表示讀取完成,不需要從機(jī)再發(fā)送 ACK 信號了。
  • 14)、主機(jī)發(fā)出 STOP 信號,停止 I2C 通信。

7、I2C 多字節(jié)讀寫時序

有時候我們需要讀寫多個字節(jié),多字節(jié)讀寫時序和單字節(jié)的基本一致,只是在讀寫數(shù)據(jù)的時候可以連續(xù)發(fā)送多個自己的數(shù)據(jù),其他的控制時序都是和單字節(jié)一樣的。

I.MX6U I2C 簡介

I.MX6U 提供了4 個I2C 外設(shè),通過這四個I2C 外設(shè)即可完成與I2C 從器件進(jìn)行通信,I.MX6U 的I2C 外設(shè)特性如下:

①、與標(biāo)準(zhǔn)I2C 總線兼容。
②、多主機(jī)運行
③、軟件可編程的64 中不同的串行時鐘序列。
④、軟件可選擇的應(yīng)答位。
⑤、開始/結(jié)束信號生成和檢測。
⑥、重復(fù)開始信號生成。
⑦、確認(rèn)位生成。
⑧、總線忙檢測

I.MX6U 的I2C 支持兩種模式:標(biāo)準(zhǔn)模式和快速模式,標(biāo)準(zhǔn)模式下I2C 數(shù)據(jù)傳輸速率最高是100Kbits/s,在快速模式下數(shù)據(jù)傳輸速率最高為400Kbits/s。

我們接下來看一下I2C 的幾個重要的寄存器,首先看一下I2Cx_IADR(x=1~4)寄存器,這是I2C 的地址寄存器,此寄存器結(jié)構(gòu)如圖26.1.2.1 所示:

寄存器I2Cx_IADR 只有ADR(bit7:1)位有效,用來保存I2C 從設(shè)備地址數(shù)據(jù)。當(dāng)我們要訪問某個I2C 從設(shè)備的時候就需要將其設(shè)備地址寫入到ADR 里面。接下來看一下寄存器I2Cx_IFDR,這個是I2C 的分頻寄存器,寄存器結(jié)構(gòu)如圖26.1.2.2 所示:

寄存器I2Cx_IFDR 也只有IC(bit5:0)這個位,用來設(shè)置I2C 的波特率,I2C 的時鐘源可以選擇IPG_CLK_ROOT=66MHz,通過設(shè)置IC 位既可以得到想要的I2C 波特率。IC 位可選的設(shè)置如圖26.1.2.3 所示:

不像其他外設(shè)的分頻設(shè)置一樣可以隨意設(shè)置,圖26.1.2.3 中列出了IC 的所有可選值。比如現(xiàn)在I2C 的時鐘源為66MHz,我們要設(shè)置I2C 的波特率為100KHz,那么IC 就可以設(shè)置為0X15,也就是640 分頻。66000000/640=103.125KHz≈100KHz。

接下來看一下寄存器I2Cx_I2CR,這個是I2C 控制寄存器,此寄存器結(jié)構(gòu)如圖26.1.2.4 所示:

寄存器I2Cx_I2CR 的各位含義如下:

IEN(bit7):I2C 使能位,為1 的時候使能I2C,為0 的時候關(guān)閉I2C。

IIEN(bit6):I2C 中斷使能位,為1 的時候使能I2C 中斷,為0 的時候關(guān)閉I2C 中斷。

MSTA(bit5):主從模式選擇位,設(shè)置IIC 工作在主模式還是從模式,為1 的時候工作在主模式,為0 的時候工作在從模式。

MTX(bit4):傳輸方向選擇位,用來設(shè)置是進(jìn)行發(fā)送還是接收,為0 的時候是接收,為1 的時候是發(fā)送。

TXAK(bit3):傳輸應(yīng)答位使能,為0 的話發(fā)送ACK 信號,為1 的話發(fā)送NO ACK 信號。

RSTA(bit2):重復(fù)開始信號,為1 的話產(chǎn)生一個重新開始信號。

接下來看一下寄存器I2Cx_I2SR,這個是I2C 的狀態(tài)寄存器,寄存器結(jié)構(gòu)如圖26.1.2.5 所示:

寄存器I2Cx_I2SR 的各位含義如下:

ICF(bit7):數(shù)據(jù)傳輸狀態(tài)位,為0 的時候表示數(shù)據(jù)正在傳輸,為1 的時候表示數(shù)據(jù)傳輸完成。

IAAS(bit6):當(dāng)為1 的時候表示I2C 地址,也就是I2Cx_IADR 寄存器中的地址是從設(shè)備地址。

IBB(bit5):I2C 總線忙標(biāo)志位,當(dāng)為0 的時候表示I2C 總線空閑,為1 的時候表示I2C 總線忙。

IAL(bit4):仲裁丟失位,為1 的時候表示發(fā)生仲裁丟失。

SRW(bit2):從機(jī)讀寫狀態(tài)位,當(dāng)I2C 作為從機(jī)的時候使用,此位用來表明主機(jī)發(fā)送給從機(jī)的是讀還是寫命令。為0 的時候表示主機(jī)要向從機(jī)寫數(shù)據(jù),為1 的時候表示主機(jī)要從從機(jī)讀取數(shù)據(jù)。

IIF(bit1):I2C 中斷掛起標(biāo)志位,當(dāng)為1 的時候表示有中斷掛起,此位需要軟件清零。

RXAK(bit0):應(yīng)答信號標(biāo)志位,為0 的時候表示接收到ACK 應(yīng)答信號,為1 的話表示檢測到NO ACK 信號。

最后一個寄存器就是I2Cx_I2DR,這是I2C 的數(shù)據(jù)寄存器,此寄存器只有低8 位有效,當(dāng)要發(fā)送數(shù)據(jù)的時候?qū)⒁l(fā)送的數(shù)據(jù)寫入到此寄存器,如果要接收數(shù)據(jù)的話直接讀取此寄存器即可得到接收到的數(shù)據(jù)。

關(guān)于I2C 的寄存器就介紹到這里,關(guān)于這些寄存器詳細(xì)的描述,請參考《I.MX6ULL 參考手冊》第1462 頁的31.7 小節(jié)。

AP3216C 簡介

I.MX6U-ALPHA 開發(fā)板上通過I2C1 連接了一個三合一環(huán)境傳感器:AP3216C,AP3216C是由敦南科技推出的一款傳感器,其支持環(huán)境光強(qiáng)度(ALS)、接近距離(PS)和紅外線強(qiáng)度(IR)這三個環(huán)境參數(shù)檢測。該芯片可以通過IIC 接口與主控制相連,并且支持中斷,AP3216C 的特點如下:

①、I2C 接口,快速模式下波特率可以到400Kbit/S
②、多種工作模式選擇:ALS、PS+IR、ALS+PS+IR、PD 等等。
③、內(nèi)建溫度補(bǔ)償電路。
④、寬工作溫度范圍(-30°C ~ +80°C)。
⑤、超小封裝,4.1mm x 2.4mm x 1.35mm
⑥、環(huán)境光傳感器具有16 位分辨率。
⑦、接近傳感器和紅外傳感器具有10 位分辨率。

AP3216C 常被用于手機(jī)、平板、導(dǎo)航設(shè)備等,其內(nèi)置的接近傳感器可以用于檢測是否有物體接近,比如手機(jī)上用來檢測耳朵是否接觸聽筒,如果檢測到的話就表示正在打電話,手機(jī)就會關(guān)閉手機(jī)屏幕以省電。也可以使用環(huán)境光傳感器檢測光照強(qiáng)度,可以實現(xiàn)自動背光亮度調(diào)節(jié)。
AP3216C 結(jié)構(gòu)如圖26.1.3.1 所示:

AP3216 的設(shè)備地址為0X1E,同幾乎所有的I2C 從器件一樣,AP3216C 內(nèi)部也有一些寄存器,通過這些寄存器我們可以配置AP3216C 的工作模式,并且讀取相應(yīng)的數(shù)據(jù)。AP3216C 我們用的寄存器如表26.1.3.1 所示:

在表26.1.3.1 中,0X00 這個寄存器是模式控制寄存器,用來設(shè)置AP3216C 的工作模式,一般開始先將其設(shè)置為0X04,也就是先軟件復(fù)位一次AP3216C。接下來根據(jù)實際使用情況選擇合適的工作模式,比如設(shè)置為0X03,也就是開啟ALS+PS+IR。從0X0A~0X0F 這6 個寄存器就是數(shù)據(jù)寄存器,保存著ALS、PS 和IR 這三個傳感器獲取到的數(shù)據(jù)值。如果同時打開ALS、PS 和IR 則讀取間隔最少要112.5ms,因為AP3216C 完成一次轉(zhuǎn)換需要112.5ms。關(guān)于AP3216C的介紹就到這里,如果要想詳細(xì)的研究此芯片的話,請大家自行查閱其數(shù)據(jù)手冊。

本章實驗中我們通過I.MX6U 的I2C1 來讀取AP3216C 內(nèi)部的ALS、PS 和IR 這三個傳感器的值,并且在LCD 上顯示。開機(jī)會先檢測AP3216C 是否存在,一般的芯片是有個ID 寄存器,通過讀取ID 寄存器判斷ID 是否正確就可以檢測芯片是否存在。但是AP3216C 沒有ID 寄存器,所以我們就通過向寄存器0X00 寫入一個值,然后再讀取0X00 寄存器,判斷讀出得到值和寫入的是否相等,如果相等就表示AP3216C 存在,否則的話AP3216C 就不存在。本章的配置步驟如下:

1、初始化相應(yīng)的IO
初始化I2C1 相應(yīng)的IO,設(shè)置其復(fù)用功能,如果要使用AP3216C 中斷功能的話,還需要設(shè)置AP3216C 的中斷IO。
2、初始化I2C1
初始化I2C1 接口,設(shè)置波特率。
3、初始化AP3216C
初始化AP3216C,讀取AP3216C 的數(shù)據(jù)。

硬件原理分析

本試驗用到的資源如下:
①、指示燈LED0。
②、RGB LCD 屏幕。
③、AP3216C
④、串口

AP3216C 是在I.MX6U-ALPHA 開發(fā)板底板上,原理圖如圖26.2.1 所示:


從圖26.2.1 可以看出AP3216C 使用的是I2C1,其中I2C1_SCL 使用的UART4_TXD 這個IO、I2C1_SDA 使用的是UART4_R XD 這個IO。

實驗程序編寫

本實驗對應(yīng)的例程路徑為:開發(fā)板光盤-> 1、裸機(jī)例程-> 17_i2c。

本章實驗在上一章例程的基礎(chǔ)上完成,更改工程名字為“ap3216c”,然后在bsp 文件夾下創(chuàng)建名為“i2c”和“ap3216c”的文件夾。在bsp/i2c 中新建bsp_i2c.c 和bsp_i2c.h 這兩個文件,在bsp/ap3216c 中新建bsp_ap3216c.c 和bsp_ap3216c.h 這兩個文件。bsp_i2c.c 和bsp_i2c.h 是I.MX6U 的I2C 文件,bsp_ap3216c.c 和bsp_ap3216c.h 是AP3216C 的驅(qū)動文件。在sp_i2c.h 中輸入如下內(nèi)容:

1 #ifndef _BSP_I2C_H 2 #define _BSP_I2C_H 3 /*************************************************************** 4 Copyright ? zuozhongkai Co., Ltd. 1998-2019. All rights reserved. 5 文件名: bsp_i2c.h 6 作者: 左忠凱 7 版本: V1.0 8 描述: IIC驅(qū)動文件。 9 其他: 無 10 論壇: www.openedv.com 11 日志: 初版V1.0 2019/1/15 左忠凱創(chuàng)建 12 ***************************************************************/ 13 #include "imx6ul.h" 14 15 /* 相關(guān)宏定義*/ 16 #define I2C_STATUS_OK (0)

第16 到22 行定義了一些I2C 狀態(tài)相關(guān)的宏。第27 到31 行定義了一個枚舉類型i2c_direction,此枚舉類型用來表示I2C 主機(jī)對從機(jī)的操作,也就是讀數(shù)據(jù)還是寫數(shù)據(jù)。第36 到44 行定義了一個結(jié)構(gòu)體i2c_transfer,此結(jié)構(gòu)體用于I2C 的數(shù)據(jù)傳輸。剩下的就是一些函數(shù)聲明了,總體來說bsp_i2c.h 文件里面的內(nèi)容還是很簡單的。接下來在文件bsp_i2c.c 里面輸入如下內(nèi)容:

/*************************************************************** Copyright ? zuozhongkai Co., Ltd. 1998-2019. All rights reserved. 文件名: bsp_i2c.c 作者: 左忠凱 版本: V1.0 描述: IIC驅(qū)動文件。 其他: 無 論壇: www.openedv.com 日志: 初版V1.0 2019/1/15 左忠凱創(chuàng)建 ***************************************************************/ 1 #include "bsp_i2c.h" 2 #include "bsp_delay.h" 3 #include "stdio.h" 4 5 /* 6 * @description : 初始化I2C,波特率100KHZ 7 * @param – base : 要初始

文件bsp_i2c.c中一共有8 個函數(shù),我們依次來看一下這些函數(shù)的功能,首先是函數(shù)i2c_init,此函數(shù)用來初始化I2C,重點是設(shè)置I2C 的波特率,初始化完成以后開啟I2C。第2 個函數(shù)是i2c_master_repeated_start,此函數(shù)用來發(fā)送一個重復(fù)開始信號,發(fā)送開始信號的時候也會順帶發(fā)送從設(shè)備地址。第3 個函數(shù)是i2c_master_start,此函數(shù)用于發(fā)送一個開始信號,發(fā)送開始信號
的時候也順帶發(fā)送從設(shè)備地址。第4 個函數(shù)是i2c_check_and_clear_error,此函數(shù)用于檢查并清除錯誤。第5 個函數(shù)是i2c_master_stop,用于產(chǎn)生一個停止信號。第6 和第7 個函數(shù)分別為i2c_master_write 和i2c_master_read,這兩個函數(shù)分別用于完成向I2C 從設(shè)備寫數(shù)據(jù)和從I2C 從設(shè)備讀數(shù)據(jù)。最后一個函數(shù)是i2c_master_transfer,此函數(shù)就是用戶最終調(diào)用的,用于完成I2C
通信的函數(shù),此函數(shù)會使用前面的函數(shù)拼湊出I2C 讀/寫時序。此函數(shù)就是按照26.1.1 小節(jié)講解的I2C 讀寫時序來編寫的。

I2C 的操作函數(shù)已經(jīng)準(zhǔn)備好了,接下來就是使用前面編寫I2C 操作函數(shù)來配置AP3216C 了,配置完成以后就可以讀取AP3216C 里面的傳感器數(shù)據(jù),在bsp_ap3216c.h 輸入如下所示內(nèi)容:

1 #ifndef _BSP_AP3216C_H 2 #define _BSP_AP3216C_H

第15 到26 行定義了一些宏,分別為AP3216C 的設(shè)備地址和寄存器地址,剩下的就是函數(shù)聲明。接下來在bsp_ap3216c.c 中輸入如下所示內(nèi)容:

/*************************************************************** Copyright ? zuozhongkai Co., Ltd. 1998-2019. All rights reserved. 文件名: bsp_ap3216c.c 作者: 左忠凱

文件bsp_ap3216c.c 里面共有4 個函數(shù),第1 個函數(shù)是ap3216c_init,顧名思義,此函數(shù)用于初始化AP3216C,初始化成功的話返回0,如果初始化失敗就返回其他值。此函數(shù)先初始化所使用到的IO,比如初始化I2C1 的相關(guān)IO,并設(shè)置其復(fù)用為I2C1。然后此函數(shù)會調(diào)用i2c_init來初始化I2C1,最后初始化AP3216C。第2 個和第3 個函數(shù)分別為ap3216c_writeonebyte 和
ap3216c_readonebyte,這兩個函數(shù)分別是向AP3216C 寫入數(shù)據(jù)和從AP3216C 讀取數(shù)據(jù)。這兩個函數(shù)都通過調(diào)用bsp_i2c.c 中的函數(shù)i2c_master_transfer 來完成對AP3216C 的讀寫。最后一個函數(shù)就是ap3216c_readdata,此函數(shù)用于讀取AP3216C 中的ALS、PS 和IR 傳感器數(shù)據(jù)。

最后在main.c 中輸入如下代碼:

/************************************************************** Copyright ? zuozhongkai Co., Ltd. 1998-2019. All rights reserved. 文件名: main.c 作者: 左忠凱 版本: V1.0 描述: I.MX6U開發(fā)板裸機(jī)實驗18 IIC實驗 其他: IIC是最常用的接口,ALPHA開發(fā)板上有多個IIC外設(shè),本實驗就 來學(xué)習(xí)如何驅(qū)動I.MX6U的IIC接口,并且通過IIC接口讀取板載 AP3216C的數(shù)據(jù)值。 論壇: www.openedv.com 日志: 初版V1.0 2019/1/15 左忠凱創(chuàng)建 **************************************************************/ 1 #include "bsp_clk.h" 2 #include "bsp_delay.h" 3 #include "bsp_led.h" 4 #include "bsp_beep.h" 5 #include "bsp_key.h" 6 #include "bsp_int.h" 7 #include "bsp_uart.h" 8 #include "bsp_lcd.h" 9 #include "bsp_rtc.h" 10 #include "bsp_ap3216c.h" 11 #include "stdio.h" 12 13 /* 14 * @description : main函數(shù) 15 * @param : 無 16 * @return : 無

第38 行調(diào)用ap3216c_init 來初始化AP3216C,如果AP3216C 初始化失敗的話就會進(jìn)入循環(huán),會在LCD 上不斷的閃爍字符串“AP3216C Check Failed!”和“Please Check!”,直到AP3216C初始化成功。

第53 行調(diào)用函數(shù)ap3216c_readdata 來獲取AP3216C 的ALS、PS 和IR 傳感器數(shù)據(jù)值,獲取完成以后就會在LCD 上顯示出來。

文件main.c 里面的內(nèi)容總體上還是很簡單的,實驗程序的編寫就到這里。

編譯下載驗證

編寫Makefile 和鏈接腳本

修改Makefile 中的TARGET 為ap3216c,然后在在INCDIRS 和SRCDIRS 中加入“bsp/i2c”和“bsp/ap3216c”,修改后的Makefile 如下:

1 CROSS_COMPILE ?= arm-linux-gnueabihf- 2 TARGET ?= ap3216c 3 4 /* 省略掉其它代碼...... */ 5 6 INCDIRS := imx6ul \ 7 stdio/in

第2 行修改變量TARGET 為“ap3216c”,也就是目標(biāo)名稱為“ap3216c”。

第21 和22 行在變量INCDIRS 中添加I2C 和AP3216C 的驅(qū)動頭文件(.h)路徑。

第39 和40 行在變量SRCDIRS 中添加I2C 和AP3216C 驅(qū)動文件(.c)路徑。
鏈接腳本保持不變。

編譯下載

使用Make 命令編譯代碼,編譯成功以后使用軟件imxdownload 將編譯完成的ap3216c.bin文件下載到SD 卡中,命令如下:

chmod 777 imxdownload //給予imxdownload 可執(zhí)行權(quán)限,一次即可 ./imxdownload ap3216c.bin /dev/sdd //燒寫到SD 卡中,不能燒寫到/dev/sda 或sda1 里面!

燒寫成功以后將SD 卡插到開發(fā)板的SD 卡槽中,然后復(fù)位開發(fā)板。程序運行以后LCD界面如圖26.4.2.1 所示:

圖26.4.2.1 中顯示出了AP3216C 的三個傳感器的數(shù)據(jù),大家可以用手遮住或者靠近AP3216C,LCD 上的三個數(shù)據(jù)就會變化。

總結(jié)

以上是生活随笔為你收集整理的I2C实验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。