精华内容
下载资源
问答
  • DAC芯片选型.doc

    2019-06-20 21:44:49
    dac芯片选型介绍
  • 常用DAC芯片及相关性能解析
  • 因此,研究DAC 芯片的测试方法,对高速、高分辨率DAC 芯片的研发具有十分重要的意义。  目前,波形测量和分析协会已提出了DAC 测试的技术标准IEEE Std.1057,里面的术语和测试方法为DAC 测试提供了更多的参考。...
  • 一种高精度DAC芯片的设计.pdf
  • 云芯 DAC芯片 YD14D250 数据手册,资料网上基本找不到。。
  • PCM1770-低功耗立体声音DAC芯片
  • 因此,研究DAC 芯片的测试方法,对高速、高分辨率DAC 芯片的研发具有十分重要的意义。  目前,波形测量和分析协会已提出了DAC 测试的技术标准IEEE Std.1057,里面的术语和测试方法为DAC 测试提供了更多的参考。...
  • 利用DAC芯片和运算放大器构建可编程电流源.pdf
  • 全新赛道 已经出发 HIFIMAN自研DAC芯片 HYMALAYA及其新品.pdf
  • 云芯DAC芯片 YD16D250.pdf

    2019-07-28 00:42:33
    云芯 DAC芯片 YD16D250 数据手册,资料网上基本找不到。。
  • DAC芯片与MCU通信的常见方式有:**SPI**、**IIC**和**通用I/O模拟时序**等方式控制。通俗地讲,要正确控制DAC芯片,其实就是理清该芯片的*通信时序*。 长话短说,本文只是简单的介绍如何通过I/O进行DAC芯片的控制及...

        DAC芯片与MCU通信的常见方式有:SPIIIC通用I/O模拟时序等方式控制。通俗地讲,要正确控制DAC芯片,其实就是理清该芯片的通信时序
        长话短说,本文只是简单的介绍如何通过I/O口控制使用DAC芯片。以DAC8550芯片为例:
        (1)从Datasheet中获取有用信息:
                a.引脚定义:

    说明:控制引脚需要关注3个(SYNC、SCLK和Din)

    1. SYNC(数据帧的同步输入信号):低电平有效。当SYNC引脚为低电平,在时钟信号下降沿到来时会使能输入移位寄存器传输数据。DAC在第24个时钟之后进行更新(如果在24个时钟结束之前拉高了SYNC信号,那么忽略写入序列)
    2. SCLK(串行时钟输入信号):数据传输速率高达30MHz。
    3. Din(串行数据输入信号):在SCLK时钟输入信号的每个下降沿,数据(0或1)被写入到24位输入移位寄存器中。

                b.输入移位寄存器:

    说明:该寄存器是24位寄存器,高6位(23~18)未使用,PD1和PD0是控制工作模式位(工作模式如下述),剩下16位是数据位。

                c.工作模式(4种工作模式):通过寄存器PD1和PD0控制

    说明:工作模式根据需求不同而自主设置,我这里是将DAC8550的工作模式设置为正常操作模式(00)

                d.控制时序

    说明:上面是官方的时序图,以下是我个人自己画的一个时序例子(画功不好请包涵哈)

                e.电压输出运算

     

    相对熟悉了该芯片的工作原理之后,剩下就是程序控制了(程序也比较简单):

    1、初始化引脚(我的硬件连接是:SYNC->PA7、SCLK->PB3和Din->PB4)

        做了个宏定义:

        

    2.按照时序逻辑编写:写寄存器函数(先写工作模式,后写数据)

    到这里就结束了。今天新人第一次发帖,有什么错误及不足还望大伙指点赐教。

    同时我也会继续努力(所爱隔山海,山海亦可平)!

    谢谢~

     

    展开全文
  • 工业级质量的高速视频DAC GM7123是一款频率330MHz的3通道10位高速视频DAC芯片,兼容RS-343A/RS-170标准差分输出,输出电流范围是2mA~26mA。输入兼容3.3V TTL电平,内部基准1.23V,单电源3.3V供电。时钟50MHz时,...
  • AD8600是包含16个可各自独立寻址的电压输出型D/A转换器芯片,这些DAC共用一个外部基准输入电压,但每一个DAC都具有各自的DAC寄存器和输入寄存器,以实现双缓冲功能。
  • 自己搜集整理的DAC选型手册,各种精度,接口还有供电的DAC芯片
  • FPGA与某个DAC芯片的SPI配置

    千次阅读 2019-11-19 23:29:55
    //FPGA做主机,DAC芯片做从机,实现SPI接口的配置(SPI串行外设接口) //该DAC芯片的SPI配置的寄存器是8位的 //第7位是读写选择信号,读信号高有效,写信号低有效 //第6位和第5位是读写几个BYTE的定义,00(1个...
    //FPGA做主机,数模转换器(DAC)芯片做从机,实现SPI接口的配置(SPI串行外设接口)
    //该DAC芯片的SPI配置的寄存器是8位的
    //7位是读写选择信号,读信号高有效,写信号低有效
    //6位和第5位是读写几个BYTE的定义,001BYTE);012BYTE);103BYTE);114BYTE//4~0位,是要操作的目标寄存器的地址
    module 	spi_crl(
    		input	wire sclk,//系统时钟50MHz,使用该时钟做全局时钟
    		input 	wire rst_n,//复位信号
    		input 	wire work_en,//模块工作的使能端
    		output 	reg  conf_end,//配置结束的标志
    		output 	wire spi_clk,//SPI的时钟,一般是50MHz到60MHz,
    		output 	wire spi_sdi,//SPI的输入数据(由从机输出到主机)
    		output 	wire spi_csn,//SPI的片选信号,低有效
    		input 	wire spi_sdo//SPI的输出(由主机输出到从机),暂时不进行考虑,不使用
    );
    //将sclk与spi_sdo的中心对齐,是建立时间和保持时间达到最大,有充足的裕量,确保满足建立时间和保持时间。
    
    //采用状态机来描述
    parameter IDLE 	= 5'b00001;//空闲状态
    parameter WAIT 	= 5'b00010;//等待状态,为了区分两次命令,
    parameter R_MEM	= 5'b00100;//读memory变量的值
    parameter W_REG	= 5'b01000;//写数据到寄存器中,命令8个byte,数据8个byte
    parameter STOP 	= 5'b10000;//停止状态
    parameter H_DIV_CYC = 5'd25-1;//定义一个分频的系数
    
    //实现过程中涉及到的一些寄存器
    reg [4:0] state;//状态机的寄存器变量,采用独热码
    reg [4:0] div_cnt;//用来分频的计数器
    reg clk_p;//正向时钟,与分频后的时钟有关,也有一个180°的相位
    wire clk_n;//反向时钟,也就是clk_p的反向,即没有相位的改变,这个才是SPI的时钟。
    reg pose_flag;//上升沿的标志位,用于分频同步
    reg [3:0] wait_cnt;//等待时间的计数器,产生等待时间。
    reg [3:0] shift_cnt;//数据结束的计时,也就是数据接收完后进入下一个状态
    reg [4:0] r_addr;//读地址
    wire [15:0] r_data;//读的数据
    wire wren;//写使能信号
    reg [15:0] shift_buf;
    //定义一个串行数据的缓存器,即shift_buf,是在读完数据后(R_MEM状态后)进行缓存,但是在W_REG状态时才完成赋,因为有一个时钟的延时。
    reg data_end;//32位数据写入结束的标志
    reg sdi;//用来给spi_sdi赋值
    reg csn;//用来给spi_csn赋值
    reg tclk;//用来给spi_clk赋值
    
    //以下是实现的过程
    
    //分频器的实现,分频为1M的时钟;
    always @(posedge sclk or negedge rst_n)
    	if(rst_n == 1'b0)
    		div_cnt <= 5'd0;
    	else if(div_cnt == H_DIV_CYC)
    		div_cnt <= 5'd0;
    	else 
    		div_cnt <= div_cnt + 1'b1;
    		
    //clk_p的产生,即一个方波,
    //分频时钟不允许做及寄存器的触发时钟,也就是不能出现在always块的触发列表中
    always @(posedge sclk or negedge rst_n)
    	if(rst_n == 1'b0)
    		clk_p <= 1'b0;
    	else if(div_cnt == H_DIV_CYC)
    		clk_p <= ~clk_p;
    //时钟取反得到SPI的时钟
    //这里解释取反的原因,因为在sclk的上升沿时钟有效,即可以认为sclk的0时刻是一个上升沿,但是clk_p的上升沿是在计数到24后也就是25个时钟后的地方,与sclk的上升沿没有对齐,根据波形可以知道,取反后,即clk_n=~clk_p,实现了sclk和spi_clk的同步。
    assign clk_n = ~clk_p;		
    
    //上升沿的标志位的产生,用于分频同步
    always @(posedge sclk or negedge rst_n)
    	if(rst_n == 1'b0)
    		pose_flag <= 1'b0;
    	else if(clk_p == 1'b0 && div_cnt == H_DIV_CYC)//在计数器计到24,而且clk_p=1,时拉高
    		pose_flag <= 1'b1;
    	else 
    		pose_flag <= 1'b0;
    
    //等待时间的产生
    always @(posedge sclk or negedge rst_n)
    	if(rst_n == 1'b0)
    		wait_cnt <= 4'b0;
    	else if(state == WAIT && pose_flag == 1'b1)//要按时钟来计数,
    		wait_cnt <= wait_cnt + 1'b1;
    	else if(state != WAIT)//只有在等待状态时才计数
    		wait_cnt <= 4'b0;	
    		
    //状态机的描述		
    always @(posedge sclk or negedge rst_n)
    	if(rst_n == 1'b0)
    		state <= IDLE;
    	else case(state)
    			IDLE:if(work_en == 1'b1)
    					state <= WAIT;
    			WAIT:if(wait_cnt[3] == 1'b1)//等待了8个spi_clk的时间
    					state <= R_MEM;
    			R_MEM:state <= W_REG;//这里不需要等待,读出来后就可以写入数据
    			W_REG:if(shift_cnt == 4'd15 && pose_flag == 1'b1 && data_end != 1'b1)
    				  state <= WAIT;
    				  else if(shift_cnt == 4'd15 && pose_flag == 1'b1 && data_end == 1'b1)
    				  state <= STOP;
    			STOP: state <= STOP;
    			default: state <= IDLE;
    		 endcase 
    
    //shift_cnt的定义,也就是每一条命令的时间
    always @(posedge sclk or negedge rst_n)
        if(rst_n == 1'b0)
    			shift_cnt <= 4'b0;
    	 else if(state == W_REG && pose_flag == 1'b1)
    			shift_cnt <= shift_cnt + 1'b1;
    	 else if(state != W_REG)//不在写寄存器状态时直接不使用该计数器
    			shift_cnt <= 4'b0;
    
    //读memory的地址的产生
    always @(posedge sclk or negedge rst_n)
    	  if(rst_n == 1'b0)
    			r_addr <=5'b0;
    	  else if(state == R_MEM)
    			r_addr <= r_addr + 1'b1;
    assign wren = 1'b0;	//这里使用的RAM只读不写,所以赋值为1,让写使能无效	
    
    //shift_buf的值赋值,
    always @(posedge sclk or negedge rst_n)
    	 if(rst_n == 1'b0)
    			shift_buf <= 5'b0;
    	 else if(state == R_MEM)//将RAM中读取的数据赋值给shift_buf
    			shift_buf <= r_data;
    	 else if(state == W_REG && pose_flag == 1'b1)
    			shift_buf <= {shift_buf[14:0],1'b1};
    
    //data_end的产生,最后一个需要移位的数据
    always @(posedge sclk or negedge rst_n)			
    	 if(rst_n == 1'b0)
    			data_end <= 1'b0;
    	 else if(state == R_MEM && (&r_addr) == 1'b1)//地址从00000~11111,即取完了所有的数据,等效于r_addr==5'd31;
    			data_end <= 1'b1;
    
    //数据的输出
    always @(posedge sclk or negedge rst_n)	
    	 if(rst_n == 1'b0)
    			sdi <= 1'b0;
    	 else if(state == W_REG)
    			sdi <= shift_buf[15];//将RAM中的数据的读取出来后赋值给寄存器再进行写入
        else if(state != W_REG)
    			sdi <= 1'b0;
    			
    //片选信号的生成,低有效
    always @(posedge sclk or negedge rst_n)
    	 if(rst_n == 1'b0)
    			csn <= 1'b1;//低有效,所以初始化位1,无效的状态
    	 else if(state == W_REG)
    			csn <= 1'b0;
    	 else 
    			csn <= 1'b1;
    
    //spi_clk的产生,即tclk,在不工作的时候是低电平
    always @(posedge sclk or negedge rst_n)
    	 if(rst_n == 1'b0)
    			tclk <= 1'b0;
    	 else if(state == W_REG)
    	       tclk <= clk_n;
    	 else 
    			 tclk <= 1'b0;
    
    //配置结束标志的产生
    always @(posedge sclk or negedge rst_n)
    	 if(rst_n == 1'b0)	 
    			conf_end <= 1'b0;
    	 else if(state == STOP)
    			conf_end <= 1'b1;
    	 
    //进行连线
    assign spi_clk = tclk;
    assign spi_sdi = sdi;
    assign spi_csn = csn;
    
    //例化一个RAM,用来读取数据
    ram_16x32_sr	ram_16x32_sr_inst (
    	.address ( r_addr ),//读地址
    	.clock ( sclk ),
    	.data ( 16'd0 ),//写的数据
    	.wren ( wren ),//写使能高有效,读使能低有效
    	.q ( r_data )//读数据
    	);
    endmodule
    
    `timescale 1ns/1ns
    module tb_ex_spi;
    reg sclk;
    reg rst_n;
    reg work_en;
    wire spi_clk;
    wire spi_sdi;
    wire spi_csn;
    reg [15:0] send_mem [31:0];//定义一个memory变量
    reg [15:0] shift_buf;
    
    wire spi_sdo;
    wire  conf_end;
    
    
    initial begin 
    		rst_n=0;
    		sclk=0;
    		#100;
    		rst_n=1;
    		end
    		
    initial begin 
    		work_en=0;
    	   #150;
    	   work_en=1;
    	   end
    
    initial begin
    		$readmemb("dac_ini_16x32.mif",send_mem);//memory变量的初始化
    		end 
    	
    initial begin
    		rec_spi();
    		end 
    		
    always #10 sclk=~sclk;
    
    spi_crl spi_crl_inst(
    		.sclk		(sclk)		,
    		.rst_n		(rst_n)		,
    		.work_en	(work_en)	,
    		.conf_end	()		,
    		.spi_clk	(spi_clk)		,
    		.spi_sdi	(spi_sdi)		,
    		.spi_csn	(spi_csn)		,
    		.spi_sdo	()	//读输入管脚不进行配置
    );
    
    //定义一个任务,用于接收数据,验证写入的数据是否为读取到的数据
    task rec_spi();
    		integer i,j;
    		begin 
    			for(i=0;i<32;i=i+1)
    				begin
    					for(j=0;j<16;j=j+1)
    						begin
    							@(posedge spi_clk);
    								shift_buf={shift_buf[14:0],spi_sdi};
    							if(j == 15 && shift_buf == send_mem[i])
    								$display("ok data index is %d rec_d=%b send_d=%b",i,shift_buf,send_mem[i]);
    							else if(j == 15)
    								$display("error");		
    						end
    				end
    		end 
    		
    endtask
    endmodule 
    
    quit -sim
    .main clear
    
    vlib work
    vmap work work
    
    vlog -work work tb_ex_spi.v
    vlog ./../design/spi_ctrl.v
    vlog ./../quartus_prj/ipcore_dir/ram_16x32_sr.v
    vlog ./altera_lib/*.v
    
    vsim -voptargs=+acc work.tb_ex_spi
    
    add wave  tb_ex_spi/spi_crl_inst/*
    add wave  tb_ex_spi/rec_spi/*
    
    run 300us
    
    memory的数据
    0000000001110000
    0000000100110001
    0000001000000000
    0000001100010000
    0000010011111111
    0000010100000000
    0000011000000000
    0000011100000000
    0000100000000000
    0000100101010101
    0000101010101010
    0000101101010101
    0000110010101010
    0000110101010101
    0000000000000000
    0000111101010101
    0001000010101010
    0001000100100100
    0001000100000010
    0001001111000010
    0001010000000000
    0001010100000000
    0001011000000000
    0001011100000100
    0001100010000011
    0001100100000000
    0001101000000000
    0001101100000000
    0001110000000000
    0001110100000000
    0001111000100100
    0001111101010010
    
    RAM的初始化文件,用.mif文件。
    -- Copyright (C) 1991-2013 Altera Corporation
    -- Your use of Altera Corporation's design tools, logic functions 
    -- and other software and tools, and its AMPP partner logic 
    -- functions, and any output files from any of the foregoing 
    -- (including device programming or simulation files), and any 
    -- associated documentation or information are expressly subject 
    -- to the terms and conditions of the Altera Program License 
    -- Subscription Agreement, Altera MegaCore Function License 
    -- Agreement, or other applicable license agreement, including, 
    -- without limitation, that your use is for the sole purpose of 
    -- programming logic devices manufactured by Altera and sold by 
    -- Altera or its authorized distributors.  Please refer to the 
    -- applicable agreement for further details.
    
    -- Quartus II generated Memory Initialization File (.mif)
    
    WIDTH=16;
    DEPTH=32;
    
    ADDRESS_RADIX=UNS;
    DATA_RADIX=BIN;
    
    CONTENT BEGIN
    	0   :   0000000001110000;
    	1   :   0000000100110001;
        2   :   0000001000000000;
    	3   :   0000001100010000;
    	4   :   0000010011111111;
    	5   :   0000010100000000;
    	6   :   0000011000000000;
        7   :   0000011100000000;
    	8   :   0000100000000000;
    	9   :   0000100101010101;
        10  :   0000101010101010;
    	11  :   0000101101010101;
        12  :   0000110010101010;
    	13  :   0000110101010101;
    	14  :   0000000000000000;
    	15  :   0000111101010101;
    	16  :   0001000010101010;
        17  :   0001000100100100;
    	18  :   0001000100000010;
    	19  :   0001001111000010;
    	20  :   0001010000000000;
    	21  :   0001010100000000;
        22  :   0001011000000000;
    	23  :   0001011100000100;
    	24  :   0001100010000011;
    	25  :   0001100100000000;
    	26  :   0001101000000000;
        27  :   0001101100000000;
    	28  :   0001110000000000;
    	29  :   0001110100000000;
    	30  :   0001111000100100;
    	31  :   0001111101010010;
    END;
    

    寄存器的配置
    在这里插入图片描述在这里插入图片描述状态转移图:
    在这里插入图片描述modelsim仿真结果:
    在这里插入图片描述

    展开全文
  • ML2611 2006年12月20日,东京 -- 冲电气工业株式会社(以下简称OKI)报道,即日起开始提供内置了3D环绕功能和立体声扬声放大器的单芯片音频DAC(Digital to Analog Converter:数模转换器)「ML2611」的样片供货。...
  • 背景 AD9144是一款支持jesd204b协议高速DAC芯片。AD9144-FMC-EBZ是基于AD9144的评估板(Evaluation Board),它是主要由AD91...

    背景

            AD9144是一款支持jesd204b协议高速DAC芯片。AD9144-FMC-EBZ是基于AD9144的评估板(Evaluation Board),它是主要由AD9144,AD9516,与PIC16F单片机组成的系统。工程上使用AD9144具有时钟时序要求很高和寄存器配置复杂的难点。

    配置AD9144-FMC-EBZ,有两种途径:

    1、通过FPGA母板,经由FMC接口,使用SPI配置寄存器

    2、通过ADI提供的软件工具,配合母板(ADS7)来配置寄存器,如图所示:

    官方的指导说明链接:https://wiki.analog.com/resources/eval/dpg/ad9144-fmc-ebz

    遇到问题:

    我们在尝试第一种方法的时候,遇到了SPI寄存器写不进的情况和读写不一致的情况。而第二种方法则需要ADS7用作母板。

    调试

           完成了以KC705作为母板,正确配置AD9144,并输出62.5MHz正弦波。

    整个流程需要先在KC705上运行提供的HDL工程,随后进入软件工具配置流程。这里的HDL工程主要完成的是:Jesd204发送端的配置与正弦余弦信号的输出。另外,这里的软件工具配置流程既使用ADI官方提供的工具对AD9144和AD9516分别进行配置。

    在调试开始前,硬件链接如下图所示:

    1、AD9516寄存器配置获得

    AD9516的作用是对输入时钟分频,为AD9144分别提供:sysref(3.91M),和refclk(125M)。

    这里使用了AD9516-Evaluation-Software完成配置。软件下载链接:

    https://www.analog.com/en/design-center/evaluation-hardware-and-software/evaluation-boards-kits/eval-ad9516-4.html#eb-relatedsoftware

    在安装结束后,打开软件并选择正确的型号,这里选AD9516-1

    分别按下图所示进行配置:输入时钟(来自KC705)设置为2500;分频系数如图设置:最后得到两组频率为120M和3.9063M的时钟;点击左下角的橙色框(RGISTER W/R)中的WRITE。

    点击“file”,点击“Save Setup”,导出“stp”文件,如下图所示。

    打开导出的.stp文件,如图:这个文件记录了寄存器地址与对应的值,将于后续步骤导入。

    2、AD9144&AD9516寄存器配置:

    A、首先到AD公司官网搜索DAC Software Suite和Analysis Control Evaluation软件,下载并安装;

    B、打开已经安装好的ACE软件,界面如下图所示。在硬件连接正确的情况下,图中红圈会检测到所连接的硬件板卡,点击图中绿圈的LED状按钮,AD9144-FMC-EBZ板卡上的蓝色LED灯会随之闪烁,说明连接成功。

    C、双击打开“AD9144-FMC-EBZ”板卡。在“initial configuration”界面中按如图所示进行设置,点击“summary”并“apply”,双击右侧红色图框中的AD9144芯片。

    D、在打开的界面中按图中配置设置DAC calibration,选择“DAC3 DAC2”并点击“calibrate”。

    E、点击上图右下角的“Proceed to memory map”,按照项目所需配置好AD9144相关的寄存器表的值,点击右上apply selected将对应的寄存器值写入AD9144芯片。

    F、在电脑开始菜单>Analog Devices寻找“AD9144&AD9135&AD9136 SPI”并打开,软件界面如图所示:

    G、在上方框中点击“read all registers”,然后点击“save registers to file”得到“.csv”文件,右键将其用记事本打开,如图所示,找到AD9516芯片开头的寄存器区域,将之前通过AD9516 Evaluation Software得到的stp文件中的寄存器值添加进.csv文件中并保存。

    如图所示,第一列是AD9144/AD9516的芯片,第二列是对应芯片的寄存器地址,第三列是寄存器对应的值,将AD9516所有寄存器的值添加进来并保存。

    H、打开“AD9144&AD9135&AD9136 SPI”软件并选择“restore registers from file”,将上一步中修改保存好的.csv文件导入。

    I、将vivado中的工程bit流文件烧录到板子上,通过ila抓取并观察tx_sync信号,发现信号持续拉高,返回AD9144&AD9135&AD9136 SPI软件read all registers,观察如图区域,如果图中所示四个寄存器值都为0F,vivado tx_sync持续拉高,并且txdata有数值输出,则说明AD9144与JESD204B同步成功,此时用示波器测量AD9144板卡输出可观测到波形输出。

    调试过程中遭遇问题

    1.SPI配置失败问题?

    2.AXI-Lite的参数设置?

    通过在Analysis Control Evaluation软件中读取AD9144寄存器表值,查询0x453-0x45A寄存器值,得到关键参数L,SCR,F,K,M,N,N’,S,CF,HD等的值。

    通过文档PG066 P27-P28中所示的值,计算出AXI协议所需要的每个寄存器地址的值。填入到vivado工程模块中的AXI协议部分。

    Vivado工程中的AXI协议部分:地址填入PG066 P27-P28中的寄存器地址,值填入更据关键参数算出来的值。

    文章转自:http://fpgabbs.com/thread-886-1-1.html

    版权归原作者所有


    点击下方图片查看一封信

    感谢您的支持和理解,祝您全家幸福,身体健康,万事如意,心想事成。

    推荐阅读

    AXI总线详解

    AXI总线详解-总线、接口以及协议

    AXI接口协议详解-AXI总线、接口、协议

    AXI协议中的通道结构

    AXI总线详解-AXI4读写操作时序及AXI4猝发地址及选择

    高级FPGA设计技巧!多时钟域和异步信号处理解决方案

    AXI总线详解-AXI4交换机制

    计算机基础知识总结与操作系统.PDF

    IC技术圈期刊 2020年第09期

    ZYNQ中DMA与AXI4总线-DMA简介
    AXI总线详解-不同类型的DMA

    不了解FPGA工作原理?看看世界第一颗FPGA芯片级拆解

    几种应用DMA的典型应用

    AXI_lite代码简解-查看源码

    AXI_lite代码简解-AXI-Lite 源码分析

    AXI-Lite 自定义IP
    观察 AXI4-Lite 总线信号

    AXI-Stream代码详解
     

    点击上方字体即可跳转阅读哟

    点个在看你最好看

    展开全文
  • ad5422 DAC芯片驱动程序

    2019-06-27 22:35:25
    实现了AD5422初始化各种模式,设置电流输出、电压输出功能。
  • 音频DAC芯片wm9081数据手册(网上难找)
  • 因课题需求 所以选择了多通道的外置DAC芯片——LTC2600 LTC2600介绍 英文芯片手册 添加链接描述 中文芯片手册 添加链接描述 LTC2600是AD公司的八通道16位DAC,体积小,分辨率高,使用SPI驱动方式编程控制 引脚功能...

    因课题需求 所以选择了多通道的外置DAC芯片——LTC2600

    1. LTC2600介绍
      英文芯片手册
      添加链接描述
      中文芯片手册
      添加链接描述
      LTC2600是AD公司的八通道16位DAC,体积小,分辨率高,使用SPI驱动方式编程控制
      引脚功能:
      在这里插入图片描述
      时序图
      在这里插入图片描述
      我用的是GPIO端口模拟SPI通讯

    2. STM32CubeMX
      在这里插入图片描述

    3. 代码部分

    #include "main.h"
    
    void SystemClock_Config(void);
    static void MX_GPIO_Init(void);
    void SendDA_LTC2600(uint8_t channel,uint16_t data);
    
    int main(void)
    {
      HAL_Init();
    
      SystemClock_Config();
    
      MX_GPIO_Init();
      
      SendDA_LTC2600(0x00,0x0fff);
      while (1)
      {
       
      }
    
    }
    //向LTC2600写入数据
    void SendDA_LTC2600(uint8_t channel,uint16_t data)
    {
    	uint32_t xkdata=0,i;
    	xkdata|=0x03<<20;//命令位c1和c0写为1:写至输入寄存器n,更新所有寄存器
    	xkdata|=(channel&0x0f)<<16;//通道地址
    	xkdata|=data&0xffff;//防止data数据过大,最大支持16bit
    	xkdata<<=8;//数据左移8位,低八位为空
    	CS_0;//片选(引脚7),片选为低时,sck被使能,数据转移至寄存器
    	HAL_Delay(200);
    	for(i=0;i<24;i++)
    	{	
    		SCK_0;//关时钟
    		if(xkdata&0x80000000)//对xkdat的31位到8位按位与
    		{ 
    			SDI_1;//如果为1,则SDI高电平
    		}
    		else
    		{
    			SDI_0;//如果为0,则SDI低电平
    		}
    		SCK_1;//开时钟
    		xkdata<<=1;		
    	}
    	CS_1;//片选拉高,sck禁能,执行规定的命令
    }
    
    /**
      * @brief System Clock Configuration
      * @retval None
      */
    void SystemClock_Config(void)
    {
      RCC_OscInitTypeDef RCC_OscInitStruct = {0};
      RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    
      /** Configure the main internal regulator output voltage 
      */
      __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
      /** Initializes the CPU, AHB and APB busses clocks 
      */
      RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
      RCC_OscInitStruct.HSIState = RCC_HSI_ON;
      RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
      RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
      if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
      {
        Error_Handler();
      }
      /** Initializes the CPU, AHB and APB busses clocks 
      */
      RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                  |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
      RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
      RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
      RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
      RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
    
      if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
      {
        Error_Handler();
      }
    }
    
    /**
      * @brief GPIO Initialization Function
      * @param None
      * @retval None
      */
    static void MX_GPIO_Init(void)
    {
      GPIO_InitTypeDef GPIO_InitStruct = {0};
    
      /* GPIO Ports Clock Enable */
      __HAL_RCC_GPIOH_CLK_ENABLE();
      __HAL_RCC_GPIOC_CLK_ENABLE();
      __HAL_RCC_GPIOA_CLK_ENABLE();
    
      /*Configure GPIO pin Output Level */
      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_RESET);
    
      /*Configure GPIO pin Output Level */
      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_SET);
    
      /*Configure GPIO pin Output Level */
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET);
    
      /*Configure GPIO pins : PC2 PC3 */
      GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
      HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
    
      /*Configure GPIO pin : PA12 */
      GPIO_InitStruct.Pin = GPIO_PIN_12;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
      HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
    }
    
    

    设定芯片的参考电压为2.5V,用电压表测得LTC2600 A通道引脚电压为0.15V,与设定值相符

    欢迎大家批评指正和交流啊~

    展开全文
  • 这个芯片资料非常简单,单纯看pdf文档很难选择出正确的地址。 在官方技术讨论区正好看到有这个地址的询问,特此记录下。 Question for connecting DAC101C081 with MSP430F5172 I recently met a problem. I ...
  • 基于ADI公司的AD9144高速DAC芯片原理,可以对数字基带信号进行插值滤波然后使用NCO(numbericallycontrolledoscillator)进行正交上变频。 关于ADC的可以参考数字正交下变频与数字滤波抽取的仿真与实验----基于高速...
  • 使用FPGA芯片控制DAC采集芯片,输出指定的电压值。 二、硬件部分 为了将FPGA输出的数字电压转换成模拟电压,我们使用到了数模转换芯片(简称DAC)TLV5618。进行设计前,我们先到网上检索并查看了该芯片的数据手册。 1....
  • 数据采集向高精度和高速度两个方向发展。高精度数据采集依赖于A/D器件的精度,高速度数据采集不仅...
  • 推荐低成本高性能两路16位DAC(数模转换)芯片TM8211(PT8211、TDA1311) 一、概述: TM8211是两路16位数模转换集成电路,可广泛应用于数字音频、多媒体系统。 芯片采用CMOS工艺设计,内部电路结构基于R-2R电阻...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,632
精华内容 3,452
关键字:

dac芯片