ads1158数据读取
你好,我想请教一下:
我使用ads1158的时候,采用寄存器命令的方式读取数据,但是我不知道怎么去判断独到的数据是否正确?以下是我的源代码:
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
num_reset_cmd<=8'd0;
num_reg_wr<=8'd0;
num_reg_rd<=8'd0;
num_dat_rd<=8'd0;
state <=reset_spi;
cs <=1'd1;
flag <=2'd0;
start <=1'd0;
cscnt <=8'd0;
end
else case(state )
reset_spi: begin //reset_spi; //
if(cscnt == 8'd200)begin
cs <=1'd0;
state <=reg_wr;
end
else begin
cs <=1'd1;
cscnt <=cscnt+1'd1;
end end //reset_spi
reg_wr: begin // reg_wr; //配置寄存器,打开i通道0、1和8
cs <=1'd0;
flag <=2'd1;
if(SCK_risingedge)begin
num_reg_wr<=num_reg_wr+1'd1;
case (num_reg_wr)
//cmd for config0
8'd0: mosi <=1'd0;
8'd1: mosi <=1'd1;
8'd2: mosi <=1'd1;
8'd3: mosi <=1'd0;
8'd4: mosi <=1'd0;
8'd5: mosi <=1'd0;
8'd6: mosi <=1'd0;
8'd7: mosi <=1'd0;
//config0
8'd8: mosi <=1'd0;
8'd9: mosi <=1'd0;
8'd10: mosi <=1'd0;
8'd11: mosi <=1'd0;
8'd12: mosi <=1'd0;
8'd13: mosi <=1'd0;
8'd14: mosi <=1'd1;
8'd15: mosi <=1'd0;
//cmd for muxsg0
8'd16: mosi <=1'd0;
8'd17: mosi <=1'd1;
8'd18: mosi <=1'd1;
8'd19: mosi <=1'd0;
8'd20: mosi <=1'd0;
8'd21: mosi <=1'd1;
8'd22: mosi <=1'd0;
8'd23: mosi <=1'd0;
//muxsg0
8'd24: mosi <=1'd0;
8'd25: mosi <=1'd0;
8'd26: mosi <=1'd0;
8'd27: mosi <=1'd0;
8'd28: mosi <=1'd0;
8'd29: mosi <=1'd0;
8'd30: mosi <=1'd1;
8'd31: mosi <=1'd1;
//cmd for muxsg1
8'd32: mosi <=1'd0;
8'd33: mosi <=1'd1;
8'd34: mosi <=1'd1;
8'd35: mosi <=1'd0;
8'd36: mosi <=1'd0;
8'd37: mosi <=1'd1;
8'd38: mosi <=1'd0;
8'd39: mosi <=1'd1;
//muxsg1
8'd40: mosi <=1'd0;
8'd41: mosi <=1'd0;
8'd42: mosi <=1'd0;//
8'd43: mosi <=1'd0;
8'd44: mosi <=1'd0;
8'd45: mosi <=1'd0;
8'd46: mosi <=1'd0;
8'd47: mosi <=1'd1;
default: begin
start <=1'd1;
state <=dat_rd;
end
endcase
end
end
dat_rd: begin // dat_rd; //写入命令00100000,开始读取通道数据
cs <=1'd0;
flag <=2'd2;
start <=1'd1;
if(SCK_risingedge)begin
num_dat_rd=num_dat_rd+1'd1;
case (num_dat_rd) //cmd
8'd0: mosi <=1'd0;
8'd1: mosi <=1'd0;
8'd2: mosi <=1'd1;
8'd3: mosi <=1'd0;
8'd4: mosi <=1'd0;
8'd5: mosi <=1'd0;
8'd6: mosi <=1'd0;
8'd7: mosi <=1'd0;
default: ; //num_dat_rd<=8'd0;//
endcase
end
end //dat_rd;
endcase
end
//以下为在每个下降沿读取数据的代码:
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
data_num <=8'd0;
//datacnt <=1'd0;
end
else if(SCK_fallingedge)begin
if(flag==2'd2)begin //flag的标志为当命令为0010000的时候,开始读取数据,
data_num=data_num+1'd1;
case (data_num)
8'd0,8'd1,8'd2,8'd3,8'd4,8'd5,8'd6,8'd7: ;//datacnt <=1'd0; //不管前八个周期的数据
8'd8: data[0]<=miso; //以下读取24位,带status
8'd9: data[1]<=miso;
8'd10: data[2]<=miso;
8'd11: data[3] <=miso ;
8'd12: data[4] <=miso ;
8'd13: data[5] <=miso;
8'd14: data[6] <=miso;
8'd15: data[7] <=miso ;//
8'd16: data[8]<=miso;
8'd17: data[9]<=miso;
8'd18: data[10]<=miso;
8'd19: data[11] <=miso ;
8'd20: data[12] <=miso ;
8'd21: data[13] <=miso;
8'd22: data[14] <=miso;
8'd23: data[15] <=miso ; //
8'd24: data[16]<=miso;
8'd25: data[17]<=miso;
8'd26: data[18]<=miso;
8'd27: data[19] <=miso ;
8'd28: data[20] <=miso ;
8'd29: data[21] <=miso;
8'd30: data[22] <=miso;
8'd31: data[23] <=miso ;
8'd32: begin
dataout<={8'h55,8'h55,data}; //读取玩数据发送出来,加两个55便于辨识
data_num<=8'd0;
end
default: begin
//data_num<=8'd0;
//datacnt <=1'd0;
end
endcase
end
end
end
上面便是主要代码,我现在读出来的数据很怪。在两个55后面。照例说应该是状态字节,在状态字节里应该有通道号,我现在读到的数据没有我预期的那样的通道号,比如我打开了通道0,那么状态字节的数据应该是08h,我现在读到的是各种数据,
求解答!
对于你自己输入的不同信号, 合理的寄存器数据应该是多少, 应该能知道吗?
直接用信号和结果进行验证, 这是最终的验证方法
但是,对于多个通道来说,我想我肯定线通过状态字节来判断是哪个通道的数据,这样才能验证数据。不然对于多个通道,你也不能确定你接收的数据是哪个通道的。
请问你是基于什么样的硬件做实验的?输入 的是什么样的信号? MUX out 跟ADC in之间有加运放吗?
建议先测试其中的一个通道;
测量输入信号,计算理论输出结果,并与实际输出结果做比较,看看是否正常!
现在的问题是我还不知道怎么去判断获取的数据是哪个通道的?我现在只打开一个通道(channel 2),根据数据手册上说的,我用直接读的模式应该第一个字节状态字节为0A或者8A,但是我现在状态字节能读到各种数据。
附件里有我的程序,原理图和波形。Martin帮我分析分析,谢谢。
你好,现在我在读取数据的时候,通道号可以读到,但是后面的数据不变,new位也是0。我测试不同的输入信号,数据都不变。这是为什么?
你好,我遇到一个问题
发现CLKIO无输出,晶振工作正常,看了手册,默认是用了外部晶振的话就会在CLKIO口的引脚输出,可是用示波器测不到
是我的芯片没有正常工作吗?
求指出问题