ADS1256通过SPI读取到的数据为24位有符号数据[0,23],第23位为符号位,1为负,0为正。
但是在STM32中,我们常用int32或者uint32来存放这个数据,如果直接赋值赋过去就会出现意想不到的后果,如下:
这就是直接赋值之后绘出来的图,因此我们需要将24为有符号变量转换为32位有符号变量,但在此处很容易绕晕,具体分析如下
24位有符号数据当大于0x80 0000(8388608)时说明当前数据为负数,为什么这么说呢,因为24位的有符号数存在int32的数据中,其已经变成了一个正数
举个栗子(假设有int24这种类型)
int24_t numA = -1;其转换为hex则为0x80 0001(1000 0000 0000 0000 0000 0001),最高位代表了符号位。
但实际的应用过程中并没有int24_t,只有int32_t,再举个栗子
// int32_t numB = -1;其转换为hex则为0x8000 0001(1000 0000 0000 0000 0000 0000 0000 0001)
int32_t numB = 0;其转换为hex则为0x0000 0000(0000 0000 0000 0000 0000 0000 0000 0000)
当numB赋值给numA时其numB发生了如下变化
numB变成了0x0080 0001也就是8388609,此时这个数突然发现变成了正数,与我们原来的-1完全不一样,因此需要转换一下
如果numB是负数,也就是当numB大于0x80 0000(8388608)时为负数,做出如下计算
该计算就是正常的流程:取反 -> 符号位及高位置0 -> 加一 -> 加负号
MATLAB:
if(numB >= 8388608) %取反 numB = bitcmp(numB); %23到32位置零 for j = 23:32 numB = bitset(numB,j,0); end numB = numB + 1; numB = -numB; end
C语言:
if(numB& 0x800000){ numB= ~(unsigned long)numB; numB&= 0x7fffff; numB+= 1; numB= -numB; }
最后正常图如下:
标签:24,int32,0000,符号,位有,numB,ADS1256 From: https://www.cnblogs.com/lesterbor/p/18001859