硬件SPI与软件模拟SPI速度区别实测

硬件SPI与软件模拟SPI速度区别实测

目前为了程序移植方便,许多以SPI接口的芯片所提供的参考代码大多都使用的是软件SPI,比如笔者用过的存储芯片W25Q16,SPI接口驱动的OLED显示屏,LORA芯片SX1278等。
最近为了驱动彩色OLED显示屏,为了提高显示刷新率,需要对程序代码进行优化。于是,将相关SPI驱动从软件模拟转换为硬件控制,就势在必行了。
然而,到底软件模拟SPI和硬件SPI有多大的速度区别呢?

1.系统配置

为了测试的公平性,选用同样的ARM(STM32L151C8T6)以及系统时钟(32M),配置如下图所示:

硬件SPI与软件模拟SPI速度区别实测_第1张图片

2.软件模拟SPI

选用了最常用的软件模拟SPI进行写操作,以单字节写指令为例,代码如下:

void SPI_Write_data(u8 dat) 
{	
	u8 i;
	SPI_CS_RESET();//SPI选通管脚拉低
	for(i=0;i<8;i++)
	{			  
		SPI_SCLK_Clr();
		if(dat&0x80)
		{
		   SPI_MOSI_Set();
		}
		else
		{
		   SPI_MOSI_Clr();
		}
		SPI_SCLK_Set();
		dat<<=1;
	}	
  SPI_CS_Set();	//SPI选通管脚拉高
}

代码也很简单,在通信前拉低 CS 管脚选通SPI对应芯片,然后按高位到低位的顺序发送“dat”内8位数据。我们让主程序无延时下循环发送数据,用示波器观测 SCK 管脚(或称SCL)的输出波形,就可以知道SPI的传输速率了。(这里需要说明,无论是硬件控制SPI还是软件模拟SPI,都没有用到DMA,故而每个字节发送间由于程序语句判断的延迟不在比较范围内,只比较每个字节发送时的时间)
示波器抓取的SCK波形如下:

这边需要注意,每一位的采样只在SCK上升沿(或下降沿)进行,故而SCK每交变一次,传输一位数据。图中可以看出,SPI发送速率在492.4KHZ左右,每个字节需要用16.2uS的时间来发送。

3.硬件控制SPI

硬件控制SPI时,首先需要初始化SPI接口,接着调用HAL库函数 HAL_SPI_Transmit即可方便的传输数据,基本代码如下:

 uint8_t Tx_str[] = "关老师的SPI测试数组\r\n";
 HAL_Init();
 SystemClock_Config();
 MX_GPIO_Init();
 MX_SPI1_Init();//以上皆为使用HAL库所需要做的初始化
 HAL_SPI_Transmit(&hspi1, Tx_str, sizeof(Tx_str)-1, 10000);//发送数组数据,由于只采样SCK管脚
 													  	   //所以数据内容无所谓

硬件控制SPI情况下示波器抓取的SCK波形如下:

从波形上我们可以很明显的看出,SPI发送速率在16MHz,每个字节需要用0.5uS的时间来发送。

4.总结

通过对比我们可以很明显的看出,硬件控制SPI比起软件模拟SPI,在相同系统时钟的情况下,速度要快上32倍。故而,有SPI总线高速需求的环境下,应当使用硬件控制方式来进行SPI通信。

5.补充

高速SPI固然让人收益巨大,但也有一定弊端,比如电路走线易受干扰,以及部分芯片对SPI总线速度有约束,不能设置得过高。在上升时间与下降时间有特别要求的SPI外设下,需要特别注意总线寄生容感。
为了提升SPI速率,在程序优化上需要下功夫,减少字节间的传输延迟。

你可能感兴趣的:(硬件测试)