将两个8位寄存器读入C中的ADXL362的12位值

时间:2018-07-18 16:59:09

标签: c bit-manipulation byte bitwise-operators bit

我正在查询 ADXL362数字输出MEMS加速度计的轴数据,该数据作为两个8位寄存器保存在一起,这些寄存器组合在一起给出12位值,我试图弄清楚如何合并这些值。我从来都不擅长按位操作,因此我们将不胜感激。我可以想象是这样的:

number = Z_data_H << 8 | Z_data_L;
number  = (number & ~(1<<13)) | (0<<13);
number  = (number & ~(1<<14)) | (0<<14);
number  = (number & ~(1<<15)) | (0<<15);
number  = (number & ~(1<<16)) | (0<<16);

ADXL362 data sheet(第26页)

Z轴数据寄存器 Z axis data register

2 个答案:

答案 0 :(得分:0)

您只需要做:

signed short number;

number = Z_data_H << 8 | Z_data_L;

左移8位加上您已经使用的低位 弄清楚了正确地组合了两个字节。只需使用适当的数据大小,即可使C代码正确地重新识别12位数字的符号。

请注意,short不一定指16位值,具体取决于您的编译器和体系结构-因此,您可能希望尝试这样做。

答案 1 :(得分:0)

您的第一行应该是您所需要的:

int16_t number;
number = (Z_data_H << 8) | Z_data_L;

符号扩展位意味着您可以读取该值,就像它是一个16位带符号整数一样。 绝对不会超出12位整数的范围。重要的是,请保留这些位完整无缺,以便正确处理负值。