ads1258_ads1158/ads1258调试总结

近期一直在调试ads1158,终于能够得到正常的输出,期间在网上查了很多的资料,发现关于ads1158的资料很少,尤其是基于verilog的程序几乎没有,所查的资料大多语焉不详,因此,本着人人为我,我为人人的精神,现在把ads1158的调试心得写出来,希望能够帮助一些开发者,节省开发时间。

1、在开发初期,由于是中途接手的项目,对硬件熟悉不够,导致耽误了不少时间,具体的硬件原因就不细说了,因为每一个开发者的硬件不可能是一样的,在这里给的建议是:在ads1158这部分的电路,可以根据数据手册来设计。另外,对于ads1158或者1258来说,模拟量是可以通过muxoutp(pin44)和muxoutn(pin43)引出来后自己添加一些信号处理的电路(如放大,滤波等),再由管脚adcinp(pin42)和adcinn(pin41)输入进芯片进行a/d转换,当然也可以在内部直接连接。如果需要在外部进行信号处理的话,在程序设计的时候需要对config0寄存器bit4位置为1(默认值为0)。数据手册上给出了两种外部信号处理的电路,在数据手册的42和43页。

2、在程序设计的时候,数据手册上给出了一个流程(在数据手册的40页)。具体为:1)reset spi接口。这是非常重要的一步,这也是我调试花的时间最多地方。如果要使芯片能正常工作,首先要使spi能正常工作。在调试前,有必要仔细研究一下spi的时序(数据手册第7页,图1)。复位的步骤是先将cs置高一段时间再拉低,至于置高的时间我也没搞懂,如果按照数据手册上的4096个fclk的话,发现spi的输出线上的数据是乱的,然后我就不断地增加延长的时间,直至spi出现的数据与预想的差不多。sck的信号通过spi master端(可以是单片机、dsp、cpld/fpga等)给出,这里要注意sck的信号是需要的时候再给,而不是一直给的。比如在发送命令、读取寄存器值,或者读取数据的时候。当然,对另外一个管脚cs的控制也很重要,cs的控制也是在需要的时候再拉低,闲时置高。2)把start管脚置为0,停止转换。一般在初始化的时候基本上都是start=0的。3)软件复位芯片。有的是把reset脚通过硬件复位的,由于我们是软件复位的,不熟悉硬件复位的情况,所以对于硬件复位的话,这步可能不需要。4)配置寄存器。配置的值按照数据手册上的说明结合自己的实际需求给出。5)回读寄存器的值。这个步骤在调试的时候很有用,可以作为判断是否正常工作,如果读出来的值与写进去的值一样,说明spi能够正常工作,尤其是可以根据id寄存器的值来判断,因为这个值是固定的。当然,如果程序调试好了,这部分的程序是可以不要的。6)以上的步骤完成后,可以将start置为1,开始转换。7)开始读数据,读的方式按照数据手册上的三种(直接读,命令读,脉冲读)选一种即可,我选的是直接读,根据drdy的管脚来判断。基本上按照以上的流程来操作是没有问题的,不管是基于什么语言开发。在这里再次强调一下首先要保证spi能够正常通讯。

3、ads1258基本上和1158操作流程是一样的。网上关于1258的例程比1158的多。TI的这两款芯片用好了是高性能ad转换器,用不好能把人折腾死。数据手册一定要细读。我在调试期间在社区里发了两个帖子都烂尾,不知道是我问的问题太简单,还是工作人员太忙,最后也就不了了之。

4、以下是基于verilog编写的源代码。cpld的晶振是50M。分频后得到500K作为sck。

module adc(

clk,

rst_n,

cs,

sck,

start,

pwdn,

drdy,

miso,

mosi,

rst_ad,

dataout,

clkout

);

input clk,rst_n;

input miso; //from ad device

input drdy;

output reg start;

output reg rst_ad;

output reg pwdn;

output reg cs;

output sck;

output reg mosi ;//to ad device

reg[15:0] cnt;

output reg clkout;

always @(posedge clk or negedge rst_n)begin

if (!rst_n)begin

clkout <= 1'd0;

cnt<=16'd0;

end

else if (cnt == 16'd50)begin

clkout <=~clkout;

cnt <=16'd0;

end

elsebegin

cnt <=cnt+1'd1;

end

end

assign sck =clkout && flag_sck;//通过一个标志位与clkout与操作后得到sck

reg flag_sck;

reg [15:0]state_spi;

reg [31:0]time_delay1,time_delay2;

always @(negedge clkout or negedge rst_n) begin

if(!rst_n) begin

cs <=1'd1;

flag_sck <=1'd0;

rst_ad <=1'd0;

pwdn<=1'd1;

rst_ad<=1'd1;

state_spi<=16'd0;

time_delay1<=32'd0;

time_delay2<=32'd0;

end

else begin

case (state_spi)

16'd0: begin

cs<=1'd1;

flag_sck<=1'd0;

//start<=1'd0;

mosi<=1'd0;

state_spi<=state_spi+1'd1;

end

16'd1: begin

if(time_delay1==32'd3000)begin //3000这个值是最后试出来的,如果按照500K的sck来算,远大于数据手册上的4096fclk。

cs<=1'd0;

flag_sck<=1'd1;

time_delay1<=32'd0;

state_spi<=state_spi+1'd1;

end

else begin

cs<=1'd1;

time_delay1<=time_delay1+1'd1;

end

end

16'd2: begin

start<=1'd0;

state_spi<=state_spi+1'd1;

end

16'd3: begin

if(time_delay2==32'd3000)begin //复位芯片,这个值也是最后试出来的。

rst_ad<=1'd1;

time_delay2<=32'd0;

state_spi<=state_spi+1'd1;

end

else begin

rst_ad<=1'd0;

time_delay2<=time_delay2+1'd1;

end

end

16'd4: begin cs <=1'd1;flag_sck<=1'd0; state_spi<=state_spi+1'd1;end

16'd5: state_spi<=state_spi+1'd1;

16'd6: state_spi<=state_spi+1'd1;

16'd7: state_spi<=state_spi+1'd1;

16'd8: state_spi<=state_spi+1'd1;

16'd9: state_spi<=state_spi+1'd1;

16'd10: state_spi<=state_spi+1'd1;

16'd11: state_spi<=state_spi+1'd1;

16'd12: state_spi<=state_spi+1'd1;

16'd13: state_spi<=state_spi+1'd1;

16'd14: state_spi<=state_spi+1'd1;

16'd15: state_spi<=state_spi+1'd1;

16'd16: state_spi<=state_spi+1'd1;

16'd17: state_spi<=state_spi+1'd1;

16'd18: state_spi<=state_spi+1'd1;

16'd19: state_spi<=state_spi+1'd1;

16'd20: state_spi<=state_spi+1'd1;

16'd21: state_spi<=state_spi+1'd1;

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 `ADS8688_Test` 函数中,我们可以添加一段程序来测试SPI是否能够读写芯片寄存器地址,并验证SPI操作是否正常。下面是一个示例代码: ```c int ADS8688_Test(void) { uint8_t regAddr = 0x0A; // 要写入和读取的寄存器地址 uint8_t writeData = 0x55; // 要写入的数据 uint8_t readData = 0; // 读取的数据 ADS8688_Init(); Enter_RESET_MODE(); // 写入寄存器 SPI_Write_Register(regAddr, writeData); // 读取寄存器 readData = SPI_Read_Register(regAddr); // 验证写入是否成功 if(readData == writeData) { printf("Register write successful!\n"); } else { printf("Register write failed!\n"); } while(1) { Get_AUTO_RST_Mode_Data(value,8); } } ``` 在这段代码中,我们添加了以下内容: 1. 定义了一个要写入和读取的寄存器地址 `regAddr`,以及要写入的数据 `writeData` 和读取的数据 `readData`。 2. 在初始化和进入复位模式后,使用 `SPI_Write_Register()` 函数将 `writeData` 写入指定的寄存器地址 `regAddr`。 3. 使用 `SPI_Read_Register()` 函数读取相同的寄存器地址 `regAddr` 的内容到 `readData` 变量中。 4. 验证读取的数据是否与写入的数据相等,如果相等则说明写入成功,打印相应的信息。 请将上述代码添加到 `ADS8688_Test` 函数中,并根据你的实际情况进行适当的修改和调试。这样可以测试SPI是否正常读写芯片寄存器地址,并验证写入操作是否成功。 如果有任何问题,请随时告诉我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值