楼主,你好,最近也在用AD7685做采样,遇到一个问题,还麻烦楼主帮忙解答一下呀。
1、我使用的是4线带忙时序,用的是fpga控制的。
2、程序中我SCK一直有10MHz时钟,并且也利用这个时钟检测转换完成SDO有下降沿。然后开始读数据。在SCK的下降沿读取。现在有一个问题是,转换完成SDO有一个下降沿,检测这个下降沿有时候刚好在SCK的边沿。所以有时候检测不准,导致读取数据会少了最高位。不知道楼主知道怎么解决吗?
3、具体程序和signalTap获取的时序如图。
4、非常感谢楼主的帮忙,此外楼主有QQ吗?能方便告诉我吗?再次感谢你。
附代码:
module adc_7685new
(
input clk_10M,
input SDO,
input rst_n,
output reg CNV,
output reg SDI,
output SCK,
output reg out_available,////one conversion over give high
output reg[15:0]DATA
);
reg[16:0]adc_data;
assign SCK=clk_10M;
reg[4:0]st1;
reg rd_en;
always@(negedge clk_10M or negedge rst_n)
begin
if(!rst_n)begin
out_available<=0;
CNV<=0;
SDI<=0;
rd_en<=0;
st1<=0;
end
else
case(st1)
0:begin
out_available<=0;
CNV<=0;
SDI<=1;
st1<=st1+1'b1;
end
1:begin
CNV<=1;
st1<=st1+1'b1;
end
2:st1<=st1+1'b1;
3:st1<=st1+1'b1;
4:begin
SDI<=0;
st1<=st1+1'b1;
end
5:begin
if(SDO==1'b0)begin//wait cnv over,sdo from high to low
//adc_data[15]<=SDO;
rd_en<=1;
st1<=st1+1'b1;
end
else
st1<=st1;
end
6,7,8,9,10,11,12,13,14,15,16,17,18,19,20:begin
adc_data[21-st1]<=SDO;//read 16 bits one by one
st1<=st1+1'b1;
end
21:begin
adc_data[21-st1]<=SDO;
SDI<=1;
st1<=st1+1'b1;
end
22:begin
DATA<=adc_data[15:0];
st1<=st1+1'b1;
end
23:begin
st1<=st1+1'b1;
end
24:begin
st1<=st1+1'b1;
end
25:begin
st1<=st1+1'b1;
end
26:begin
out_available<=1;//one conversion over give high
rd_en<=0;
st1<=0;
end
default:st1<=0;
endcase
end
endmodule