AD5641为2.7V---5.5V供电,14位内部数字寄存器;输出模拟信号可达rail_to_rail,在+5V供电的情况下,其输出范围为-5V---+5V。AD5641管脚及功能说明见下表。
表1 AD5641管脚及功能说明
信号名字 |
信号功能 |
SYNC |
帧同步信号(低电平有效),当SYNC变为低电平时,使能了内部的移位寄存器,在接下来的串行时钟的下降沿,将输入锁存入内部的移位寄存器。 |
SCLK |
串行时钟输入管脚,在其下降沿,将串行数据锁存入内部移位寄存器,时钟最高30Mhz。 |
DIN |
串行输入管脚。芯片内有16位移位寄存器,在串行时钟的下降沿将该管脚上的信号锁存进内部移位寄存器。 |
Vout |
模拟信号输出,其为rail_to_rail方式。 |
VDD |
电源信号,供电范围为2.7V~3.6V。 |
GND |
地信号。 |
AD5641的写时序图参见图1,具体时序参数见表2。
module spi_da(
clk,
rst,
data_par,
spi_syn,
spi_clk,
spi_simo);
input clk;//16Mhz系统时钟;
input rst;//低电平有效的复位信号;
input [15:0] data_par;//待发送的16位并行数据;
output reg spi_syn;
//SPI接口的同步信号,低电平有效;
output reg spi_clk;
//SPI接口的串行时钟,下降沿将数据写入DA的内部移位寄存器;
output reg spi_simo;
//SPI接口的串行输入数据;
reg [3:0] p_count;//上电后一直自加的计数器;
reg [3:0] wait_count;//等待状态的计数器;
reg [6:0] conv_count;//转换状态的计数器;
reg [15:0] data_reg;//锁存的16位寄存器;
parameter IDLE =3'b001;
parameter CONV =3'b010;
parameter WAIT =3'b100;
reg [2:0] cstate;
reg [2:0] nstate;
always @ (posedge clk or negedge rst)
if(rst==0)
p_count<=4'b0;
else
p_count<=p_count+1;
//上电后一直自加的计数器;
always @ (posedge clk or negedge rst)
if(rst==0)
wait_count<=4'b0;
else if(cstate==WAIT || nstate==WAIT)
wait_count<=wait_count+1;
else
wait_count<=4'b0;
//等待状态的计数器;
always @ (posedge clk or negedge rst)
if(rst==0)
conv_count<=7'b0;
else if(cstate==CONV || nstate==CONV)
conv_count<=conv_count+1;
else
conv_count<=7'b0;
//转换状态的计数器;
always @ (posedge clk or negedge rst)
if(rst==1'b0)
cstate<=IDLE;
else
cstate<=nstate;
//当前状态等于下一状态
always @ (cstate,p_count,conv_count,wait_count)
begin
nstate=IDLE;
case(cstate)
IDLE:
begin
if(p_count==4'hE)
nstate=WAIT;
else
nstate=IDLE;
end
WAIT:
begin
if(wait_count==4'hE)
nstate=CONV;
else
nstate=WAIT;
end
CONV:
begin
if(conv_count==7'd32)
nstate=WAIT;
else
nstate=CONV;
end
default:
begin
end
endcase
end
//产生下一状态
always @ (posedge clk or negedge rst)
begin
if(rst==1'b0)
begin
spi_syn<=1'b1;
spi_simo<=1'b0;
data_reg<=16'b0;
spi_clk<=1'b1;
end
else
begin
case(nstate)
IDLE:
begin
spi_syn<=1'b1;
spi_simo<=1'b0;
data_reg<=16'b0;
spi_clk<=1'b1;
end
WAIT:
begin
spi_syn<=1'b1;
spi_simo<=1'b0;
spi_clk<=1'b1;
if(wait_count==4'h6)
begin
data_reg<=data_par;
end
else
begin
data_reg<=data_reg;
end
end
CONV:
begin
spi_syn<=1'b0;
spi_simo<=data_reg[15];
if(conv_count==7'd0)
begin
spi_clk<=1'b1;
end
else
begin
spi_clk<=!spi_clk;
end
if(conv_count[0]==1'b1)
begin
data_reg<={data_reg[14:0],1'b0};
end
else
begin
data_reg<=data_reg;
end
end
default:
begin
spi_syn<=1'b1;
spi_simo<=1'b0;
data_reg<=data_reg;
spi_clk<=1'b1;
end
endcase
end
end
//输出SPI接口的3个信号:同步信号、串行时钟、串行数据。
endmodule
DA模块的仿真波形图见图3,波形图中发送的数据为55AA。
hot.summer_2010_438634915 2014-9-22 21:07
用户1779611 2014-9-22 11:43
支持博主出一套开发板。
hot.summer_2010_438634915 2014-9-10 06:26
用户1779611 2014-9-9 20:55
hot.summer_2010_438634915 2014-9-9 13:06
用户1779611 2014-9-8 06:26