Linux應用開發基礎知識——I2C應用編程(十三)

一、無需編寫驅動程序即可訪問 I2C 設備

????????APP 訪問硬件肯定是需要驅動程序的,對于 I2C 設備,內核提供了驅動程序 drivers/i2c/i2c-dev.c,通過它可以直接使用下面的 I2C 控制器驅動程序來訪問 I2C 設備。

i2c-tools 是一套好用的工具,也是一套示例代碼。

1.體驗 I2C-Tools

????????使用一句話概括 I2C 傳輸:APP 通過 I2C Controller 與 I2C Device 傳 輸數據。 所以使用 I2C-Tools 時也需要指定:

?????????哪個 I2C 控制器(或稱為 I2C BUS、I2C Adapter)

???????? 哪個 I2C 設備(設備地址)

???????? 數據:讀還是寫、數據本身

(1)交叉編譯

????????配置環境:vim ~/.bashrc

export ARCH=arm
export CROSS_COMPILE= arm-buildroot-linux-gnueabihf-gccexport PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin

????????修改 I2C-Tools 的 Makefile 指定交叉編譯工具鏈

CC ?= gcc
AR ?= ar
STRIP ?= strip

????????改為(指定交叉編譯工具鏈前綴, 去掉問號):

CC = $(CROSS_COMPILE)gcc
AR = $(CROSS_COMPILE)ar
STRIP = $(CROSS_COMPILE)strip

????????在 Makefile 中,“?=”在第一次設置變量時才會起效果,如果之前設置過 該變量,則不會起效果。

(2)執行 make

????????執行 make 時,是動態鏈接,需要把 libi2c.so 也放到單板上

????????想靜態鏈接的話,執行:make USE_STATIC_LIB=1

(3)用法

???????? i2cdetect:I2C 檢測

// 列出當前的 I2C Adapter(或稱為 I2C Bus、I2C Controller)
i2cdetect -l
// 打印某個 I2C Adapter 的 Functionalities, I2CBUS 為 0、1、2 等整數
i2cdetect -F I2CBUS
// 看看有哪些 I2C 設備, I2CBUS 為 0、1、2 等整數
i2cdetect -y -a I2CBUS
// 效果如下
# i2cdetect -l
i2c-1 i2c STM32F7 I2C(0x40013000) I2C adapter
i2c-2 i2c STM32F7 I2C(0x5c002000) I2C adapter
i2c-0 i2c STM32F7 I2C(0x40012000) I2C adapter
# i2cdetect -F 0
Functionalities implemented by /dev/i2c-0:
I2C yes
SMBus Quick Command yes
SMBus Send Byte yes
SMBus Receive Byte yes
SMBus Write Byte yes
SMBus Read Byte yes
SMBus Write Word yes
SMBus Read Word yes
SMBus Process Call yes
SMBus Block Write yes
SMBus Block Read yes
SMBus Block Process Call yes
SMBus PEC yes
I2C Block Write yes
I2C Block Read yes
// --表示沒有該地址對應的設備, UU 表示有該設備并且它已經有驅動程序,
// 數值表示有該設備但是沒有對應的設備驅動
# i2cdetect -y -a 0 0 1 2 3 4 5 6 7 8 9 a b c d e f
00: 00 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- UU -- -- -- 1e --
20: -- -- UU -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

(3)i2cget:I2C 讀

? 使用說明:

# i2cget
Usage: i2cget [-f] [-y] [-a] I2CBUS CHIP-ADDRESS [DATA-ADDRESS [MODE]]I2CBUS is an integer or an I2C bus nameADDRESS is an integer (0x03 - 0x77, or 0x00 - 0x7f if -a is given)MODE is one of:b (read byte data, default)w (read word data)c (write byte/read byte)
Append p for SMBus PEC

? 使用示例:

// 讀一個字節: I2CBUS 為 0、1、2 等整數, 表示 I2C Bus; CHIP-ADDRESS 表示設備地址
i2cget -f -y I2CBUS CHIP-ADDRESS
// 讀某個地址上的一個字節: 
// I2CBUS 為 0、1、2 等整數, 表示 I2C Bus
// CHIP-ADDRESS 表示設備地址
// DATA-ADDRESS: 芯片上寄存器地址
// MODE:有 2 個取值, b-使用`SMBus Read Byte`先發出 DATA-ADDRESS, 再讀一個字節, 中間無
P 信號
// c-先 write byte, 在 read byte,中間有 P 信號
i2cget -f -y I2CBUS CHIP-ADDRESS DATA-ADDRESS MODE
// 讀某個地址上的 2 個字節: 
// I2CBUS 為 0、1、2 等整數, 表示 I2C Bus
// CHIP-ADDRESS 表示設備地址
// DATA-ADDRESS: 芯片上寄存器地址
// MODE:w-表示先發出 DATA-ADDRESS,再讀 2 個字節
i2cget -f -y I2CBUS CHIP-ADDRESS DATA-ADDRESS MODE

(4)i2cset:I2C 寫

? 使用說明:

# i2cset
Usage: i2cset [-f] [-y] [-m MASK] [-r] [-a] I2CBUS CHIP-ADDRESS DATA-ADDRESS [VALUE]
... [MODE]I2CBUS is an integer or an I2C bus nameADDRESS is an integer (0x03 - 0x77, or 0x00 - 0x7f if -a is given)MODE is one of:c (byte, no value)b (byte data, default)w (word data)i (I2C block data)s (SMBus block data)
Append p for SMBus PEC

? 使用示例:

// 寫一個字節: I2CBUS 為 0、1、2 等整數, 表示 I2C Bus; CHIP-ADDRESS 表示設備地址// DATA-ADDRESS 就是要寫的數據i2cset -f -y I2CBUS CHIP-ADDRESS DATA-ADDRESS// 給 address 寫 1 個字節(address, value):// I2CBUS 為 0、1、2 等整數, 表示 I2C Bus; CHIP-ADDRESS 表示設備地址// DATA-ADDRESS: 8 位芯片寄存器地址; // VALUE: 8 位數值// MODE: 可以省略,也可以寫為 bi2cset -f -y I2CBUS CHIP-ADDRESS DATA-ADDRESS VALUE [b]// 給 address 寫 2 個字節(address, value):// I2CBUS 為 0、1、2 等整數, 表示 I2C Bus; CHIP-ADDRESS 表示設備地址// DATA-ADDRESS: 8 位芯片寄存器地址; // VALUE: 16 位數值// MODE: wi2cset -f -y I2CBUS CHIP-ADDRESS DATA-ADDRESS VALUE w// SMBus Block Write:給 address 寫 N 個字節的數據// 發送的數據有:address, N, value1, value2, ..., valueN// 跟`I2C Block Write`相比, 需要發送長度 N// I2CBUS 為 0、1、2 等整數, 表示 I2C Bus; CHIP-ADDRESS 表示設備地址// DATA-ADDRESS: 8 位芯片寄存器地址; // VALUE1~N: N 個 8 位數值// MODE: si2cset -f -y I2CBUS CHIP-ADDRESS DATA-ADDRESS VALUE1 ... VALUEN s// I2C Block Write:給 address 寫 N 個字節的數據// 發送的數據有:address, value1, value2, ..., valueN// 跟`SMBus Block Write`相比, 不需要發送長度 N// I2CBUS 為 0、1、2 等整數, 表示 I2C Bus; CHIP-ADDRESS 表示設備地址// DATA-ADDRESS: 8 位芯片寄存器地址; // VALUE1~N: N 個 8 位數值// MODE: ii2cset -f -y I2CBUS CHIP-ADDRESS DATA-ADDRESS VALUE1 ... VALUEN i

(5)i2ctransfer:I2C 傳輸(不是基于 SMBus)

? 使用說明:

# i2ctransfer
Usage: i2ctransfer [-f] [-y] [-v] [-V] [-a] I2CBUS DESC [DATA] [DESC [DATA]]...I2CBUS is an integer or an I2C bus nameDESC describes the transfer in the form: {r|w}LENGTH[@address]1) read/write-flag 2) LENGTH (range 0-65535) 3) I2C address (use last one if omit
ted)DATA are LENGTH bytes for a write message. They can be shortened by a suffix:= (keep value constant until LENGTH)+ (increase value by 1 until LENGTH)- (decrease value by 1 until LENGTH)p (use pseudo random generator until LENGTH with value as seed)
Example (bus 0, read 8 byte at offset 0x64 from EEPROM at 0x50):# i2ctransfer 0 w1@0x50 0x64 r8
Example (same EEPROM, at offset 0x42 write 0xff 0xfe ... 0xf0):# i2ctransfer 0 w17@0x50 0x42 0xff

? 使用舉例:

// Example (bus 0, read 8 byte at offset 0x64 from EEPROM at 0x50):
# i2ctransfer -f -y 0 w1@0x50 0x64 r8
// Example (bus 0, write 3 byte at offset 0x64 from EEPROM at 0x50):
# i2ctransfer -f -y 0 w9@0x50 0x64 val1 val2 val3
// Example 
// first: (bus 0, write 3 byte at offset 0x64 from EEPROM at 0x50)
// and then: (bus 0, read 3 byte at offset 0x64 from EEPROM at 0x50)
# i2ctransfer -f -y 0 w9@0x50 0x64 val1 val2 val3 r3@0x50 
# i2ctransfer -f -y 0 w9@0x50 0x64 val1 val2 val3 r3 //如果設備地址不變,后面的設備地址可
省略

2.使用 I2C-Tools 操作傳感器 AP3216C

開發板上有光感芯片 AP3216C:

AP3216C 是紅外、光強、距離三合一的傳感器,以讀出光強、距離值為例,步驟如下:

???????? 復位:往寄存器 0 寫入 0x4

? ? ? ? ?使能:往寄存器 0 寫入 0x3

? ? ? ? ?讀光強:讀寄存器 0xC、0xD 得到 2 字節的光強

? ? ? ? ?讀距離:讀寄存器 0xE、0xF 得到 2 字節的距離值 AP3216C 的設備地址是 0x1E,假設節在 I2C BUS0 上,操作命令如下:?

(1)使用 SMBus 協議?

i2cset -f -y 0 0x1e 0 0x4
i2cset -f -y 0 0x1e 0 0x3
i2cget -f -y 0 0x1e 0xc w
i2cget -f -y 0 0x1e 0xe w

(2)使用 I2C 協議

i2ctransfer -f -y 0 w2@0x1e 0 0x4
i2ctransfer -f -y 0 w2@0x1e 0 0x3
i2ctransfer -f -y 0 w1@0x1e 0xc r2
i2ctransfer -f -y 0 w1@0x1e 0xe r2

(3) I2C-Tools 訪問 I2C 設備的 2 種方式

????????I2C-Tools 可以通過 SMBus 來訪問 I2C 設備,也可以使用一般的 I2C 協議 來訪問 I2C 設備

????????使用一句話概括 I2C 傳輸:APP 通過 I2C Controller 與 I2C Device 傳輸數據。

????????在 APP 里,有這幾個問題:

怎么指定 I2C 控制器?

???????? i2c-dev.c 為每個 I2C 控制器(I2C Bus、I2C Adapter)都生成一個設備節 點:/dev/i2c-0、/dev/i2c-1 等等;

???????? open 某個/dev/i2c-X 節點,就是去訪問該 I2C 控制器下的設備;

怎么指定 I2C 設備?

????????通過 ioctl 指定 I2C 設備的地址

????????ioctl(file, I2C_SLAVE, address)

???????????????? 如果該設備已經有了對應的設備驅動程序,則返回失敗。

????????ioctl(file, I2C_SLAVE_FORCE, address)

???????????????? 如果該設備已經有了對應的設備驅動程序但是還是想通過 i2c-dev 驅 動來訪問它,則使用這個 ioctl 來指定 I2C 設備地址。

怎么傳輸數據?

????????兩種方式:

???????????????? 一般的 I2C 方式:ioctl(file, I2C_RDWR, &rdwr)

???????????????? SMBus 方式:ioctl(file, I2C_SMBUS, &args)

3.源碼流程分析?

(1)使用 I2C 方式

示例代碼:i2ctransfer.c

(2)使用 SMBus 方式

示例代碼:i2cget.c、i2cset.c

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/167977.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/167977.shtml
英文地址,請注明出處:http://en.pswp.cn/news/167977.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

虛擬機系列:Oracle VM VirtualBox虛擬機的使用教程和使用體驗情況反饋

Oracle VM VirtualBox虛擬機的使用教程和使用體驗情況反饋 一. 簡述:二. 下載三. 安裝解壓后選擇需要的版本點擊安裝1:第一步,點擊安裝,點擊下一步2. 這里直接點擊下一步,3. 網絡警告選擇:是4. 準備好以后,點擊安裝5. 點擊完成即可四. 打開五. 創建虛擬機1. 輸入虛擬機名…

H5(uniapp)中使用echarts

1,安裝echarts npm install echarts 2&#xff0c;具體頁面 <template><view class"container notice-list"><view><view class"aa" id"main" style"width: 500px; height: 400px;"></view></v…

MySQL 中的 JSON_CONTAINS 函數詳解

在處理 MySQL 中的 JSON 數據時&#xff0c;我們經常需要檢查一個 JSON 文檔是否包含特定的值。這時&#xff0c;JSON_CONTAINS 函數就顯得非常有用。 JSON_CONTAINS函數介紹 JSON_CONTAINS 是 MySQL 提供的一個 JSON 函數&#xff0c;用于測試一個 JSON 文檔是否包含特定的值…

SQLite 和 SQLiteDatabase 的使用

實驗七&#xff1a;SQLite 和 SQLiteDatabase 的使用 7.1 實驗目的 本次實驗的目的是讓大家熟悉 Android 中對數據庫進行操作的相關的接口、類等。SQLiteDatabase 這個是在 android 中數據庫操作使用最頻繁的一個類。通過它可以實現數據庫的創建或打開、創建表、插入數據、刪…

22、什么是中間件和權限攔截中間件實操

新建中間件 middleware\auth.js // 定義權限判斷中間件&#xff0c;中間件的第一個參數是context export default ({store, redirect}) > {console.log("中間件被調用")// if (!store || !store.state.userinfo) {// redirect("/")// } }頁面使用…

CF -- Educational Codeforces Round 158 (Rated for Div. 2) -- D 補題記錄

Yet Another Monster Fight Problem - D - Codeforces 題目大意&#xff1a; 現在給你一堆怪物&#xff0c;你擁有法術&#xff08;一個法術可以連續攻擊這n個所有怪物&#xff09;&#xff0c;你可以選擇任意一個怪物作為法術的第一個攻擊目標&#xff08;傷害為x&#xff…

【MySQL】索引與事務

&#x1f451;專欄內容&#xff1a;MySQL?個人主頁&#xff1a;子夜的星的主頁&#x1f495;座右銘&#xff1a;前路未遠&#xff0c;步履不停 目錄 一、索引1、使用場景2、使用索引創建索引查看索引刪除索引 3、底層數據結構&#xff08;非常重要&#xff09; 二、事務1、概念…

Android設計模式--享元模式

水不激不躍&#xff0c;人不激不奮 一&#xff0c;定義 使用共享對象可有效地支持大量的細粒度的對象 享元模式是對象池的一種實現&#xff0c;用來盡可能減少內存使用量&#xff0c;它適合用于可能存在大量重復對象的場景&#xff0c;來緩存可共享的對象&#xff0c;達到對象…

騰訊云CVM標準型SA5云服務器AMD EPYC Bergamo處理器

騰訊云服務器標準型SA5實例是最新一代的標準型實例&#xff0c;CPU采用AMD EPYC? Bergamo全新處理器&#xff0c;采用最新DDR5內存&#xff0c;默認網絡優化&#xff0c;最高內網收發能力達4500萬pps。騰訊云百科txybk.com分享騰訊云標準型SA5云服務器CPU、內存、網絡、性能、…

Qt項目打包發布超詳細教程

https://blog.csdn.net/qq_45491628/article/details/129091320

用蘋果簽名免費獲取Xcode

使用蘋果企業簽名免費獲取Xcode&#xff1a; 打開Xcode。連接iOS設備到Mac。選擇Window→Devices and Simulators。選擇該設備。將IPA文件拖到“Installed Apps”的列表框中即可安裝。使用Cydia Impactor&#xff08;可以在網上找到相關下載鏈接&#xff09;&#xff1a; 打開…

HTML網站穩定性狀態監控平臺源碼

這是一款網站穩定性狀態監控平臺源碼&#xff0c;它基于UptimeRobot接口進行開發。當您的網站遇到故障時&#xff0c;該平臺能夠通過郵件或短信通知您。下面是對安裝過程的詳細說明&#xff1a; 安裝步驟 將源碼上傳至您的主機或服務器&#xff0c;并進行解壓操作。 在Uptim…

自動化測試中幾種常見驗證碼的處理方式及如何實現?

UI自動化測試時&#xff0c;需要對驗證碼進行識別處理&#xff0c;有很多方式&#xff0c;每種方式都有自己的特點&#xff0c;以下是一些常用處理方法&#xff0c;僅供參考。 1 去掉驗證碼 從自動化的本質上來講&#xff0c;主要是提升測試效率等&#xff0c;但是為了去研究驗…

【點云surface】 修剪B樣條曲線擬合

1 介紹 Fitting trimmed B-splines&#xff08;修剪B樣條曲線擬合&#xff09;是一種用于對給定的點云數據進行曲線擬合的算法。該算法使用B樣條曲線模型來逼近給定的點云數據&#xff0c;并通過對模型進行修剪來提高擬合的精度和準確性。 B樣條曲線是一種常用的曲線表示方法…

【element優化經驗】el-dialog修改title樣式

目錄 前言 解決之路 1.把默認的這個圖標隱藏&#xff0c;官方的api有這個屬性&#xff1a;showClose值設置false. 2.title插槽定制&#xff1a;左邊定制標題&#xff0c;右邊定制按鈕區域。 3.背景顏色修改&#xff1a;默認title是有padding的需要把它重寫調&#xff0c;然…

基于卷積神經網絡CNN開發構建HAR人類行為識別Human Activity Recognition【完整代碼實踐】

行為識別相關的開發實踐在我們之前的博文中也有過相關的實踐了,感興趣的話可以自行移步閱讀即可:《python實現基于TNDADATASET的人體行為識別》 《UCI行為識別——Activity recognition with healthy older people using a batteryless wearable sensor Data Set》《人體行為…

基于 STM32Cube.AI 的嵌入式人臉識別算法實現

本文介紹了如何使用 STM32Cube.AI 工具開發嵌入式人臉識別算法。首先&#xff0c;我們將簡要介紹 STM32Cube.AI 工具和 STM32F系列單片機的特點。接下來&#xff0c;我們將詳細討論如何使用 STM32Cube.AI 工具鏈和相關庫來進行人臉識別算法的開發和優化。最后&#xff0c;我們提…

Netty實現websocket且實現url傳參的兩種方式(源碼分析)

1、先構建基本的netty框架 再下面的代碼中我構建了一個最基本的netty實現websocket的框架&#xff0c;其他個性化部分再自行添加。 Slf4j public class TeacherServer {public void teacherStart(int port) throws InterruptedException {NioEventLoopGroup boss new NioEve…

Day40力扣打卡

打卡記錄 包子湊數&#xff08;裴蜀定理 DP&#xff09; 根據裴蜀定理&#xff0c;存在 c gcd(a, b) 使不定方程ax by c滿足條件&#xff0c;如果gcd(a, b) 1即a與b互素的情況下&#xff0c;就會 ax by 1&#xff0c;由于為1可以構造后面的無窮數字&#xff0c;故得到結…

Centos7 離線安裝 CDH7.1.7

1. 安裝CDH的準備工作&#xff08;所有節點都要執行&#xff09; 1.1 準備環境 角色 IP k8s-master 192.168.181.129 k8s-node1 192.168.181.130 k8s-node2 192.168.181.131 1.2 安裝JDK # https://www.oracle.com/java/technologies/downloads/#java11 wget rpm -ivh…