先读取和存储 MSB

Reading and Storing MSB first

我被认为是编程的初学者,很抱歉,如果这是一个非常简单的问题。

我正在使用 STM32f411 uC 通过 I2C 协议读取压力传感器 MS5525DSO。通过Eclipse使用c语言编程

当我从传感器 "PROM" 内存中读取数据时,我期望 2 个字节 "clocked with the MSB first" 作为第 10 页中所述的数据 sheet。

我的代码:

uint8_t Cmd= 0xA6;
  // Transmit a request to read from 0xA6 memory address:
  HAL_I2C_Master_Transmit(&I2C_HandleTypeDef, sensor_address, Cmd, 1 byte, timeout);

uint8_t PROM [2];
  // Read from PROM 0xA6
  HAL_I2C_Master_Receive(&I2C_HandleTypeDef, sensor_address, &PROM[0], 2 bytes, timeout);

现在,我将这两个字节存储在一个数组变量中 unint8_t PROM [2]

结果是:

PROM [0]= 61 十进制或 (0011 1101 b)

PROM [1]= 66 十进制或 (0100 0010 b)

使用 memcpy 函数,则值应为 = 15,682 或 (0011 1101 0100 0010 b)

然后,我改变主意,说让我把数据直接存储在一个16位变量中,所以,

unint8_t PROM --->> unint16_t PROM

当我执行时,我得到了这个值:

PROM = 16,957 十进制或 (0100 0010 0011 1101 b)

很明显是先写第二个字节(66d)再写后面的(61d)字节,

所以,我很困惑。我的第一种方法是正确的还是我遗漏了什么?第二种方法是否交换字节?哪一个是正确的?

你可以用 (x1 << 8) | x2 将两个 8 位存储到一个 16 位中,其中 x1PROM[0]x2PROM[1]

这是在<<|是逻辑运算符,<<左移|

还有很多其他的位破解方案,cf https://graphics.stanford.edu/~seander/bithacks.html

感谢大家的评论和回答。

正如您所说,这是一个字节序问题。因此,我将这一行添加到代码中,给出 "PROM" 是一个 16 位 uint。

           PROM= ((PROM<<8)&0xff00)|((PROM>>8)&0x00ff);

这将进行字节交换。

幸运的是,我的传感器具有温度测量功能。所以,我可以验证我的代码并使用上面的字节交换行代码得到正确的结果“23 C”(我的房间温度)。

但是,我仍然对为什么我的代码中使用的函数执行小端排序感兴趣,并且有没有办法更改该设置。

再次感谢您的贡献。