Raspberry pi NodeMCU ESP8266 I2C模块高速

Raspberry pi NodeMCU ESP8266 I2C模块高速,raspberry-pi,i2c,esp8266,nodemcu,Raspberry Pi,I2c,Esp8266,Nodemcu,我正在制作一个基于HMC5983磁阻传感器和ESP8266(NodeMCU ESP-12e模块)的无线装置来测量磁场 传感器通过I2C接口连接至ESP8266。这个 ESP8266轮询传感器并将其发送至数据采集器(Raspberry Pi) 对我来说,在一秒钟内实现尽可能多的计算是极其重要的,因为用于以后处理的所获得数据的质量取决于它 HMC5983支持标准、快速和高速模式下的I2C接口。但NodeMCU I2C模块仅支持I2C。速度较慢 通用I²C总线速度为100 kbit/s标准模式和10

我正在制作一个基于HMC5983磁阻传感器和ESP8266(NodeMCU ESP-12e模块)的无线装置来测量磁场

传感器通过I2C接口连接至ESP8266。这个 ESP8266轮询传感器并将其发送至数据采集器(Raspberry Pi)

对我来说,在一秒钟内实现尽可能多的计算是极其重要的,因为用于以后处理的所获得数据的质量取决于它

HMC5983支持标准、快速和高速模式下的I2C接口。但NodeMCU I2C模块仅支持I2C。速度较慢

通用I²C总线速度为100 kbit/s标准模式和10 kbit/s低速模式

然后我通过I2C将HMC5983直接连接到树莓Pi。在单次测量模式下,我可以每秒进行500次测量(通过监控DRDY中断引脚),在连续测量模式下每秒进行200次测量(数据输出速率为220 Hz-好的)。 程序是用Python编写的,下面是代码:

#!/usr/bin/python
import smbus #for i2c use
import time
import os

bus = smbus.SMBus(1) #use i2c port 1 on Rasspberry Pi
addr = 0x1e #address HMC5983 0x1E

bus.write_byte_data(addr,0x00,0b00011100) #Write to CRA Speed 220Hz
bus.write_byte_data(addr,0x01,0b00100000) #Write to CRB Gain 660 +-2.5Ga 1.52mG/Lsb

print "Start measuring.....
while True: #if we need infinity cycle
    bus.write_byte_data(addr,0x02,0b00000001) #Write to Mode single-measurement mode
    while bus.read_byte_data(addr,0x09) == 0b11: #Wait RDY in Status Register
       ()
    #DATA READY    
    data = bus.read_i2c_block_data(addr,0x03,6)#Take data from data registers
    #convert three 16-bit 2`s compliment hex value to dec values and assign x,y,z
    x = data[0]*256+data[1]
    if x > 32767 :
        x -= 65536
    y = data[2]*256+data[3]
    if y > 32767 :
        y -= 65536
    z = data[4]*256+data[5]
    if z > 32767 :
        z -= 65536  
    print "X=",x, "\tY=",y, "\tZ=",z
当我将HMC5983连接到ESP8266时,在单一计算模式下每秒只能完成大约140次计算

----------THIS IS FOR SINGLE-MEASUREMENT MODE-------------
--init i2c
function H_init(sda,scl)
    i2c.setup(id, sda, scl, i2c.SLOW)
    print("I2C started...")
end
-- reads 6byte from the sensor
function read_axis()
    i2c.start(id)
    i2c.address(id, dev_addr, i2c.RECEIVER)
    data = i2c.read(id, 6)
    i2c.stop(id)
    return data
end
--set register
function set_reg(reg_addr,val)
    i2c.start(id)
    i2c.address(id, dev_addr, i2c.TRANSMITTER)
    i2c.write(id,reg_addr)
    i2c.write(id,val)
    i2c.stop(id)
end
--------GPIO INITILIZATION-------
drdyn_pin=3
gpio.mode(drdyn_pin, gpio.INPUT)
-------I2C INITILIZATION-------
id = 0
i2c = i2c
local i=0
dev_addr = 0x1e
H_init(1,2)
set_reg(0x00,0x1c) --set speed 220Hz
set_reg(0x01,0x20) --set gain
print("Start measurement...")
while true do
    set_reg(0x02,0x01) --single-measurement mode
    while(gpio.read(drdyn_pin) == 1) do
    end
    data = read_axis()
    tmr.wdclr()
end
之后,我将传感器配置为连续测量模式,并每秒接收相同的200次测量


NodeMCU中的I2C接口是否可以高速运行?有人能告诉我如何加速传感器轮询吗?

当然有可能,ESP8266比奔腾更快:-)对于如此巨大的处理能力来说,每秒几千次甚至上万次的测量都会让人失望。这里是指向ESP8266 I2C库的链接,该库使用汇编编写,并使用Arduino工具链进行测试。这样,您可以在80 MHz下以每秒80万条消息的速率进行通信,或者在160 MHz下以每秒100万条消息的速率进行通信。我相信这对于您所描述的项目来说已经足够了,在80 kHz I2C速度下,如果从设备能够处理这样的速度,您可以每秒进行数万次测量


如果将来有人怀疑ESP8266是否可以实现某些功能,我会说——在这种情况下,我的意思是:——)

如果你知道NodeMCU只支持低速I2C,那么询问NodeMCU是否可以支持高速I2C似乎是乐观的。你必须达到什么样的阅读速度?@barny对不起,可能我没有正确表达。我的意思是,将来是否可能为NodeMCU使用i2c的高速?或者现在可以吃一种我不知道的方法?我需要每秒至少250次测量,但越快越好。由于芯片规范规定连续模式下的“快速220 Hz最大输出速率”,以及单次读取模式下的160次读数/s,我不确定你认为如果每秒读取次数超过这个数字,你会取得什么样的成绩——你将受到芯片/命运/运气/温度/的摆布。。。。为了使NodeMCU获得最大速度,我建议使用SPI(即硬件驱动)而不是I2C,I2C通常是软件位驱动的,这可能是您看到的速度限制的原因。谢谢您的回答!你说的是哪个模块?你能写下如何用普通模块构建NodeMCU固件,但用高速替换另一个I2C模块吗?