- SPI 小白速度理解原理········
1 : 通讯原理。 (主从模式)
sclk : 作为spi的专用时钟传输.
mosi : 主机发送给从机的数据线.(单bit)
miso : 从机发送给主机的数据.
ssel : 主机选定器件信号. (一般高有效)
2 : 发送数据 (根据手册定义的 地址,命令,数据,)
这个是DAC3283芯片手册 (这个是数据)
3 : 代码编写 (代码里面没有根据手册定义) (只是简单的定义了测试数据)
代码很简单 ,易懂 (上升沿采集,下降沿输出) -.-只写了输入,没写输出嘻嘻
//spi 简单理解代码 .
module spi (
input wire clk,
input wire rst,
input wire spi_key, //开始信号
output reg spi_done, //一帧数据完成信号
output wire spi_cs,
output wire spi_clk,
output wire spi_sdi,
output wire spi_sdo
);
wire clk_n; //时钟P取反数据
reg [4:0] state; //状态
reg [4:0] cnt_1hmz; //计数25-1位
reg clk_p; //时钟p
reg clk_flag; //时钟P脉冲信号
reg [3:0] wait_cnt; //数据计数器
reg [4:0] cnt; //等待时间计数器
//*****************临时测试数据 具体发送协议查看芯片手册
reg [2:0] addr; //临时测试地址寄存器 7
reg [7:0] data; //临时测试数据寄存器 255
//*************************************************
// 数据 spi寄存器
reg cs;
reg sdo;
//****************
//**************状态机定义
parameter IDLE = 5'b0_0001, //开始
WAIT = 5'b0_0010, //等待
R_MEM = 5'b0_0100, //发送地址
W_REG = 5'b0_1000, //写进数据
STOP = 5'b1_0000; //停止
// 寄存器赋值
assign spi_cs = cs ;
assign spi_clk = clk_n;
assign spi_sdo = sdo ;
//****************************************************** 时间定义
always @ (posedge clk ) begin
if (rst)
cnt_1hmz <= 0;
else if (cnt_1hmz == 25-1)
cnt_1hmz <= 0;
else
cnt_1hmz <= cnt_1hmz + 1;
end
always @ (posedge clk ) begin
if (rst)
clk_p <= 0;
else if (cnt_1hmz == 25-1 && state == W_REG)
clk_p <= ~clk_p;
else if (state !=W_REG && cnt_1hmz == 25-1)
clk_p <= 0;
end
assign clk_n = !clk_p;
always @ (posedge clk) begin
if (rst)
clk_flag <= 0;
else if (cnt_1hmz == 25-1 && clk_p==0)
clk_flag <= 1;
else
clk_flag <= 0;
end
//****************************************************** 状态机
always @ (posedge clk) begin
if (rst)
begin
state <= IDLE;
sdo <= 0;
wait_cnt <= 0;
cnt <= 0;
data <= 0;
addr <= 0;
spi_done <= 0;
end
else
case (state)
IDLE : if (spi_key && clk_flag)
state <= WAIT;
else
state <= IDLE;
WAIT : if (cnt == 31-1 && clk_flag)
begin
state <= R_MEM;
cnt <= 0;
end
else
begin
state <= WAIT;
cnt <= cnt + 1;
end
R_MEM : if (clk_flag)
begin
state <= W_REG;
addr <= 2;
data <= 8'b1010_1100;
end
else
state <= R_MEM;
W_REG : if (clk_flag)
begin
wait_cnt <= wait_cnt + 1;
data <= {data[6:0],1'b1};
sdo <= data[7];
end
else if (wait_cnt == 8)
state <= STOP;
STOP : begin
state <= STOP;
spi_done <= 1;
end
default : ;
endcase
end
//***************************************cs使能开启
always @ (posedge clk ) begin
if (rst)
cs <= 0;
else if (state == W_REG && clk_flag)
cs <= 1;
else if (state == STOP && clk_flag)
cs <= 0;
end
endmodule
4 : 波形图显示
看带颜色的就可以了。。