政府网站集约化建设总结外贸营销网站建设介绍
模数转换芯片,输出的数据,通常用SPI通信送到处理器当中。这些数据通常是一定位数的补码,转换芯片你是几位的,数据就是几位,通常用12位,14位,16位,18位,20位,22位,24位等。
这些数据怎么在处理其中怎么用,还真是个问题。
以24位的AD芯片输出的24位补码为例,
一个24位的补码通过SPI到dsp中之后,我改用什么数据类型去结束存储他呢,我们知道这个数肯定是整数,只是可能是整数也可能是负数,且不管是整数还是负数,都不是原码,而是补码,首先如果dsp的整形数据是16位,那么这个24位的数据至少应该用长整形的即32位的数去存储。
如果这个数是整数的话,那么他的符号位第24位就是0,24位数据放在32位整形的低24位,最高8位是0,那么这个数可以直接参与运算,不会出错。
如果这个数是负数,那么他的符号位第24位肯定是1,此时这个24位的数据放在32位的整形数据中的低24位,最高8位是0,此时处理器会把仍旧把最高位当做符号位,而认为这个24位的数是整数,那么这样参与运算的结果肯定是错误的。
我们要做的是,把以24位二进制表示的负数的补码,变成一32位二进制数表示的补码,并且不改变这个数的大小:
long int num24; //以24位补码表示的数据右对齐方在32位的整形变量当中。
num24 = ((num24<< 8) >> 8);//如此做之后,num24原来是正数的补码,那么,他还是原来的自己,如果是负数的补码,那么他的0到23位还是原来的自己,但是最高八位都变成1了,也就是符号位扩展到了32位数据的最高位,此时就可以直接参与计算了。
另外在处理器中,所有的减法都是加法运算,没有减法运算,因为所有的数据的算术运算是用其补码来运算的。
AD芯片回来的补码,将符号位扩展之后,就可以直接参与计算了