ESP8266 + Micropython: почему я продолжаю получать одно и то же значение при периодических чтениях i2c?
Я пишу некоторый простой код, используя MicroPython, работающий на дубе Digistump, который по сути является платой ESP8266. Я пытаюсь понять поведение, которое я вижу при выполнении периодических чтений датчиков через i2c.
Следующий код (который читает значение ACCEL_XOUT_H
а также ACCEL_XOUT_L
регистрируется) работает просто отлично
>>> from machine import Pin, I2C
>>> bus = I2C(scl=Pin(2), sda=Pin(0))
>>> while True:
... h, l = bus.readfrom_mem(0x68, 0x3b, 2)
... print (-((((h<<8)+l)^0xFFFF) + 1) if (h & (1<<7)) else (h<<8)+l)
(Это оператор печати просто выполняет преобразование из дополнения до двух.)
Как и ожидалось, это выводит значения из акселерометра, которые меняются примерно в реальном времени, когда я перемещаю imu.
Но если я введу задержку в цикл, например...
>>> import time
>>> from machine import Pin, I2C
>>> bus = I2C(scl=Pin(2), sda=Pin(0))
>>> while True:
... h, l = bus.readfrom_mem(0x68, 0x3b, 2)
... print (-((((h<<8)+l)^0xFFFF) + 1) if (h & (1<<7)) else (h<<8)+l)
... time.sleep(1)
... Я вижу очень странное поведение. Значения, возвращаемые операцией чтения i2c, остаются неизменными в течение многих итераций после изменения ориентации imu. Я в растерянности относительно того, что здесь происходит: операции чтения i2c, считываемые из регистров IMU, которые, согласно документации, обновляются с частотой дискретизации, которая в конфигурации по умолчанию составит 1 кГц. Я не вижу в коде или пути данных ничего, что могло бы каким-либо образом фиксировать или кэшировать эти значения.
Это документация по регистрам акселерометра, как указано в документе " Карта регистров и описания":
Эти регистры хранят самые последние измерения акселерометра. Измерения акселерометра записываются в эти регистры с частотой дискретизации, определенной в регистре 25.
Регистры измерения акселерометра, наряду с регистрами измерения температуры, регистрами измерения гироскопа и регистрами данных внешнего датчика, состоят из двух наборов регистров: набора внутренних регистров и набора регистров считывания, обращенного к пользователю. Данные в наборе внутренних регистров датчиков акселерометра всегда обновляются с частотой дискретизации. Между тем, пользовательский набор регистров чтения дублирует значения данных внутреннего набора регистров всякий раз, когда последовательный интерфейс простаивает.
Поскольку я сплю между вызовами чтения, я почти уверен, что последовательный интерфейс i2c бездействует по любому определению, и я не вижу ничего другого, имеющего отношение к этому поведению.
Есть ли у вас какие-либо предложения относительно того, что здесь может происходить?