![](/img/trans.png)
[英]Cannot use write() or read() calls on I2C device, but echo and i2c-tools work
[英]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-libiio
或libiio
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 创建这样的序列:
两者都会导致 I2C 命令序列不是芯片想要的。
它从用户空间在 C 中为我工作。 在这里看到我的问题:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.