1. 程式人生 > >樹莓派學習筆記——Linux I2C驅動說明

樹莓派學習筆記——Linux I2C驅動說明

1.前言

通常情況下,I2C裝置由核心驅動控制,但是某些情況下I2C裝置也可由使用者空間控制。如果在使用者空間控制I2C裝置,需要訪問/dev目錄中所提供的介面,在使用I2C裝置之前必須要載入i2c-dev裝置。每一個已經註冊的IC裝置都有一個編號,該編號從0開始計算。可以檢視/sys/class/i2c-dev目錄以獲得I2C介面卡的資訊,或者使用i2cdetect工具檢視I2C介面卡。i2cdetect是一個簡單易用的I2C工具包。

2.C語言的例子

讓我們從一個簡單的C語言的例子開始Linux I2C裝置的使用。在開始之前需要包括 linux/i2c-dev.h。然後需要決定訪問的I2C介面卡,可以檢視/sys/class/i2c-dev,或者使用i2cdetect - l命令。接著便可開啟檔案,請看示例程式碼
  int file;
  int adapter_nr = 1; /* I2C介面卡編號 */
  char filename[20];
 
  snprintf(filename, 19, "/dev/i2c-%d", adapter_nr);
  file = open(filename, O_RDWR);
  if (file < 0) {
    /* 開啟失敗 */
    exit(1);
  }
開啟裝置時,必須確定I2C從機地址。
  int addr = 0x40; /* I2C 從機地址 */
  if (ioctl(file, I2C_SLAVE, addr) < 0) {
    /* 開啟失敗 */
    exit(1);
  }

完成了基本設定,下面便可以使用SMBUS指令或純I2C函式與晶片通訊。SMBUS函式形式是一個很不錯的選擇。 
 __u8 register = 0x10; /* I2C從機 暫存器地址 */
  __s32 res;
  char buf[10];
  /* 使用SMBus函式 */
  res = i2c_smbus_read_word_data(file, register);
  if (res < 0) {
    /* 錯誤 */
  } else {
    /* 成功讀取到一個字 */
  }
  /* 使用I2C Write, 等價於i2c_smbus_write_word_data(file, register, 0x6543) */
  buf[0] = register;
  buf[1] = 0x43;
  buf[2] = 0x65;
  if (write(file, buf, 3) ! =3) {
    /* 錯誤*/
  }
  /* 使用I2C Read, 等價於 i2c_smbus_read_byte(file) */
  if (read(file, buf, 1) != 1) {
    /* 錯誤 */
  } else {
    /* buf[0]為讀取到的位元組 */
  }

3.SMBUS詳細說明

核心說明
標記符長度說明
S1 bitI2C啟動
P1 bitI2C停止
Rd/Wr1 bit控制字中的讀寫標誌位,讀操作為1,寫操作為0
A, NA1 bit應答標誌
Addr7 bits7位I2C地址
Data8 bit位元組資料
Comm8 bits命令位元組,可理解為I2C裝置暫存器地址
[..]N char I2C裝置返回的資料
【1】__s32 i2c_smbus_write_quick(int file, __u8 value);傳送一個寫控制字,可用於測試I2C裝置是否存在。S Addr Rd [A] [Data] NA P【2】__s32 i2c_smbus_read_byte(int file);
傳送一個讀控制字,並從I2C裝置中讀取一個位元組。S Addr Rd [A] [Data] NA P【3】__s32 i2c_smbus_write_byte(int file, __u8 value);傳送一個寫控制字,並向I2C裝置中寫入一個位元組。S Addr Wr [A] Data [A] P【4】__s32 i2c_smbus_read_byte_data(int file, __u8 command);向I2C裝置傳送一個寫控制字+控制指令(暫存器地址),再發送一個讀控制字,此時I2C從裝置內部的讀寫指標轉移到指定的位置,並返回一個位元組,最後返回一個無應答NA。S Addr Wr [A] Comm [A] S Addr Rd [A] [Data] NA P【5】__s32 i2c_smbus_write_byte_data(int file, __u8 command, __u8 value);向I2C裝置傳送一個寫控制字+控制指令(暫存器地址),緊接著傳送指令內容(暫存器內容,單位元組)。S Addr Wr [A] Comm [A] Data [A] P【6】__s32 i2c_smbus_read_i2c_block_data(int file, __u8 command, __u8 *values);向I2C裝置傳送一個寫控制字+控制指令(暫存器地址),再發送一個讀控制字,此時I2C從裝置內部的讀寫指標轉移到指定的位置,並連續返回多個位元組,I2C主機讀取到一定數量位元組內容之後傳送無應答NA。S Addr Wr [A] Comm [A] S Addr Rd [A] [Data] A [Data] A ... A [Data] NA P【7】__s32 i2c_smbus_write_i2c_block_data(int file, __u8 command, __u8 length, __u8 *values);向I2C裝置傳送一個寫控制字+控制指令(暫存器地址),接著傳送傳送指令內容(暫存器內容,多位元組)S Addr Wr [A] Comm [A] Data [A] Data [A] ... [A] Data [A] P【注意點1】這些函式如果返回-1代表操作失敗。在一些具有寫功能的函式中,返回0代表操作成功,在具有讀功能的函式中,返回讀取的位元組數(除i2c_smbus_read_block_data)。讀塊(block)操作時不應超過32個位元組。【注意點2】樹莓派不支援以下函式。  __s32 i2c_smbus_read_block_data(int file, __u8 command, __u8 *values);  __s32 i2c_smbus_write_block_data(int file, __u8 command, __u8 length, __u8 *values);

4.參考資料

相關推薦

樹莓學習筆記——Linux I2C驅動說明

1.前言通常情況下,I2C裝置由核心驅動控制,但是某些情況下I2C裝置也可由使用者空間控制。如果在使用者空間控制I2C裝置,需要訪問/dev目錄中所提供的介面,在使用I2C裝置之前必須要載入i2c-dev裝置。每一個已經註冊的IC裝置都有一個編號,該編號從0開始計算。可以檢視

樹莓學習筆記——I2C Tools 學習筆記

說明2:此處I2C匯流排共掛載兩個裝置——PCF8574和AT24C04,從機地址0x20為PCF8574,從機地址0x50和0x51為AT24C04,請注意AT24C04具備兩個I2C地址,相關內容請產看參考資料6.4。

樹莓學習筆記——I2C使用 PCF8574 Python SMBUS

    PCF8574的採用7位I2C地址,7位I2C地址中的低3位從高到低分別為A2 A1和A0,該3位為地址選擇位,若地址選擇全部接GND,那麼PCF8574的I2C從機地址為0x20。圖1為PCF8574的基本資訊,左側為晶片內部結構示意圖,其中A2 A1和A0決定從機地址而從機地址直接影響I2C匯流排

樹莓學習筆記—— 源碼方式安裝opencv

鏈接 spa lin fonts 耗時 sdn 圖片 ostream unix 0.前言? ? 本文介紹怎樣在樹莓派中通過編譯源碼的方式安裝opencv,並通過一個簡

樹莓學習筆記——crontab定時執行指令碼

crontab定時執行指令碼 如果在玩樹莓派的過程中,我們需要定時或者定期的執行一些程式或指令碼,這裡有個好方法,就是Linux下的 crontab。 通常會用到的就是兩個命令: 檢視已有的定時任務 [email protected]:~ $ cront

樹莓學習筆記(7):利用bypy實現樹莓NAS同步百度雲

樹莓派製作NAS過程詳見http://www.cnblogs.com/xiaowuyi/p/4051238.html。 Bypy是一個百度雲/百度網盤的Python客戶端,主要的目的就是在Linux環境下(命令列)同步百度雲盤空間。Bypy要求python2.7

樹莓學習筆記——webiopi安裝與入門

    webiopi是一個可控制樹莓派GPIO的web框架,該框架面向物聯網IoT開發。該專案託管於google,並可在sourceforge上下載到原始碼。現在webiopi已經發展到0.7版本,webiopi支援REST Server,CoAP server,並提供python庫和javascript庫

樹莓學習筆記——SQLite操作簡述

0 前言    本文介紹如何在樹莓派中利用SQLite資料庫儲存CPU溫度資料。SQLite是一款輕量級零配置資料庫,非常適合在樹莓派和其他嵌入式系統中使用。SQLite文件詳細資料豐富,本文不會詳細解釋SQLite資料庫操作的方方面面,只能結合具體場景按需說明。本文介紹的S

樹莓學習筆記(一)

1.樹莓派介紹 Raspberry Pi(中文名為“樹莓派”,簡寫為RPi,(或者RasPi / RPI) 是為學生計算機程式設計教育而設計,只有信用卡大小的微型電腦,其系統基於Linux。 隨著Windows 10 IoT的釋出,我們也將可以用上執行Wi

樹莓學習筆記——wiringPi GPIO使用詳解

2.BCM2835 GPIO相關暫存器    (該部分表述可能有誤,正在確認修改中)    樹莓派平臺的GPIO驅動,例如RPi.GPIO和WiringPi均採用直接操作GPIO暫存器的方式,樹莓派的CPU採用博通的BCM2835,想要更好的瞭解樹莓派的GPIO驅動實現就必須閱讀BCM2835的資料手冊。在B

樹莓學習筆記——使用標準PC104鍵盤

0 前言    本文將詳細介紹樹莓派的鍵盤設計。和多數的人的想法不同,世界上存在著各種各樣不同的鍵盤,中國人使用的鍵盤和美國人使用的鍵盤相同,而樹莓派源產自英國,英國的鍵盤和美國並不相同。國內多使用標準104鍵鍵盤,下面就講講如何配置。    【相關博文】1 PC104標準鍵

樹莓學習筆記樹莓入坑筆記二 LCD安裝

樹莓派入坑筆記 ——LCD安裝        上次將系統安裝完成之後,只能通過遠端連線或者連線HDMI顯示器,對於小巧的樹莓派不是特別方便。因此安裝一塊與其體積相似的LCD是個不錯的選擇。 一.3.5寸LCD簡介 (1)螢幕簡介 (2)主要引數:        解析度:4

樹莓學習筆記——GPIO功能學習

    可以在windows中編寫程式碼,如果是Python指令碼可通過FTP軟體傳輸到樹莓派中,然後使用SSH客戶端登入到樹莓派中執行Python指令碼。如果是C語言檔案,除了使用FTP傳輸之外還需要在樹莓派上編譯才可以生成可執行檔案(相當於windows上的exe檔案)。相關軟體操作請參考【樹莓派學習筆記

樹莓學習筆記——UART使用

# -*- coding: utf-8 -* import serial import time # 開啟串列埠 ser = serial.Serial("/dev/ttyAMA0", 9600) def main(): while True: # 獲得接收緩衝區字元

樹莓學習筆記——交叉編譯工具鏈

    交叉編譯工具較快開發的速度。樹莓派中已經安裝了gcc工具鏈,可在樹莓派中直接編譯原始碼生成可執行檔案。於此同時,PC機上也可使用gcc工具鏈生成可執行程式碼,但是和樹莓派上的gcc工具不同,PC機上的gcc工具生成intel或amd晶片上可執行的程式碼,但樹莓派卻是arm系列的晶片,顯然存在不小的差異

樹莓學習筆記——使用檔案IO操作GPIO SysFs方式

0 前言    本文描述如果通過檔案IO sysfs方式控制樹莓派 GPIO埠。通過sysfs方式控制GPIO,先訪問/sys/class/gpio目錄,向export檔案寫入GPIO編號,使得該GPIO的操作介面從核心空間暴露到使用者空間,GPIO的操作介面包括direction和value等,direct

樹莓學習筆記——apt方式安裝opencv

0.前言    本文介紹如何在樹莓派中通過apt方式安裝opencv,並通過一個簡單的例子說明如何使用opencv。相比於原始碼方式安裝opencv,通過apt方式安裝過程步驟簡單些,消耗的時間也少一些。通過apt方式安裝沒有自動生成opencv.pc檔案,所以在編寫make

樹莓學習筆記二:軟體包安裝

上一篇我們完成了 樹莓派ubuntu映象的燒錄和ROS的安裝,這一篇我們來講一下到底需要裝哪些軟體包 軟體1:vim(根據個人習慣) sudo apt-get install vim 軟體2:bo

樹莓學習筆記-GPIO介面程式設計-WiringPi

一. 兩種編號方式: 1. WiringPi 編號方式 2. Broadcom 編號方式 fritzin電子設計軟體採用Broadcom編號方式 二. 常用API WiringPi初始化函式:wiringPiSetup() ——使用WiringPi的

樹莓學習筆記——實現modbus RTU從機

0.前言    本文使用樹莓派實現MODBUS RTU從機,藉助python庫——modbus-tk實現RTU從機。MODBUS是一種靈活可靠的工業通訊協議,常用的MODBUS協議包括MODBUS RTU和MODBUS TCP。藉助python強大的庫函式,可以在樹莓派平臺上