嵌入式Linux下I2C接口調試

2022-01-01 嵌入式Linux中文站


嵌入式linux QQ交流群:175159209,歡迎愛好者加入交流技術問題!

1). 簡介

I2C是嵌入式設備最為常用的接口之一,常用於如下面這些應用場景,因此本文就基於嵌入式Linux演示在User Space進行I2C設備調試。

- Digital to Analog converter

- EEPROM

- Real Time Clock

- Touch screen LCD

- Audio codec

 

本文所演示的平臺來自於Toradex Apalis iMX6Q ARM嵌入式平臺,這是一個基於NXP iMX6Q ARM處理器,支持四核心Cortex-A9。

 

2. 準備

a).Apalis iMX6Q ARM核心版配合Apalis Ixora載板,連接調試串口UART1到開發主機方便調試,同時配置好Ubuntu開發主機開發環境,具體操作方法可以參考這裡。

b).Apalis iMX6Q系統使用Toradex Linux Release V2.6.1,下載和更新方法請參考這裡。

 

3). I2C總線user space操作命令測試

a). Apalis iMX6Q核心版默認定義提供了三個I2C總線可供外部使用(i2c-2為核心板內部電源管理使用),如下所示,其中i2c-1為通用I2C接口;i2c-0為DDC接口,用於連接HDMI DDC/EDID接口,不能用做通用I2C接口;而i2c-3通常用於連接camera接口使用,不過也可以用做通用I2C接口。

 

 

b). 本文演示示例則通過讀寫Apalis Ixora載板連接在i2c-1總線上面的2Kb EEPROM

 

 

c). User Space下通過I2C tools直接操作i2c-1總線進行訪問EEPROM

./ 查看Apalis iMX6Q的所有I2C總線

---

root@apalis-imx6:~# ls -l /dev/i2c-*

crw-- 1 root root 89, 0 4??月  26 06:52 /dev/i2c-0

crw-- 1 root root 89, 1 4??月  26 06:52 /dev/i2c-1

crw-- 1 root root 89, 2 4??月  26 06:52 /dev/i2c-2

crw-- 1 root root 89, 3 4??月  26 06:52 /dev/i2c-3

--

./ 查看i2c-1總線上面的設備

可以看到在0x50和0x68兩個地址上面掛有設備,0x68顯示為UU意味著這個設備被kernel driver佔用,通常不能從user space探查,這裡結合Apalis iMX6Q手冊可以得知掛載的為外部RTC設備;而0x50則為我們所需要測試的EEPROM設備

--

 

--

 

./ dump 0x50 EEPROM全部寄存器地址0-0xff,初始狀態下每個寄存器地址保存的數值都是0xff

--

 

--

 

./使用i2cset和i2cget來寫和讀EEPROM特定寄存器地址

--

// 向EEPROM 0x00寄存器地址寫入0x01

root@apalis-imx6:/home# i2cset 1 0x50 0x00 0x01 b                              

WARNING! This program can confuse your I2C bus, cause data loss and worse!     

DANGEROUS! Writing to a serial EEPROM on a memory DIMM                         

may render your memory USELESS and make your system UNBOOTABLE!                

I will write to device file /dev/i2c-1, chip address 0x50, data address        

0x00, data 0x01, mode byte.                                                    

Continue? [y/N] y                                                              

// 讀取EEPROM 0x00寄存器地址

root@apalis-imx6:/home# i2cget 1 0x50 0x00 b                                   

……                                                            

0x01

--

 

d). User Space下通過I2C tools讀取i2c-1總線進行訪問RTC晶片

./Apalis Ixora載板外部RTC晶片使用ST m41t00 晶片,其內部集成8 byte寄存器用於存儲時間相關信息,格式如下:

--

1st byte: seconds register

2nd byte: minutes register

3rd byte: century/hours register

4th byte: day register

5th byte: date register

6th byte: month register

7th byte: years register

8th byte: control register

--

 

./ Linux下查看當前時間

--

root@apalis-imx6:~# date                                                       

2017??年 04??月 26??日 ??星??期??三 08:57:23 UTC

--

 

./ Linux下手動修改當前時間,默認當設備聯網時候自動聯網校準時間是打開的

--

// 關閉網絡時間同步

timedatectl set-ntp 0

 

//手動設置時間並重啟

timedatectl set-time 22:50:11

reboot

--

 

./ 利用i2cget –f命令查看RTC寄存器數值示例

--

// 查看當前系統時間設置

root@apalis-imx6:~# date

2017??年 04??月 26??日 ??星??期??三 09:02:17 UTC

// 讀取時數值

root@apalis-imx6:~# i2cget -f 1 0x68 0x02 b

……

0x09

// 讀取分數值

root@apalis-imx6:~# i2cget -f 1 0x68 0x01 b

……

0x02

// 讀取秒數值

root@apalis-imx6:~# i2cget -f 1 0x68 0x00 b

……

0x41

--

 

4). I2C總線C程序操作示例

使用C程序打開I2C設備並進行讀寫,這裡編寫例程以訪問i2c-1總線上的EEPROM設備進行讀寫操作。

a). 首先以C程序訪問i2C設備,需要include 「i2c-dev.h」這個頭文件,請注意在Linux中有兩個同樣名字的頭文件,系統自帶的通常是來自Linux kernel的i2c總線驅動對應的,這個並不是我們所需要的,而我們所需的是i2c-tools裡面提供的這個「i2c-dev.h」頭文件,這個文件請見這裡:

 

b). 示例C程序代碼請參考這裡,說明如下:

./ 首先程序含有輸入變量,i2c總線號碼,設備地址以及變量X,用於設置需要讀寫的寄存器地址:0xX0 – 0xXf

./ 使用open函數打開i2c總線

./ 使用ioctl函數設置設備地址

./ 利用 SMBus 命令或者write函數向寄存器地址 0xX0 – 0xXf寫入數據,數值就是對應的寄存器地址

./ 利用SMBus命令或者read函數讀取寄存器地址 0xX0 – 0xXf數據並列印出來

./ 關閉i2c總線設備並退出程序

 

c). 程序運行結果

--

// 寫入並讀出寄存器0x00 – 0x0f

root@apalis-imx6:~# ./i2ctest 1 80 0                                           

0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f

0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f

// 寫入並讀出寄存器0x10 – 0x1f

root@apalis-imx6:~# ./i2ctest 1 80 1                                           

0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f

0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f

--

這時dump EEPROM所有寄存器結果如下

--

 

--

相關焦點

  • Linux 系統內核的調試
    這樣,就與目標機上的kgdb調試接口建立了聯繫。一旦建立聯接之後,對Linux內的調試工作與對普通的運用程序的調試就沒有什麼區別了。任何時候都可以通過鍵入ctrl+c打斷目標機的執行,進行具體的調試工作。  在kgdb 2.0之前的版本中,編譯內核後在arch/i386/kernel目錄下還會生成可執行文件gdbstart。
  • 在VIM中實現對嵌入式軟體的調試
    其強大的gdb調試工具可以方便地對嵌入式平臺上的程序進行跟蹤調試;而Linux下強悍的VIM編輯器,不僅可以方便地調用make文件對代碼進行編譯,而且通過腳本的配置還可輕鬆地成為高效的代碼編輯環境。流傳著這樣一種說法,「世界上的程式設計師分三種,一種使用Emacs,一種使用VIM,剩餘的是其他。」
  • Linux驅動之I2C總線
    2177i2c_register_board_info(0, i2c-devs0, ARRAY_SIZE(i2c_devs0));2178i2c_register_board_info(1, i2c-devs1, ARRAY_SIZE(i2c_devs1));2179i2c_register_board_info(2, i2c-devs2, ARRAY_SIZE
  • TMS320VC5410A I/O口的多種擴展與I2C接口模擬
    ti公司的dsp晶片tms320vc5410a(簡稱5410a)是性能卓越的低功耗定點16位dsp,在嵌入式系統中有著廣泛應用,5410a沒有專門的通用i/o引腳,僅有xf引腳可以作為單向輸出,/bio引腳作為單向輸入
  • 嵌入式系統課程的教與學
    第四章  嵌入式系統硬體平臺與接口設計                                   (8學時)本章重點和難點:嵌入式硬體接口設計第一節  嵌入式硬體平臺體系結構第二節  存儲系統設計第三節  串行通信接口設計第四節  時鐘系統設計第五節  GPIO接口設計第六節
  • 全面掌握Linux驅動框架——字符設備驅動、I2C驅動、總線設備驅動、NAND FLASH驅動
    任何建立在平臺總線設備驅動模型基礎上的驅動代碼(如平臺驅動,PCI驅動,USB驅動,I2C驅動,SPI驅動等),它們的設備結構體(如platform_device, pci_dev,usb_device,i2c_device
  • 嵌入式Linux NFS 根文件系統的構建及研究
    摘要:在嵌入式Linux系統開發過程中,根文件系統是構建嵌入式Linux系統的重要組成部分。為了方便和簡化嵌入式Linux開發過程中的調試過程,主要研究了如何使用Busybox構建出基本的嵌入式Linux根文件系統,包括Busybox的配置、編譯和安裝。
  • 【紫光同創國產FPGA教程】【第七章】I2C接口EEPROM實驗
    實驗簡介本實驗通過使用開源軟體opencores上的I2C master控制器去控制I2C接口的EEPROM讀寫,練習如何有效的使用開原始碼提升開發效率。2.i2c_addr_2bytein寄存器地址是8位還是16位,1:16位,0:8位i2c_read_reqinI2C寄存器讀請求i2c_read_req_ackoutI2C寄存器讀請求應答i2c_write_reqinI2C寄存器寫請求i2c_write_req_ackoutI2C寄存器寫請求應答i2c_slave_dev_addrinI2C設備地址,8bit,最低位忽略,有效數據位是高7位。
  • 工程師嵌入式Linux自學筆記及體會
    在設計嵌入式應用的時候,可以不按照這種層次,應用程式越過 C 庫直接和內核會話,或者把應用和內核捆綁在一起,甚至可以把應用寫為內核的一個線程,在內核中運行,雖然這樣在移植上帶來了困難,但考慮嵌入式系統對尺寸要求小的特點,是完全可行的。不過我們使用三層軟體結構的模式來學習嵌入式 linux將會是我們認識更清晰,簡單可行並使應用具有彈性。
  • ARM嵌入式的VGA接口製作
    大多數嵌入式產品的顯示終端都選擇LCD,但在某些需要大屏幕顯示的應用中,工業級LCD的價格比較昂貴,且現有的大屏幕顯示器(包括CRT顯示器和LCD顯示器)一般都採用統一的15針VGA
  • 使用TI-AM1808構建嵌入式導航系統
    對於一個嵌入式系統,系統的升級功能十分的重要。升級的數據來源可以是SD卡或者USB大容量存儲器。為了滿足多樣化的用戶需求,我們同時需要這兩種接口。AM1808的SD控制器可以訪問SD卡上的數據,但是不支持高速的SD卡,但標準速度的SD卡已經可以很好地滿足系統的需求。
  • Linux嵌入式驅動開發——ioctl接口
    什麼是unlocked_ioctl接口?unlocked_ioctl就是ioctl接口,但是功能和對應的系統調用均沒有發生變化unlocked_ioctl和read/write函數有什麼相同和不同之前我們使用read/write函數完成寫數據或者讀數據的操作,ioctl函數也可以往內核中寫入命令。
  • 基於嵌入式Linux的MapInfo格式地圖顯示
    MiniGUI的移植對嵌入式平臺的開發首先都要建立交叉編譯環境和最終的運行環境。針對筆者所採用的ARM-Linux平臺,交叉編譯是為了在採用linux的宿主PC機上生成最終在ARM處理器上linux作業系統下可運行的代碼。而建立運行環境是將一些必要的資源文件安裝到程序運行的 ARM-Linux平臺上。
  • 基於USB2I2C接口的CMOS圖像傳感器在線調試系統
    2 調試系統的組成和工作原理為了調節CMOS圖像傳感器的圖像,每個sensor的設計廠家都有自己的一套調試系統,該系統的硬體系統一般是由CMOS圖像傳感器成像板、FPGA開發板和USB接口轉換版組成,在配上複雜龐大的軟體系統,能夠對CMOS圖像傳感器進行細緻的、全面的調節。
  • Cortex-M3平臺上lwIP+AJAX的Web嵌入式應用
    摘要:本文基於lwIP乙太網協議棧將AJAX動態網頁設計技術應用於嵌入式Cortex-M3平臺,實現Web嵌入式應用嵌入式產品一般服務於工業現場,通過RS232、RS485、或是CAN等通信接口與外界互聯通信。如今伴隨著Internet技術的成熟,帶寬的日益提高,公共場所無線網絡覆蓋,智慧型手機日益普及,網絡化、信息化的要求越來越受到關注,Internet網絡互聯成為必然的趨勢[1]。
  • 嵌入式Linux+Android學習路線圖
    針對這些校園教材的不足,並結合實際開發過程中要用到的知識點,我們推出了《學前班_怎麼看原理圖》系列視頻:學前班第1課第1節_怎麼看原理圖之GPIO和門電路.wmv學前班第1課第2.1節_怎麼看原理圖之協議類接口之UART.wmv學前班第1課第2.2節_怎麼看原理圖之協議類接口之I2C.wmv學前班第1課第2.3節_怎麼看原理圖之協議類接口之
  • 理解i2c設備註冊
    總線應用非常廣泛,本文基於內核源碼(linux kernel 4.3 source code),深入探討i2c設備的註冊流程(i2c總線的詳細背景和基礎知識,請參考i2c總線規範的相關文檔)。i2c體系結構分三部分:本文從i2c adapter的註冊入手,慢慢勾勒出目前內核中的融入設備驅動模型方式的i2c設備註冊流程。
  • 用Visual Studio調試Linux程序
    當然如果你說VS2015及以上版本自帶的linux調試插件,那就算了。這些自帶的插件調試一個有簡單的main函數程序還湊合,稍微複雜點的程序,根本無法編譯調試。而本文介紹的主角是VS的另外一款插件Visual GDB,讓我們歡迎主角登場,下面是正文。
  • i2c總線協議
    簡介camera sensor重要的通信接口是i2c。
  • JTAG調試接口電路圖設計
    (PB3、PB4),調試中發現,這兩個接口對應的兩行均不能正常掃描到按鍵值,查看數據手冊才知道這是系統接口,需要進行設置才可以作為普通IO口使用。 STM32定時器T2純軟體仿真時間準確,JTAG在線調試查看時間不準 通過查看Sec的值和上次中斷的差值計算的,雖然這個值是不準的 ,但實際上時間是準的,原因如下:stm32在調試模式下雖然進斷點之後程序停止了,但定時器的時鐘還在走,計數器還在計數,若要在產生斷點時計數器停止計數可以在初始化時調用函數DBGMCU_Config