Зачем использовать битовый сдвиг значений перед записью в I2 C? - PullRequest
0 голосов
/ 28 мая 2020

Недавно я купил контроллер PTZ-камеры от arducam и нашел на github нечто вроде программного обеспечения API / контроллера (https://github.com/ArduCAM/PTZ-Camera-Controller). Модуль интегрирован с I2 C и имеет несколько функций в разных регистрах. Я пытался понять 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, вы получите:

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

Что должно равняться 2400, по моей оценке. Довольно близко к 2317. Однако:

Зачем им это делать, а не просто иметь диапазон ввода от 0 до 2317?

1 Ответ

0 голосов
/ 28 мая 2020

Похоже, что это переворачивает порядок двух байтов в 16-битном целом числе. Вероятно, это преобразование от прямого порядка байтов к прямому порядку байтов, два разных способа представления целых чисел. Я думаю, что контроллер использует прямой порядок байтов, а ПК - прямой порядок байтов. (https://en.wikipedia.org/wiki/Endianness)

...