This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TLA2518:TLA2518 SPI 回读:读取未连接或非 AVDD 输入时的随机/毛刺数据

Guru**** 2399305 points
Other Parts Discussed in Thread: TLA2518

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1536229/tla2518-tla2518-spi-readback-random-glitchy-data-when-reading-unconnected-or-non-avdd-inputs

器件型号:TLA2518


工具/软件:

尊敬的 TI 团队:

我目前正在通过 SPI 为 TLA2518 提供 Cyclone V E FPGA。 我正在经营 SPI 模式 0 (CPOL = 0、CPHA = 0)、使用动态模式并遵循建议的帧格式。
我的 SPI 设置:

  • 时钟频率: 31.25MHz(由 125MHz 系统时钟÷4 生成)

  • SPI 模式: 模式 0(时钟在空闲状态下为低电平,数据在上升沿采样,数据在下降沿驱动)

  • 命令帧: 在 CS 低电平期间始终保持 24 位长(例如,用于设置 SEQ_MODE) 0x08 0x10 0x02

  • 读回: 中的情况 下一个 SPI 帧 、CS 在大于 3.6 μs 的帧之间保持高电平 (450 个系统时钟)、以允许转换

  • MOSI (SDO): 驱动接通 保持一致 SCK

  • MISO (SDI): 采样时间 发送到 DOUT 上 SCK

  • 初始化后、我将发送 12 位数据 动态通道选择帧 :12'b 100100000000(用于选择通道 2)

行为:

  • 连接时的默认状态 AVDD 对于 AIN2、我获得预期结果(例如,)0xFFF

  • 当我连接其他电压(例如 1.2V、2.0V)  或使 AIN2 悬空时、我会收到随机值、例如 0x820、0xC08、0x408、0x402、0x000

  • SignalTap 波形显示:
    • sdo在下降沿上正确转换
    • sdi在整个 SCK 周期内不稳定 —它似乎更改了中位
    • 即使 CS、时钟和时序都符合数据表规格、MISO 值看起来也损坏

问题:

  • 时间内保持有效 一个完整的 SCK 周期 在 31.25MHz 吗?

  • SPI 模式 0 连续读数支持、或者 IS 需要模式 1 来实现稳定的 SDI 时序?
  • 可能sdi由于 ADC 输出 tri 状态或信号完整性而导致不稳定?
  • 是否建议添加 上拉/下拉或串联电阻 SDI 上?


我附上:
SignalTap 波形屏幕截图
连接原理图

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 TI 团队:
    对此有任何更新? 我附加了 Verilog 代码和 sdc 文件的详细信息。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sameer、

    很抱歉迟到了。 我在过去一周的大部分时间里都不在办公室。  

    在 SPI 模式 0 下、以完整 60MHz 运行接口不会出现任何问题。 我能够以最大速度运行、器件没有任何问题。

    我最后感到困惑的是、您逻辑捕获上的 SDI 和 SDO 被标记为参考控制器、因此从器件上、它们发生了翻转。 将一个标记为 MOSI 和 MISO 会很有用。

    我不确定为什么器件的 SDO 不会在整个 SCLK 周期内保持高电平。 这不是我以前观察到的。 如果使用示波器探测这些线路、您是否会看到相同的行为?

    可能存在信号完整性问题。 我首先在较低的时钟频率下测试相同的序列。 ~需要考虑的是在两次转换之间使 Δ V CS 保持高电平的时间。 这段时间是什么? 至少应为 600ns。

    此致、
    Joel

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Joel:
    感谢您的答复。 现在、在 TLA2518 的 MISO 引脚和 SDO 引脚之间以 15.75MHz 频率添加了一个下拉寄存器后、我正在获得稳定的值。 但在 31.5MHz 下运行时得到的值几乎是原来的一半。 我的 CS 持续时间恰好在 600ns 内。 我是否可以增加 CS 高电平持续时间(在我的设计中,CS 高电平持续 600ns、CS 低电平持续 400ns)并在动态模式下捕获数据一次。 对此有何建议? 为什么我无法获得所需的结果? 我将在下面附上我的 Verilog 代码和 sdc 文件供您参考。

    // tla2518.v -- (c)2025 Coherent Corp.
    
    
    /* 
    
    //SPI interface for TLA2518 ADC using On-the-Fly mode
    	 Assumes 125 MHz system clock (8 ns period)
    	 SCK = 31.25 MHz (1 SPI bit = 4 clk cycles = 32 ns)
    
    // PHASE 1: Mode set (SEQ_MODE = 10b)
    	 - SPI write of 24 bits: 0x08 0x10 0x02
    	 - CS held LOW for 98 clk = ~784 ns
    	 - Sets ADC to On-the-Fly mode
    
    // PHASE 2: Channel select + acquisition
    	 - SPI frame with first 5 bits: 2’b10 + 3-bit CH ID
    	 - CS held LOW for 50 clk = ~400 ns = tACQ
    
    // PHASE 3: Conversion
    	 - CS goes HIGH → ADC begins SAR conversion
    	 - Wait 75 clk = 600 ns (> tCONV = 600 ns)
    
    // PHASE 4: Data read
    	 - Next SPI frame (during CS LOW), shift in 12-bit ADC result
    	 - Shift 1 bit every 4 clk (SCK = 31.25 MHz), strobe asserted at bit 48
    	 - `data[11:0]` = ADC value, `addr` = channel
    
    */
    
    
    
    module tla2518(
    	input clk,						// 125 MHz system clock
    	input reset,					// Active-high reset
    	input sdi,						// Serial data input (SDO from ADC)
    	output reg sck,					// SPI clock to ADC (31.25 MHz)
    	output reg sdo,					// SPI data out to ADC
    	output reg ss_n,				// SPI chip select (active low)
    	output reg [2:0] addr,			// Channel address for tracking
    	output reg [11:0] data,			// 12-bit ADC output
    	output reg strobe				// High when new data is valid
    );
    
    
    	// assume 125MHz clock (8ns period)
    	// Register write (CS low) 784ns = 24 * 32ns + 16ns = 98 * 8ns
    	// Acquisition (CS low) 400ns = 12 * 32ns + 16ns = 50 * 8ns
    	// Conversion (CS high) 3.6us = 450 * 8ns
    	
    	
    	localparam
    		s_init = 2'd0,					// Phase 1: Initialization
    		s_run0 = 2'd1,					// Phase 2: Channel select
    		s_run1 = 2'd2;					// Phase 4: Data read
    
    	parameter chan = 3'd2;				//Read data from only channel 2
    	
    	
    	reg [8:0] active;					// Controls how long CS stays LOW
    	reg [0:31] command;					// SPI command (32-bit container, top 24 bits used)
    	reg [7:0] frm_duration;			//It will explain how much duration fram will run
    	
    	//reg [2:0] chan;				// Channel number to select
    	reg [8:0] count;			// Global cycle counter (0 to 499)
    	reg [1:0] state;			// FSM state register
    	
    	always @(*) case(state)
    		s_init:
    			begin
    				active = 9'd98;						// CS active for 24.5 SCK periods // Phase 1: 24-bit write → 24 bits × 4 clk = 96 clk + 2 clk slack = 784 ns
    				command = 32'h08_10_02_00;			// Write SEQ_MODE = 0x02 (On-the-Fly mode); 
    				frm_duration = 8'd173;				//98 clk cs low + 75 clk cs high (600ns conversion time)
    			end
    		s_run0, s_run1:
    			begin
    				active = 9'd50; // CS active for 12.5 SCK periods
    				command = {2'b10, chan, 27'b0}; // select channel on-the-fly
    				frm_duration = 8'd125;				//50ckl cs low + 75 clk cs high
    			end
    	endcase
    	
    	always @(posedge clk or posedge reset)
    		if(reset) begin
    			//chan <= 3'b0;
    			count <= 9'b0;
    			sck <= 1'b0;
    			sdo <= 1'b0;
    			ss_n <= 1'b1;
    			state <= s_init;
    			strobe <= 1'b0;
    		end else begin
    			//if(count < 9'd499)
    			if(count < frm_duration)
    				count <= count + 9'b1;
    			else begin
    				count <= 9'b0;
    				case(state)
    					s_init:
    						state <= s_run0;
    					s_run0, s_run1:
    						begin
    							addr <= chan;
    							//chan <= chan + 3'b1;
    							state <= s_run1;
    						end
    				endcase
    			end
    			if(count[1:0] == 2'b0)
    				data <= {data[10:0], sdi};							// Serial data input (SDO from ADC) from every 4th clock cycle +ve edge of sck
    			strobe <= (state == s_run1) & (count == 9'd48);
    			sck <= (count < active) & count[1];					//its performing frequency divide by 4
    			//~|count[8:7] prevents to send beyond 24 bit i.e., 24*4 = 96 clk clk after that sdo will be 0
    			sdo <= ~|count[8:7] & command[count[6:2]];			//command[count[6:2]] picks one bit from the 32-bit command word
    			ss_n <= ~(count < active);							// CS LOW during active phase
    		end
    	
    	
    
    endmodule
    

    # Base input clock: 24 MHz
    create_clock -name clock_osc -period 41.667 [get_ports clock_osc]
    derive_pll_clocks
    derive_clock_uncertainty
    
    #set clk pll1_0002_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk
    #give some name to pll generated output and we are giving clk_125M
    set clk_125M pll_1|pll1_0002_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk
    
    #set clk_62_5M pll_3|pll3_0002_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk
    
    #we are defining the clock for the particular registor
    create_generated_clock -name sck_reg -source [get_pins $clk_125M] -divide_by 4 tla2518_inst_0|sck
    
    #create_generated_clock -name sck_reg -source [get_pins $clk_62_5M] -divide_by 4 tla2518_inst_0|sck
    
    #Now we have to define the clock for particular pin
    create_generated_clock -name sck -source tla2518_inst_0|sck [get_ports sck_o]
    
    
    #wrong parameters defines so that future someone will understand it
    #create_generated_clock -name sck -source [get_ports $clk] -divide_by 4 [get_ports {Top_TLA2518|tla2518_inst_0|sck}]
    
    
    #we have to define the input and output delay based on datasheet of tla2518
    set_input_delay -clock sck -clock_fall -max 16.0 [get_ports sdi]
    #set_input_delay -clock sck -clock_fall -min 0.0 [get_ports sdi]
    
    set_multicycle_path -from sdi -setup -end 4
    set_multicycle_path -from sdi -hold -end 3
    
    
    set_output_delay -clock sck -max 1.5 [get_ports sdo]
    set_output_delay -clock sck -min -2.0 [get_ports sdo]
    
    set_multicycle_path -to sdo -setup -start 2
    set_multicycle_path -to sdo -hold -start 3
    
     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Joel:
    我还有一个问题。 我们是否需要在 SDC 文件中添加任何其他时序参数。 因为根据我的理解、如果我的代码适用于低频、而不适用于高频、那么肯定存在一些时序问题。 我没有设置 tDEN_CSDO 和 tDZ_CSDO 时间、即相对于 CS 引脚。 您能建议一下如何通过查看我的代码来设置这些时序吗? 然后、它会对我有所帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sameer、

    对于调试信号完整性问题、我认为如果您分享了 SPI 线路的原理图和示波器捕获结果、会很有用。 SCLK 线路的噪声可能过大。 Verilog 很有帮助、但查看它在模拟领域中生成的实际结果会更有用。

    目前、您如何进行设计原型设计? 您是否构建了 PCB、或者您使用的是试验电路板? 您是否有可帮助更近检查时序参数的逻辑分析仪(例如 Saleae)?

    此致、
    Joel

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Joel:
    我将  首先使用试验电路板设置、在 ADC 完成后将其集成到 PCB 设计中。 除 Quartous PRIME (Signal Tap Logic Analyzer) 之外、我们没有任何外部逻辑分析仪。 我可以获取 13 位数据并丢弃 LSB、或者一旦 CS 为低电平、我们将(我的 FPGA 的)MOSI 设置为低电平、然后发送 12 位数据(表示 13 位事务)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sameer、

    感谢您的信息。 当前的实现似乎很可能导致问题、尤其是在高时钟频率条件下。 一旦将全部集成到 PCB 上、我会期望这些问题消失、因为 SPI 实际上对保持信号完整性的要求并不是特别高。

    您是否能够发送示波器捕获、从而确保接地探头尽可能短以减少外部噪声拾取、至少对于 SCLK、使用接地弹簧探头? 器件的 SDO 行为似乎并不正常、因此我想知道是否拾取了一些错误的 SCLK 边沿。

    您应该能够发送 13 个 SCLK、但仍能按预期获取数据。 我想您是从 FPGA 发送内容的角度来查看它、但从器件角度来看、只要在前一帧中没有发送寄存器读取命令、它就会在 SDI 上发送 ADC 转换数据。

    逻辑分析仪上的采样率是否可配置? 如果是、数字信号的采样速度是多少?

    此致、
    Joel

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Joel:
    我会发送我的完整存档文件,你可以提取它,并测试它,并建议我是从我这边设置错误还是其他东西. 它对我非常重要、对我来说是高度优先事项。 我将附加我的存档文件。 您可以使用 Quartous prime 工具来使用它。 请从您的端开始尝试 我使用了示波器、但波形有很大的噪声。 如果你有什么东西,那么它将是对我的拥抱。 我们可以就此致电吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    module Top_TLA2518(
    	input clock_osc,
    	input sdi,						// Serial data input (SDO from ADC)
    	output sck_o,					// SPI clock to ADC (31.25 MHz)
    	output sdo,					// SPI data out to ADC
    	output ss_n,				// SPI chip select (active low)
    	output strobe
    	//output clk
    );
    
    
    
    	wire clk;							//125MHz
    	wire clk_62_5m;
    	wire clk_250m;
    
    
    	
    	wire sck_i;
    	wire [1:0] pll_locked;
    	//assign sck_o = sck_i;
    	
    	
    	wire pll_locked_w = &pll_locked;
    	reg [1:0] pll_ready;
    	assign reset = ~pll_ready[1];
    	assign po_reset_int = ~pll_ready[1];
    	wire [11:0]data;
    	
    	
    	tla2518 tla2518_inst_0(
    		.clk(clk),
    		//.clk2(clk_250m),
    		.reset(reset),
    		.sdi(sdi),
    		.sck(sck_o),
    		.sdo(sdo),
    		.ss_n(ss_n),
    		.addr(),
    		.data(data),
    		.strobe(strobe)
    	);
    	
    	
    	
    	always @(posedge clk or negedge pll_locked_w)
    		if(~pll_locked_w)
    			pll_ready <= 2'b0;
    		else
    			pll_ready <= {pll_ready[0], 1'b1};
    			
    	pll1_0002 pll_1(
            .refclk    (clock_osc),   //  refclk.clk
            .rst       (1'b0),      //   reset.reset
            .outclk_0  (clk), // outclk0.clk 125MHz
            .locked    (pll_locked[0])//  locked.export
        );
    	 
    	 
    	 pll2_0002 pll_2(
            .refclk    (clock_osc),   	//  refclk.clk
            .rst       (1'b0),      		//   reset.reset
            .outclk_0  (clk_62_5m), 			//sampling clock for debugging 250MHz 
    		  .outclk_1  (clk_250m),
            .locked    (pll_locked[1])	//  locked.export
        );
    	 
    	 
    
    	
    	
    
    	
    	
    	
    endmodule

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是我的顶级 Verilog 代码

    create_clock -name clock_osc -period 41.667 [get_ports clock_osc]
    derive_pll_clocks
    derive_clock_uncertainty
    
    
    set clk_125M pll_1|pll1_0002_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk
    
    set clk_62_5M pll_2|pll2_0002_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk
    
    create_generated_clock -name sck_reg -source [get_pins $clk_125M] -divide_by 4 {tla2518_inst_0|sck tla2518_inst_0|ss_n}
    create_generated_clock -name sck -source tla2518_inst_0|sck [get_ports sck_o]
    
    create_generated_clock -name adc_ss_n -source tla2518_inst_0|ss_n [get_ports ss_n]
    
    #we have to define the input and output delay based on datasheet of tla2518
    set_input_delay -clock sck -clock_fall -max 16.0 [get_ports sdi]
    set_input_delay -clock sck -clock_fall -min 0.0 [get_ports sdi]
    set_input_delay -clock adc_ss_n -clock_fall -max 15.0 [get_ports sdi] -add_delay
    set_input_delay -clock adc_ss_n -clock_fall -min 0.0 [get_ports sdi] -add_delay
    
    set_multicycle_path -from sdi -setup -end 4
    set_multicycle_path -from sdi -hold -end 3
    
    
    
    set_output_delay -clock sck -max 1.5 [get_ports sdo]
    set_output_delay -clock sck -min -2.0 [get_ports sdo]
    
    set_multicycle_path -to sdo -setup -start 2
    set_multicycle_path -to sdo -hold -start 3

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Joel:

    我希望此消息能帮您找到答案。

    我已附加顶层模块、TLA2518 Verilog 模块和相应的 SDC 文件供您参考。 您可以使用任何标准 EDA 工具编译此代码来生成位流文件、然后可使用 TLA2518 ADC 对该文件进行测试。

    如果您能查看设计并提出任何必要的更改或改进建议、我们将不胜感激。 该 ADC 接口为 关键组件 我们的持续发展以及确保其正常运行对于我们系统的成功至关重要。

    如果当前实施按预期运行、我们计划 集成到我们的主器件中 然后继续执行 批量订购 TLA2518 ADC 发送通道发送电子邮件。

    感谢您的支持和帮助。 我们期待您的宝贵反馈。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 TI 团队:

    我的问题是否有任何更新?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sameer、

    我键入了回复、但没有发送。 为此我们深表歉意。

    感谢您分享文件、我理解这是高度优先级。 我已向您发送了通过私人消息连接的请求、以便我们可以通过电子邮件联系并 设置电话来讨论此问题。

    目前、我无法访问 Quartus 或 Vivado、因为我们必须分配许可证。 我仍然认为、最好的方法是使用示波器捕获来观察器件的行为、尤其是在它驱动 SDO 引脚时。 如果可能、请告诉我。 到目前为止、发送的命令看起来正确、因此我认为这可能是信号完整性问题、尤其是因为它似乎在较低的时钟频率下正常运行、但在较高的数据速率下会出现问题。

    此致、
    Joel

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。


    你好 Joel Meraz ,
    我将示波器结果附在下面。 请对附件进行修整。 如果可能、请尝试编译任意 EDA 工具的 Verilog 代码、并尝试使用您的设置进行测试。 然后、它会对我有所帮助。 我没有收到任何邮件与您联系。 您能说明向我发送链接的平台吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sameer、

    是的、SPI 线路看起来有很大的噪声。 您是否可以尝试在连接了接地弹簧探头的情况下进行探测、看看是否获得更好的结果?

    我通过 E2E 发送了邮件。 您应该通过查看您的通知或在“朋友“选项卡下看到它。 之后我们可以私下联系。

    此致、
    Joel

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。


    你好 Joel Meraz ,
    我没有收到任何关于私人图表的通知。 我将探头的一端接地、另一端连接到引脚。 但我仍然得到相同的。 您是否有任何其他想法如何创建干净的设置。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sameer、

    我会透过私信跟进、以便进一步讨论。

    此致、
    Joel

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    没问题

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Sameer、

    几天前,我通过私人消息回复。 请通过私人消息继续此对话。

    此致、
    Joel