最近一直在调试DSP21062L与AD7606的采样问题,先附上原理图:
除了控制信号外,AD数据线接到DSP数据线低16位,采样完成后触发DSP中断读取数据,下面是DSP读取数据代码
r4=dm(MS0AD0); //IN7
m0=7;
dm(m0,i0)=r4;
r4=dm(MS0AD0); //IN6
m0=6;
dm(m0,i0)=r4;
r4=dm(MS0AD0); //IN3
m0=3;
dm(m0,i0)=r4;
r4=dm(MS0AD0); //IN4
m0=4;
dm(m0,i0)=r4;
r4=dm(MS0AD0); //IN5
m0=5;
dm(m0,i0)=r4;
r4=dm(MS0AD0); //IN2
m0=2;
dm(m0,i0)=r4;
r4=dm(MS0AD0); //IN1
m0=1;
dm(m0,i0)=r4;
r4=dm(MS0AD0); //IN0
m0=0;
dm(m0,i0)=r4;
根据上面的代码,数据采集总是不对,为什么呢?郁闷了。。。。经研究发现DSP的寄存器R3,R4等为40位寄存器,低8位在读取外部总线数据时不用,数据占用高32位,由于AD数据线只有16位,DSP16-31数据线未用,所以在使用指令r4=dm(MS0AD0); 读取数据时,R4寄存器高16位始终未FFFF,具体数据位FFFF+16位数据+00,说以数据一直为负值,采样数据不对,需要经过处理,根据AD采样数据的正负对数据进行处理,具体代码如下:
r4=dm(MS0AD0); //IN7
R1 = 0X0000FFFF;
R4 = R4 AND R1;
R1 = 0X8000;
COMP(R4,R1);
IF GE JUMP AD1_CH1_MODIFY;
m0=7;
dm(m0,i0)=r4;
JUMP AD1_CH1_MODIFY_END;
AD1_CH1_MODIFY:
R1 = 0X10000;
R4 = R4-R1;
m0=7;
dm(m0,i0)=r4;
AD1_CH1_MODIFY_END:
r4=dm(MS0AD0); //IN6
R1 = 0X0000FFFF;
R4 = R4 AND R1;
R1 = 0X8000;
COMP(R4,R1);
IF GE JUMP AD1_CH2_MODIFY;
m0=6;
dm(m0,i0)=r4;
JUMP AD1_CH2_MODIFY_END;
AD1_CH2_MODIFY:
R1 = 0X10000;
R4 = R4-R1;
m0=6;
dm(m0,i0)=r4;
AD1_CH2_MODIFY_END:
r4=dm(MS0AD0); //IN3
R1 = 0X0000FFFF;
R4 = R4 AND R1;
R1 = 0X8000;
COMP(R4,R1);
IF GE JUMP AD1_CH3_MODIFY;
m0=3;
dm(m0,i0)=r4;
JUMP AD1_CH3_MODIFY_END;
AD1_CH3_MODIFY:
R1 = 0X10000;
R4 = R4-R1;
m0=3;
dm(m0,i0)=r4;
AD1_CH3_MODIFY_END:
r4=dm(MS0AD0); //IN4
R1 = 0X0000FFFF;
R4 = R4 AND R1;
R1 = 0X8000;
COMP(R4,R1);
IF GE JUMP AD1_CH4_MODIFY;
m0=4;
dm(m0,i0)=r4;
JUMP AD1_CH4_MODIFY_END;
AD1_CH4_MODIFY:
R1 = 0X10000;
R4 = R4-R1;
m0=4;
dm(m0,i0)=r4;
AD1_CH4_MODIFY_END:
r4=dm(MS0AD0); //IN5
R1 = 0X0000FFFF;
R4 = R4 AND R1;
R1 = 0X8000;
COMP(R4,R1);
IF GE JUMP AD1_CH5_MODIFY;
m0=5;
dm(m0,i0)=r4;
JUMP AD1_CH5_MODIFY_END;
AD1_CH5_MODIFY:
R1 = 0X10000;
R4 = R4-R1;
m0=5;
dm(m0,i0)=r4;
AD1_CH5_MODIFY_END:
r4=dm(MS0AD0); //IN2
R1 = 0X0000FFFF;
R4 = R4 AND R1;
R1 = 0X8000;
COMP(R4,R1);
IF GE JUMP AD1_CH6_MODIFY;
m0=2;
dm(m0,i0)=r4;
JUMP AD1_CH6_MODIFY_END;
AD1_CH6_MODIFY:
R1 = 0X10000;
R4 = R4-R1;
m0=2;
dm(m0,i0)=r4;
AD1_CH6_MODIFY_END:
r4=dm(MS0AD0); //IN1
R1 = 0X0000FFFF;
R4 = R4 AND R1;
R1 = 0X8000;
COMP(R4,R1);
IF GE JUMP AD1_CH7_MODIFY;
m0=1;
dm(m0,i0)=r4;
JUMP AD1_CH7_MODIFY_END;
AD1_CH7_MODIFY:
R1 = 0X10000;
R4 = R4-R1;
m0=1;
dm(m0,i0)=r4;
AD1_CH7_MODIFY_END:
r4=dm(MS0AD0); //IN0
R1 = 0X0000FFFF;
R4 = R4 AND R1;
R1 = 0X8000;
COMP(R4,R1);
IF GE JUMP AD1_CH8_MODIFY;
m0=0;
dm(m0,i0)=r4;
JUMP AD1_CH8_MODIFY_END;
AD1_CH8_MODIFY:
R1 = 0X10000;
R4 = R4-R1;
m0=0;
dm(m0,i0)=r4;
AD1_CH8_MODIFY_END:
经过上述处理,数据采集正玄波正常。