在调试AD的时候,出现一个问题,无论是时钟信号,输入信号,还是AD使能信号输入都正常,可是采集到的数据都是不正常的,与实际的有很大的偏差,百思不得其解。查看原理图的时候猛然想起,在布板的时候,为了走线方便,把AD输出跟XINTF输入的高地位给颠倒了顺也就是说现在直接采集下来的数据经行位反转后才是正常的数值。按位反转的C代码如下:
其实反转的算法很简单,简单的描述一下:第一行代码为奇偶位相互交换;第二行为以两位为一单元,奇偶单元进行交换;第三行为以四位为一单元,奇偶单元进行交换;第四行为以八位为一单元,奇偶单元进行交换。至此,16位反转完成,算法结束。
Uint16 bit_reverse(Uint16 x)
{
x = ((x >> 1) & 0x5555) | ((x << 1) & 0xaaaa);
x = ((x >> 2) & 0x3333) | ((x << 2) & 0xcccc);
x = ((x >> 4) & 0x0f0f) | ((x << 4) & 0xf0f0);
x = ((x >> 8) & 0x00ff) | ((x << 8) & 0xff00);
return x;
}
此处是对16位的整形数据进行的按位反转。如果需要,在最后一句后面加上下面这句:
x = ((x >> 16) & 0x0000ffff) | ((x << 16) & 0xffff0000);
也就是以十六位为一单元,奇偶单元进行交换。同时注意补全前面与移位后的数据按位与的值。
很简单的一处小细节,却让我伤透了脑筋。看来细节决定成败还真没错。不过带上这个小算法对系统的实时性稍有影响。等下次板子打样的时候得改过来。
|