FPGA实现的SPI协议(一)----SPI驱动

article/2025/8/26 21:31:28

写在前面

        SPI协议系列文章:

                FPGA实现的SPI协议(一)----SPI驱动

                FPGA实现的SPI协议(二)----基于SPI接口的FLASH芯片M25P16的使用


1、什么是SPI协议

        SPI(Serial Peripheral Interface,串行外围设备接口)通讯协议,是 Motorola 公司提出的一种同步串行接口技术,是一种高速、全双工、同步通信总线,在芯片中只占用四根管脚用来控制及数据传输,广泛用于 EEPROM、Flash、RTC(实时时钟)、ADC(数模转换 器)、DSP(数字信号处理器)以及数字信号解码器上,是常用的、重要的低速通讯协议之一。

        SPI 通讯协议的优点是支持全双工通信,通讯方式较为简单,且相对数据传输速率较快;缺点是没有指定的流控制,没有应答机制,在数据可靠性上有一定缺陷。

2、SPI协议详述

2.1、SPI协议物理层

        SPI 通讯设备的通讯模式是主从通讯模式,通讯双方有主从之分,根据从机设备的数量,SPI 通讯设备之间的连接方式可分为一主一从和一主多从。

         

        SPI总线传输只需要4根线就能完成,这四根线的作用分别如下:

  • SCK (Serial Clock):时钟信号线,用于同步通讯数据。由通讯主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不同
  • MOSI (Master Output, Slave Input):主设备输出/从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,数据方向由主机到从机
  • MISO (Master Input,Slave Output):主设备输入/从设备输出引脚。主机从这条信号线读入数据,从机的数据由这条信号线输出到主机,数据方向由从机到主机
  • CS (Chip Select):片选信号线。当有多个 SPI 从 设备与 SPI 主机相连时,设备的其它信号线 SCK、MOSI 及 MISO 同时并联到相同的 SPI 总线上,即无论有多少个从设备,都共同使用这 3 条总线;而每个从设备都有独立的片选信号线,即有多少个从设备,就有多少条片选信号线。相当于由SPI构成的通信系统中,通过CS片选信号来决定通信的从机设备是哪一台。通信期间低电平有效,表示对应从机被选中

2.2、SPI 协议层

        SPI总线传输一共有4种模式,这4种模式分别由时钟极性(CPOL,Clock Polarity)时钟相位(CPHA,Clock Phase)来定义,其中CPOL参数规定了SCK时钟信号空闲状态的电平,CPHA规定了数据是在SCK时钟的上升沿被采样还是下降沿被采样。

                SPI总线的极性--时钟极性

                        时钟极性决定SPI总线空闲时的时钟信号是高电平还是低电平。CPOL = 1:表示空闲时是高电平;CPOL = 0:表示空闲时是低电平。

                SPI总线的相位--时钟相位

                        时钟相位决定SPI总线从哪个跳变沿开始采样数据CPHA = 0:在时钟信号SCK的第1个跳变沿采样;CPHA = 1:在时钟信号SCK的第2个跳变沿采样。

        这四种模式的时序图如下图所示:

  • 模式0:CPOL= 0,CPHA=0。SCK串行时钟线空闲是为低电平,数据在SCK时钟的上升沿被采样,数据在SCK时钟的下降沿切换
  • 模式1:CPOL= 0,CPHA=1。SCK串行时钟线空闲是为低电平,数据在SCK时钟的下降沿被采样,数据在SCK时钟的上升沿切换
  • 模式2:CPOL= 1,CPHA=0。SCK串行时钟线空闲是为高电平,数据在SCK时钟的下降沿被采样,数据在SCK时钟的上升沿切换
  • 模式3:CPOL= 1,CPHA=1。SCK串行时钟线空闲是为高电平,数据在SCK时钟的上升沿被采样,数据在SCK时钟的下降沿切换

        经常用到的是模式0和模式3(毕竟在下降沿采集数据的还是少)。下图描述了4种模式数据线MOSI和MISO的数据切换(Toggling)位置和数据采样位置的关系。

2.3、SPI协议通信过程

        下面以模式 0 为例,讲解一下 SPI 基本的通讯过程:

        SCK、MOSI、CS_N 信号均由主机控制产生, SCK 是时钟信号,用以同步数据,MOSI 是主机输出从机输入信号,主机通过此信号线传输数据给从机,CS_N 为片选信号,用以选定从机设备,低电平有效;而 MISO 的信号由 从机产生,主机通过该信号线读取从机的数据。MOSI 与 MISO 的信号只在 CS_N 为低电平的时候才有效,在 SCK 的每个时钟周期 MOSI 和 MISO 传输一位数据。 

        在图中的标号1处,CS_N 信号线由高变低,是 SPI 通讯的起始信号。CS_N 是每 个从机各自独占的信号线,当从机在自己的 CS_N 线检测到起始信号后,就知道自己被主 机选中了,开始准备与主机通讯。在图中的标号6处,CS_N 信号由低变高,是 SPI 通讯的停止信号,表示本次通讯结束,从机的选中状态被取消。

        SPI 使用 MOSI 及 MISO 信号线来传输数据,使用 SCK 信号线进行数据同步。MOSI 及 MISO 数据线在 SCK 的每个时钟周期传输一位数据,且数据输入输出是同时进行的。数据传输时,MSB 先行或 LSB 先行并没有作硬性规定,但要保证两个 SPI 通讯设备之间使用同样的协定,一般都会采用MSB 先行模式。 MOSI 及 MISO 的数据在 SCK 的下降沿期间变化输出, 在 SCK 的上升沿时被采样。即在 SCK 的上升沿时刻,MOSI 及 MISO 的数据有效,高电平时表示数据“1”,为低电平时表示数据“0”。在其它时刻,数据无效,MOSI 及 MISO 为下一次表示数据做准备。

        SPI 每次数据传输可以 8 位或 16 位为单位,每次传输的单位数不受限制。

2.4、SPI协议的特性

  • SPI协议是一主多从的架构,通过片选信号CS来区分不同的从机(寻址方式)
  • SPI协议是一种同步(Synchronous)传输协议,通信双方通过主机生成的时钟信号SCK来作为数据交换的基准信号
  • SPI协议是一种全双工的串行通信协议,通信过程中主从双方均可进行数据交换
  • SPI协议具有4中通信模式,依据双方约定好的模式进行通信

2.5、SPI协议的优势、劣势

        优势:

  • 全双工串行通信
  • 简单的硬件结构
  • 高速数据传输速率(相比UART、IIC)
  • 灵活的数据传输方式,不限于8位,可以是任意大小的字

        劣势

  • 仅支持一个主设备
  • 引脚略多(相比UART、IIC)
  • 没有硬件从机应答信号(主机可能在不知情的情况下无处发送)

3、驱动代码的设计实现

        接下来实现的SPI驱动代码特性如下:MSB 先行;仅限模式0;每次传输8位(1个BYTE)。

3.1、接口定义与整体设计

        SPI驱动的整体框图、输入输出信号如下所示:

    其中信号描述如下: 

     

        该模块的使用方法如下:

  • 拉高SPI传输开始信号spi_start一个周期,同时发送要传输的数据给data_send,等待数据发送完成后,该模块会将发送完成标志信号 send_done拉高一个周期,标志一个BYTE的数据通过SPI总线发送给了从机
  • 同样的,当接收完成标志信号rec_done被该模块拉高后,则意味着,主机成功接收了一个BTYE从机发送过来的数据
  • 当主机希望结束这次传输时,可将SPI结束信号spi_end拉高一个周期,则该模块会在发送最后一个模块后结束SPI传输,这也意味着,如果没有结束到SPI结束信号,则SPI传输会一直进行,以便实现多个BYTE的SPI传输

3.2、Verilog代码

        Verilog代码并不复杂,结合下图的SPI通信过程,可以发现以下要点:

  • SCK很适合使用系统时钟的4分频时钟,因为在一个SCK内需要对其进行4次操作
  • 分别使用生成的SCK的上升沿、下降沿对其移位发送数据、接收数据即可
  • 此外从下图可知,SPI的驱动非常适合使用状态机编写,有兴趣可以自己尝试一下

`timescale 1ns/1ns		//时间单位/精度	
// 模式0
module spi_drive
(
// 系统接口input               sys_clk		, 			// 全局时钟50MHzinput               sys_rst_n	, 			// 复位信号,低电平有效
// 用户接口	input               spi_start	,			// 发送传输开始信号,一个高电平input              	spi_end		,			// 发送传输结束信号,一个高电平input        [7:0]  data_send   , 			// 要发送的数据output  reg  [7:0]  data_rec  	, 			// 接收到的数据output  reg         send_done	, 			// 主机发送一个字节完毕标志位    output  reg         rec_done	, 			// 主机接收一个字节完毕标志位    
// SPI物理接口input               spi_miso	, 			// SPI串行输入,用来接收从机的数据output  reg         spi_sclk	, 			// SPI时钟output  reg         spi_cs    	, 			// SPI片选信号,低电平有效output  reg         spi_mosi				// SPI输出,用来给从机发送数据          
);reg	[1:0]	cnt;								//4分频计数器
reg	[3:0]	bit_cnt_send;						//发送计数器
reg	[3:0]	bit_cnt_rec;						//接收计数器
reg			spi_end_req;						//结束请求// 生成片选信号spi_cs
always @(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)spi_cs <= 1'b1;				//默认为高电平						else if(spi_start)				//开始SPI准备传输,拉低片选信号spi_cs <= 1'b0;//收到了SPI结束信号,且结束了最近的一个BYTEelse if(spi_end_req && (cnt == 2'd1 && bit_cnt_rec == 4'd0))spi_cs <= 1'b1;				//拉高片选信号,结束SPI传输
end
// 生成结束请求信号(捕捉spi_end信号)
always @(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)spi_end_req <= 1'b0;		//默认不使能					else if(spi_cs)					spi_end_req <= 1'b0;		//结束SPI传输后拉低请求else if(spi_end)				spi_end_req <= 1'b1;		//接收到SPI结束信号后就把结束请求拉高
end
// 发送数据过程--------------------------------------------------------------------// 发送数据
always @(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)beginspi_mosi <= 1'b0;						//模式0空闲bit_cnt_send <= 4'd0;endelse if(cnt == 2'd0 && !spi_cs)begin		//模式0的上升沿spi_mosi <= data_send[7-bit_cnt_send];	//发送数据移位if(bit_cnt_send == 4'd7)				//发送完8bitbit_cnt_send <= 4'd0;elsebit_cnt_send <= bit_cnt_send + 1'b1;	endelse if(spi_cs)begin						//非传输时间段spi_mosi <= 1'b0;						//模式0空闲bit_cnt_send <= 4'd0;endelse beginspi_mosi <= spi_mosi;bit_cnt_send <= bit_cnt_send;end
end
// 发送数据标志
always @(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)send_done <= 1'b0;			else if(cnt == 2'd0 && bit_cnt_send == 4'd7)		//发送完了8bit数据send_done <= 1'b1;								//拉高一个周期,表示发送完成	else send_done <= 1'b0;			
end// 接收数据过程--------------------------------------------------------------------// 接收数据spi_miso
always @(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)begindata_rec <= 8'd0;		bit_cnt_rec <= 4'd0;endelse if(cnt == 2'd2 && !spi_cs)begin				//模式0的上升沿data_rec[7-bit_cnt_rec] <= 	spi_miso;			//移位接收if(bit_cnt_rec == 4'd7)							//接收完了8bitbit_cnt_rec <= 4'd0;elsebit_cnt_rec <= bit_cnt_rec + 1'b1;	endelse if(spi_cs)begin								bit_cnt_rec <= 4'd0;endelse begindata_rec <= data_rec;bit_cnt_rec <= bit_cnt_rec;end
end
// 接收数据标志
always @(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)rec_done <= 1'b0;									else if(cnt == 2'd2 && bit_cnt_rec == 4'd7)			//接收完了8bitrec_done <= 1'b1;								//拉高一个周期,表示接收完成			else rec_done <= 1'b0;					
endendmodule

4、Testbench及仿真结果

4.1、单个BYTE的仿真

        使用该SPI驱动,向从机发送单个BYTE数据8‘b01010101,观察其仿真时序是否正确:

//------------------------------------------------
//--SPI驱动仿真(模式0,1个BYTE)
//------------------------------------------------
`timescale 1ns/1ns		//时间单位/精度//------------<模块及端口声明>----------------------------------------
module tb_spi_drive();
//系统接口
reg				sys_clk		;			// 全局时钟50MHz
reg				sys_rst_n	;   		// 复位信号,低电平有效
//用户接口                      		
reg				spi_start 	;   		// 发送传输开始信号,一个高电平
reg				spi_end   	;   		// 发送传输结束信号,一个高电平
reg		[7:0]  	data_send   ;   		// 要发送的数据
wire  	[7:0]  	data_rec  	;   		// 接收到的数据
wire         	send_done	;   		// 主机发送一个字节完毕标志位    
wire         	rec_done	;   		// 主机接收一个字节完毕标志位    
//SPI物理接口                   		
reg				spi_miso	;   		// SPI串行输入,用来接收从机的数据
wire         	spi_sclk	;   		// SPI时钟
wire			spi_cs    	;   		// SPI片选信号
wire         	spi_mosi	;   		// SPI输出,用来给从机发送数据
//仿真用
reg		[3:0]  	cnt_send 	;			//发送数据计数器,0-15      //------------<例化SPI驱动模块(模式0)>----------------------------------------
spi_drive	spi_drive_inst(.sys_clk		(sys_clk	), 			.sys_rst_n		(sys_rst_n	), 			.spi_start		(spi_start	), 			.spi_end		(spi_end	),.data_send		(data_send	), 			.data_rec  		(data_rec	), 			.send_done		(send_done	), 			.rec_done		(rec_done	), 			.spi_miso		(spi_miso	), 			.spi_sclk		(spi_sclk	), 			.spi_cs    		(spi_cs		), 			.spi_mosi		(spi_mosi	)			
);//------------<设置初始测试条件>----------------------------------------
initial beginsys_clk = 1'b0;						//初始时钟为0sys_rst_n <= 1'b0;					//初始复位spi_start <= 1'b0;	data_send <= 8'd0;	spi_miso <= 1'bz;	spi_end <= 1'b0;	#80									//80个时钟周期后sys_rst_n <= 1'b1;					//拉高复位,系统进入工作状态#30									//30个时钟周期后拉高SPI开始信号,开始SPI传输spi_start <= 1'b1;data_send <= 8'b01010101;#20	spi_start <= 1'b0;@(posedge send_done)				//一个BYTE发送完成spi_end <= 1'b1;	#20	spi_end <= 1'b0;	//拉高一个周期结束信号	end//------------<设置时钟>----------------------------------------------
always #10 sys_clk = ~sys_clk;					//系统时钟周期20nsendmodule

        仿真结果如下:

         可以看到,在拉高了spi_start开始传输信号后,主机开始发送数据,MOSI上的数据分别是01010101,发送完一个BYTE的数据后,send_done拉高。此时拉高结束信号spi_end,就终结了这次SPI传输,完成了单个BYTE的SPI传输。

4.2、多个BYTE的仿真

        使用该SPI驱动,依次向从机发送数据8‘d0~8‘d10,观察其仿真时序是否正确:

//------------------------------------------------
//--SPI驱动仿真(模式0)
//------------------------------------------------
`timescale 1ns/1ns		//时间单位/精度//------------<模块及端口声明>----------------------------------------
module tb_spi_drive();
//系统接口
reg				sys_clk		;			// 全局时钟50MHz
reg				sys_rst_n	;   		// 复位信号,低电平有效
//用户接口                      		
reg				spi_start 	;   		// 发送传输开始信号,一个高电平
reg				spi_end   	;   		// 发送传输结束信号,一个高电平
reg		[7:0]  	data_send   ;   		// 要发送的数据
wire  	[7:0]  	data_rec  	;   		// 接收到的数据
wire         	send_done	;   		// 主机发送一个字节完毕标志位    
wire         	rec_done	;   		// 主机接收一个字节完毕标志位    
//SPI物理接口                   		
reg				spi_miso	;   		// SPI串行输入,用来接收从机的数据
wire         	spi_sclk	;   		// SPI时钟
wire			spi_cs    	;   		// SPI片选信号
wire         	spi_mosi	;   		// SPI输出,用来给从机发送数据
//仿真用
reg		[3:0]  	cnt_send 	;			//发送数据计数器,0-15      //------------<例化SPI驱动模块(模式0)>----------------------------------------
spi_drive	spi_drive_inst(.sys_clk		(sys_clk	), 			.sys_rst_n		(sys_rst_n	), 			.spi_start		(spi_start	), 			.spi_end		(spi_end	),.data_send		(data_send	), 			.data_rec  		(data_rec	), 			.send_done		(send_done	), 			.rec_done		(rec_done	), 			.spi_miso		(spi_miso	), 			.spi_sclk		(spi_sclk	), 			.spi_cs    		(spi_cs		), 			.spi_mosi		(spi_mosi	)			
);//------------<设置初始测试条件>----------------------------------------
initial beginsys_clk = 1'b0;						//初始时钟为0sys_rst_n <= 1'b0;					//初始复位spi_start <= 1'b0;	data_send <= 8'd0;	spi_miso <= 1'bz;	spi_end <= 1'b0;	#80									//80个时钟周期后sys_rst_n <= 1'b1;					//拉高复位,系统进入工作状态#30									//30个时钟周期后拉高SPI开始信号,开始SPI传输spi_start <= 1'b1;	#20	spi_start <= 1'b0;
endalways@(posedge sys_clk or negedge sys_rst_n)beginif(!sys_rst_n)begindata_send <= 8'd0;			spi_end <= 1'b0;			cnt_send <= 4'd0; 		endelse if(send_done)begin						//数据发送完成		if(cnt_send == 4'd10)begin		cnt_send <= 4'd0; spi_end <= 1'b1;					//拉高结束标志,结束SPI传输过程	data_send <= 8'd0;endelse begincnt_send <= cnt_send + 4'd1; spi_end <= 1'b0;					data_send <= data_send + 4'd1;		//发送数据累加	endendelse begindata_send <= data_send;spi_end <= 1'b0;						//其他时候保持SPI传输(不结束)	end
end//------------<设置时钟>----------------------------------------------
always #10 sys_clk = ~sys_clk;					//系统时钟周期20nsendmodule

        仿真结果如下:


        可以看到,在拉高了spi_start开始传输信号后,主机一直在发送数据,MOSI上的数据分别是8‘d0~8‘d10,每次发送一个BYTE的数据后,send_done即拉高一次。当结束信号spi_end被拉高后,就终结了这次SPI传输。

5、其他

  • 需要注意的是,由于没有从机响应,所以MISO都是高阻态(蓝色)
  • 下篇文章再结合从机(FLASH芯片)进行仿真验证接收数据功能
  • 如果需要完整的工程文件请点这里:工程文件下载

  • 📣博客主页:wuzhikai.blog.csdn.net
  • 📣本文由 孤独的单刀 原创,首发于CSDN平台🐵
  • 📣您有任何问题,都可以在评论区和我交流📞!
  • 📣创作不易,您的支持是我持续更新的最大动力!如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!


http://chatgpt.dhexx.cn/article/kH9Ua5TL.shtml

相关文章

SPI总线协议概述

一.概述 SPI(serial peripheral interface)是一种同步串行通信协议&#xff0c;由一个主设备和一个或多个从设备组成&#xff0c;主设备启动与从设备的同步通信&#xff0c;从而完成数据的交换。SPI是一种高速全双工同步通信总线&#xff0c;标准的SPI仅仅使用4个引脚&#xff…

SPI协议详解(总结)

关于SPI协议 1&#xff09;SPI是串行外设接口&#xff08;Serial Peripheral Interface&#xff09;的缩写&#xff1b; 2&#xff09;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff1b; 3&#xff09;在芯片的管脚上只占用四根线&#xff0c;节约了芯片的…

SPI通讯协议介绍

来到SPI通讯协议了。废话两句&#xff0c;“SPI很重要”&#xff0c;这是我在学校时候听那些单片机开发工程师说的。出来实习&#xff0c;到后来工作&#xff0c;确实如此&#xff0c;SPI的使用很常见&#xff0c;那么自然重要咯。 SPI(Serial peripheral interface)即串行外围…

spi协议及工作原理分析

说明.文章摘自&#xff1a;SPI协议及其工作原理浅析 http://bbs.chinaunix.net/thread-1916003-1-1.html 一、概述. SPI, Serial Perripheral Interface, 串行外围设备接口, 是 Motorola 公司推出的一种同步串行接口技术. SPI 总线在物理上是通过接在外围设备微控制器(PICmicro…

SPI总线协议介绍

SPI总线协议介绍 一、技术性能 SPI接口是Motorola 首先提出的全双工三线同步串行外围接口,采用主从模式(Master Slave)架构;支持多slave模式应用,一般仅支持单Master。时钟由Master控制,在时钟移位脉冲下,数据按位传输,高位在前,低位在后(MSB first);SPI接…

SPI 协议的解析

目录 1、SPI 的硬件层 1.1、SPI接口的信号线 1.2、SPI通信常见的连接方式 2、SPI的通信协议 2.1、起始信号 2.2、停止信号 2.3、数据有效性 2.4、时钟的同步 3、SPI的四种工作模式 SPI协议是由摩托罗拉公司提出的一种串行外围设备通信接口&#xff0c;是一种高速全双工…

SPI协议详解

1.SPI协议简介 1.1.SPI协议概括 SPI&#xff0c;是英语Serial Peripheral interface的缩写&#xff0c;顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM&#xff0c;FLASH&#xff0c;实时时钟&#xff0c;AD转换器&a…

一文看懂SPI协议

文章目录 SPI协议简介4线还是3线&#xff1f;4种工作模式多种传输速率SPI协议的基本时序SPI协议的升级版FPGA实现SPI协议SPI和IIC的对比总结 SPI协议简介 板卡内不同芯片间通讯最常用的三种串行协议&#xff1a;UART、I2C、SPI&#xff0c;之前写过串口协议及其FPGA实现&#…

SPI协议简单介绍

导言 SPI是串行扩展总线。 串行总线技术可以使系统的硬件设计大大简化、系统的体积减小、可靠性提高。同时系统的更改和扩充极为容易。 常用的串行扩展总线有&#xff1a;I2C&#xff08;Inter IC Bus)总线、单总线&#xff08;1-WIRE BUS)、SPI&#xff08;Serial Peripher…

SPI通信协议详解

SPI协议基本概念 SPI接口 &#xff08;1&#xff09;SPI&#xff08;Serial Peripheral interface&#xff09;是一种同步串行传输规范&#xff0c;也是单片机外设芯片串行外设扩展接口&#xff0c;该接口是一种高速&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;…

SPI 协议详解

SPI 协议详解 1、SPI 简介2、SPI四线3、SPI四种工作模式4、SPI时序图 1、SPI 简介 SPI 全称是 Serial Perripheral Interface&#xff0c;也就是串行外围设备接口。 SPI 是 Motorola 公司推出的一种同步串行接口技术&#xff0c;是一种高速、全双工的同步通信总线&#xff0c;…

SPI协议简介—学习笔记

SPI协议简介—学习笔记 1、SPI百度百科 SPI是串行外设接口&#xff08;Serial Peripheral Interface&#xff09;的缩写&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&…

一文搞懂SPI通信协议

目录 1、简介 2、通信原理 3、通信特性 3.1、设备选择 3.2、设备时钟 3.2.1、时钟速率 3.2.2、时钟极性 3.2.3、时钟相位 3.3、四种模式 4、多从机模式 5、SPI优缺点 1、简介 SPI是串行外设接口&#xff08;Serial Peripheral Interface&#xff09;的缩写&#xf…

SPI协议详解(图文并茂+超详细)

加入技术交流群 领取资料 文章目录 先说串口SPI通讯协议SPI特性时钟频率时钟极性 CKP/Clock Polarity时钟相位 CKE /Clock Phase (Edge)时钟配置总结 模式编号多从机模式优缺点SPI通讯的优势SPI的缺点 编程实现 先说串口 因为之前写过一篇UART&#xff0c;通用串行异步通讯协…

Xms Xmx Xss 释义

Xms 是指设定程序启动时占用内存大小。一般来讲&#xff0c;大点&#xff0c;程序会启动的快一点&#xff0c;但是也可能会导致机器暂时间变慢。 Xmx 是指设定程序运行期间最大可占用的内存大小。如果程序运行需要占用更多的内存&#xff0c;超出了这个设置值&#xff0c;就会…

JVM中的Xms和Xmx

JVM内存参数 -Xms和-Xmx 参考资料&#xff1a;(1) JVM常用内存参数配置 (2)深入理解Java虚拟机 -Xms和-Xmx &#xff08;1&#xff09;这两个参数老是搞混&#xff0c;特地记一下。-Xms 为JVM启动时申请的初始Heap值&#xff0c;默认为操作系统物理内存的1/64但小于1G。默认当…

通过两个小例子,更快了解-Xms -Xmx

我们偶尔就会遇到OutOfMemoryError&#xff0c;面试的时候总是能够被问道&#xff0c;可明明背好的面试题临时又不会了&#xff0c;答出来也很生硬&#xff0c;自己都想让自己快点“回家等通知”&#xff0c;那我们就通过下面的两个例子了解一下吧。 开发环境&#xff1a;ide…

程序员都需要会的JVM调优总结 -Xms -Xmx -Xmn -Xss,附idea配置实战(程序员必学)

目录 1.堆大小设置 2.JVM回收器和其他参数 3.JVM常见配置汇总 4.JVM在idea配置实战 5.JVM优化总结 1.堆大小设置 JVM 中最大堆大小有三方面限制&#xff1a;相关操作系统的数据模型&#xff08;32-bt还是64-bit&#xff09;限制&#xff1b;系统的可用虚拟内存限制&#x…

Xms Xmx size 调整java虚拟机堆大小

-Xms 设置堆空间&#xff08;年轻代&#xff09;的初始内存大小&#xff0c;等价于 -XX:InitialHeapSize -Xmx 设置堆空间&#xff08;老年代&#xff09;的最大内存大小&#xff0c;等价于 -XX:MaxHeapSize 一旦堆区中的内存大小超过“-Xmx”所指定的最大内存时&#xff0c…

xms应用框架 - 基于.netcore

xms应用框架 - 基于.netcore 背景一、xms是什么二、能干什么三、目标四、框架介绍1、元数据管理2、组织架构3、授权体系4、高度可视化配置5、业务扩展6、流程7、二次开发 五、多图鉴赏六、源码地址 背景 鄙人经过多年开发&#xff0c;数百个项目“打磨(折磨)”&#xff0c;各种…