首页 > 解决方案 > 为什么在写入 I2C 之前对值使用位移位?

问题描述

我最近从 arducam 购买了 PTZ-Camera-controller,并在 github ( https://github.com/ArduCAM/PTZ-Camera-Controller ) 上找到了一种 API/Controller 软件。该模块与 I2C 集成,并在不同的寄存器上具有多种功能。我试图理解python程序,但我被程序中多次出现的一行代码弄糊涂了:

def read(self, I2C_address, register_address):
    value = self.bus.read_word_data(I2C_address, register_address)
    value = ((value & 0x00FF) << 8) | ((value & 0xFF00) >> 8)        #This one
    return value

def write(self, I2C_address, register_address, value):
    if value < 0:
        value = 0
    value = ((value & 0x00FF) << 8) | ((value & 0xFF00) >> 8)         #And this one
    return self.bus.write_word_data(I2C_address, register_address, value)

例如,这些可用于读取或写入相机变焦电机。电机有 2317 步,缩放值的默认跨度为 0-18000。我想这是有道理的,因为如果你尝试写 18000 = 0x4650,你会得到:

值 = ((0x4650 & 0x00FF) << 8 | (0x4650 & 0xFF00) >> 8))

据我估计,这应该等于 2400。相当接近 2317。但是:

他们为什么要这样做,而不仅仅是输入范围从 0 到 2317?

标签: pythonbit-shifti2c

解决方案


看起来这是在翻转 16 位整数中两个字节的顺序。这可能是从大端转换为小端,这是表示整数的两种不同方式。我认为控制器使用大端,PC 使用小端。(https://en.wikipedia.org/wiki/Endianness


推荐阅读