ad5676驱动详解及代码

AD5676为单片8通道DAC,一下驱动代码是用的模拟SPI去写的,芯片型号STM32F103C8xx,亲测是可以用的,输出比较稳定,废话不多说,直接上代码:

首先头文件:

#define GPIO_PORT_SPI1_SCK	GPIOB
#define GPIO_PIN_SPI1_SCK	GPIO_Pin_3

#define GPIO_PORT_SPI1_MISO	GPIOB
#define GPIO_PIN_SPI1_MISO	GPIO_Pin_4

#define GPIO_PORT_SPI1_MOSI	GPIOB
#define GPIO_PIN_SPI1_MOSI	GPIO_Pin_5

#define GPIO_PORT_LDAC		GPIOA
#define GPIO_PIN_LDAC		GPIO_Pin_8

#define SPI1_SCK_HIGH   GPIO_SetBits(GPIO_PORT_SPI1_SCK,GPIO_PIN_SPI1_SCK)
#define SPI1_SCK_LOW  GPIO_ResetBits(GPIO_PORT_SPI1_SCK,GPIO_PIN_SPI1_SCK)

#define SPI1_MOSI_HIGH   GPIO_SetBits(GPIO_PORT_SPI1_MOSI,GPIO_PIN_SPI1_MOSI)
#define SPI1_MOSI_LOW  GPIO_ResetBits(GPIO_PORT_SPI1_MOSI,GPIO_PIN_SPI1_MOSI)

#define SPI1_CS1_HIGH	GPIO_SetBits(GPIO_PORT_SPI1_CS1,GPIO_PIN_SPI1_CS1)
#define SPI1_CS1_LOW	GPIO_ResetBits(GPIO_PORT_SPI1_CS1,GPIO_PIN_SPI1_CS1)

#define SPI1_CS2_HIGH	GPIO_SetBits(GPIO_PORT_SPI1_CS2,GPIO_PIN_SPI1_CS2)
#define SPI1_CS2_LOW	GPIO_ResetBits(GPIO_PORT_SPI1_CS2,GPIO_PIN_SPI1_CS2)

#define SPI1_CS3_HIGH	GPIO_SetBits(GPIO_PORT_SPI1_CS3,GPIO_PIN_SPI1_CS3)
#define SPI1_CS3_LOW	GPIO_ResetBits(GPIO_PORT_SPI1_CS3,GPIO_PIN_SPI1_CS3)

以下为命令(实际用到的命令是3)
在这里插入图片描述
C文件代码:

void spiwrite(rt_uint8_t data)
{
	rt_uint8_t i;

	SPI1_SCK_LOW;
	delay_us(10);

	for(i=0;i<8;i++){
		SPI1_SCK_HIGH;
		
		if(0x80&data){
			SPI1_MOSI_HIGH;
		}else{
			SPI1_MOSI_LOW;
		}

		data<<=1;
		
		delay_us(10);
		SPI1_SCK_LOW;
		delay_us(10);
	}

	SPI1_SCK_LOW;
	delay_us(10);
}

//说明:p1为通道选择  p2为输出的电压(ad值)
//我用的是spi驱动3片ad5676 setDacs(p1,1);这个函数是选择cs引脚使能的,三片公用mosi 和sck,ldac,我没有用到miso引脚,可以同时写24路然后再使能ldac可以同时输出24路,没有时间差
static int ad5676_handle(int p1,int p2,void *para)
{
	rt_uint8_t i;
	rt_uint8_t buf[3];

	buf[0] = 3<<4;
	buf[0] |= p1%8;
	buf[1] = (rt_uint8_t)(p2>>8);
	buf[2] = (rt_uint8_t)p2;

	setDacs(p1,1);
	 delay_us(10);
	 
	 //GPIO_ResetBits(GPIOB,GPIO_Pin_6);
	 //GPIO_ResetBits(GPIOA,GPIO_Pin_15);
	 setDacs(p1,0);
	 delay_us(10);

	 for(i=0;i<3;i++){
		spiwrite(buf[i]);
	 }

	 setDacs(p1,1);
	
	
	return 0;
}

驱动相对来说比较简单,对于会看芯片时序的兄弟来讲小菜一碟,写这个驱动也是为小白提供一些参考,如果使用库函数spi相对来说简单点,配置好spi就行了,我还是习惯硬件spi,我认为硬件spi比较稳定,会少很多多余的操作,个人见解不喜勿喷,欢迎交流心得

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
AD5676是一款16位的DAC芯片,它可以通过SPI接口与FPGA进行通信。下面是一个简单的FPGA驱动代码的示例: ```verilog // AD5676 DAC模块 module DAC_AD5676( input CLK, // FPGA时钟 input RST, // 复位信号 input [15:0] DAC_DATA, // 要输出的DAC数据 output CS, // 芯片选择信号 output SCLK, // 时钟信号 output SDIN // 数据信号 ); reg [15:0] data_reg; // 数据寄存器 assign CS = 1'b0; // 片选信号低电平有效 assign SCLK = 1'b0; // 时钟信号低电平有效 assign SDIN = data_reg[15]; // 数据信号为数据寄存器的最高位 always @(posedge CLK) begin if (RST) begin // 复位信号为高电平有效 data_reg <= 16'h0000; // 复位数据寄存器 end else begin data_reg <= DAC_DATA; // 将要输出的DAC数据写入数据寄存器 end end endmodule ``` 在使用这个模块时,需要定义一个SPI接口,具体的实现方式与FPGA型号和开发工具有关。例如在Xilinx FPGA中,可以使用IP核生成SPI接口并进行配置。 ```verilog // SPI接口模块 module spi_interface( input CLK, // 时钟信号 output [15:0] MOSI, // 主设备输出数据线 input [15:0] MISO, // 主设备输入数据线 output SS, // 片选信号 output SCLK // 时钟信号 ); // 使用FPGA的SPI IP核生成的代码 endmodule ``` 在主模块中,可以将DAC_AD5676模块和SPI接口模块组合起来,通过SPI接口向AD5676芯片发送数据。 ```verilog // 主模块 module top_module( input CLK, // FPGA时钟 input RST, // 复位信号 input [15:0] DAC_DATA, // 要输出的DAC数据 output CS, // 芯片选择信号 output [15:0] MOSI, // 主设备输出数据线 input [15:0] MISO, // 主设备输入数据线 output SCLK // 时钟信号 ); spi_interface spi(.CLK(CLK), .MOSI(MOSI), .MISO(MISO), .SS(CS), .SCLK(SCLK)); DAC_AD5676 dac(.CLK(CLK), .RST(RST), .DAC_DATA(DAC_DATA), .CS(CS), .SCLK(SCLK), .SDIN(MOSI[15])); endmodule ``` 以上代码仅供参考,具体的实现方式取决于FPGA型号和开发工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式小龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值