您当前的位置: 首页 > 

9527华安

暂无认证

  • 1浏览

    0关注

    35博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

小小白对SPI的理解,基于米联客例程的FPGA实现

9527华安 发布时间:2021-12-23 22:52:34 ,浏览量:1

SPI协议,大佬们讲得很多,但总感觉没有讲到小白的痛处,比如:极性和相位 极性指的是空闲状态下时钟的电平状态,这个很好理解,verilog代码也很好实现, 比如,极性为0,表示空闲状态下时钟的电平为低,verilog代码只需要将时钟寄存器的初始值设为0即可,反之亦然; 相位为0,表示在数据在时钟的第一个跳变沿被采集,啥意思?小白在这里就懵了,更别说写代码了, 以极性为0举例,假设极性为0,相位为0,那么,数据将在spi时钟的第一个跳变沿被采集,换言之,数据将在spi时钟的上升沿被采集,代码如何实现? 假设我要写一个主机,要实现数据将在spi时钟的上升沿被采集,那么,主机就必须让需要发出的数据在spi时钟的下降沿改变,为何? 你想啊,从机需要在spi时钟的上升沿采集数据,那么,数据线上的数据在spi时钟的上升沿到来之前肯定得稳定才行吧?如何做到?很简单,知己下降发送数据,从机上升沿采集数据嘛,这样一来,不久完美解决? 参考米联客的SPI例程,写得还是挺好的,我稍加了修改。 由于SPI接收比较简单,代码就不放出来了,这里介绍一下SPI接收模块的代码

module master_spi_tx#
(
    parameter SYS_CLK = 50_000_000,	//我添加的,为了使用不同板子
	parameter SPI_CLK = 100_000,    //我添加的,为了使用不同板子
	parameter CPOL = 1'b0,
    parameter CPHA = 1'b0
)
(
	input clk_i,
	output spi_tx_o,//mosi
	output spi_clk_o,//SPI 时钟输出SCK
	input  spi_tx_en_i,//发送发送使能信号
	input [7:0] spi_tx_data_i,//待发送数据
	//output spi_en_o,//SPI 传输使能
	output spi_cs_o, //这是我添加的,为了适应操作FLASH
	output spi_busy_o//SPI正在传输,高代表忙
);


//SPI时钟分频单元

//parameter [9:0] SPI_DIV     = 10'd499;//分频 假设(50Mhz/100K/ - 1'b1=499
parameter SPI_DIV  = SYS_CLK/SPI_CLK - 1;
parameter SPI_DIV1 = SPI_DIV/2;
parameter PSET     = CPHA ? 1'b1 : 1'b0;

reg [9:0] clk_div = 10'd0;	
reg spi_en = 1'b0;	//标志spi正在传输一个字节数据

always@(posedge clk_i)begin
    if((clk_div             
关注
打赏
1659431378
查看更多评论
0.0350s