簡體   English   中英

如何使用 i2c-tools 通過 I2C 接口獲取 BH1750(光傳感器)的數據

[英]How to get data of BH1750 (light sensor) via on I2C interface using i2c-tools

我正在嘗試通過 Ubuntu-16.04 上的 I²C 接口使用BH170FVI 傳感器 我的板子是UpSquared而不是 Raspberry。

為了能夠使用 i2c 接口,我安裝了i2c-tools 之前我也用這個工具控制了BMI160傳感器,沒有遇到問題。

當我嘗試使用以下命令通過終端檢測我的傳感器時:

i2cdetect -r -y 5

此命令正確檢測我的傳感器,如下所示:

在此處輸入圖片說明

看起來我的設備地址是0x23

在此之后,當我嘗試通過以下命令讀取所有寄存器映射數據時:

i2cdump -y -f 5 0x23

結果是:

在此處輸入圖片說明

問題是所有地圖地址都為零。 其中至少有一個應該讀取光量。 我認為傳感器電源可能會關閉,但我嘗試使用命令i2cset進行開機,但仍然沒有任何變化。

注意:我的傳感器沒有問題,因為我用 Arduino 和以下代碼進行了嘗試:

#!/usr/bin/python
import smbus
import time
 
# Define some constants from the datasheet
DEVICE     = 0x23 # Default device I2C address
POWER_DOWN = 0x00 # No active state
POWER_ON   = 0x01 # Power on
RESET      = 0x07 # Reset data register value
ONE_TIME_HIGH_RES_MODE = 0x20
 
bus = smbus.SMBus(1)  # Rev 2 Pi uses 1
 
def convertToNumber(data):
  # Simple function to convert 2 bytes of data
  # into a decimal number
  return ((data[1] + (256 * data[0])) / 1.2)
 
def readLight(addr=DEVICE):
  data = bus.read_i2c_block_data(addr,ONE_TIME_HIGH_RES_MODE)
  return convertToNumber(data)
 
def main():
 
  while True:
    print "Light Level : " + str(readLight()) + " lux"
    time.sleep(0.5)
 
if __name__=="__main__":
   main()

我的問題是為什么我不能通過i2c-tools控制我的傳感器。

我認為@0andriy是對的。 您需要一個驅動程序、一個與其接口的庫(更多詳細信息請參見libiio“官方”用戶文檔),以及您的案例中的 python 綁定和一些配置。 在用戶空間中,您可以使用 mraa/upm,但它不在您的 Ubuntu 中,因此您需要構建它。

建議的答案是使用內核中的驅動程序,創建一個小的 ACPI 表,告訴內核在總線 5 的地址 0x23 上找到哪個設備。然后使用python-libiiolibiio C++ 綁定來訪問設備。 可以加載到內核中的 ACPI 表示例(提示:通過 ConfigFS)在這里https://github.com/westeri/meta-acpi/tree/master/recipes-bsp/acpi-tables/samples

在您的情況下,它將類似於:

DefinitionBlock ("bh1750.aml", "SSDT", 5, "", "BH1750", 1)
{
    External (_SB_.PCI0.I2C5, DeviceObj) // Define Correct I2C controller
    Scope (\_SB.PCI0.I2C5)
    {
        Device (ALS0)
        {
            Name (_HID, "PRP0001")
            Name (_DDN, "ROHM BH1750FVI ambient light sensor")
            Name (_CRS, ResourceTemplate () {
                    I2cSerialBus (
                            0x23,                   // I2C Address
                            ControllerInitiated, 
                            400000,                 // Bus Speed
                            AddressingMode7Bit,     
                            "\\_SB.PCI0.I2C5",
                            0x00,
                            ResourceConsumer,,)
            }
            Name (_DSD, Package () {
                ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
                Package () {
                    Package () {"compatible", "rohm,bh1750"},
                }
            })
        }
    }
}

...假設控制器的路徑是\\\\_SB_.PCI0.I2C5 (您可以在 DSDT 中找到它)。

@0andriy在評論中給出的鏈接,即在 x86_64 上添加 i2c 客戶端設備在 Intel Atom 板上構建 i2c 設備控制器spidev Linux 驅動程序提供了如何編譯上表並將其附加到系統的附加信息。

據我所知,使用 i2c-tools 不可能做到這一點。 問題在於您需要從 BH1750 讀取測量結果的方式。 見數據表:

S Adr Rd (A) (Data) A (Data) NA P

你不能用 i2c-tools 創建這樣的序列:

  • 沒有寄存器地址的一個字節
  • n字節,但你必須提供一個寄存器地址

兩者都會導致 I2C 命令序列不是芯片想要的。

它從用戶空間在 C 中為我工作。 在這里看到我的問題:

從用戶空間讀取一個字(2 字節)而不提供寄存器地址

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM