新手上路
- 积分
- 42
- 金钱
- 42
- 注册时间
- 2021-6-9
- 在线时间
- 13 小时
|
发表于 2021-11-1 16:29:02
|
显示全部楼层
硬件SPI与软件模拟SPI速度区别实测 目前为了程序移植方便,许多以SPI接口的芯片所提供的参考代码大多都使用的是软件SPI,比如笔者用过的存储芯片W25Q16,SPI接口驱动的OLED显示屏,LORA芯片SX1278等。 最近为了驱动彩色OLED显示屏,为了提高显示刷新率,需要对程序代码进行优化。于是,将相关SPI驱动从软件模拟转换为硬件控制,就势在必行了。 然而,到底软件模拟SPI和硬件SPI有多大的速度区别呢? 1.系统配置 为了测试的公平性,选用同样的ARM(STM32L151C8T6)以及系统时钟(32M),配置如下图所示: 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选通管脚拉高 } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 代码也很简单,在通信前拉低 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管脚 //所以数据内容无所谓 1 2 3 4 5 6 7 硬件控制SPI情况下示波器抓取的SCK波形如下: 从波形上我们可以很明显的看出,SPI发送速率在16MHz,每个字节需要用0.5uS的时间来发送。 4.总结 通过对比我们可以很明显的看出,硬件控制SPI比起软件模拟SPI,在相同系统时钟的情况下,速度要快上32倍。故而,有SPI总线高速需求的环境下,应当使用硬件控制方式来进行SPI通信。 5.补充 高速SPI固然让人收益巨大,但也有一定弊端,比如电路走线易受干扰,以及部分芯片对SPI总线速度有约束,不能设置得过高。在上升时间与下降时间有特别要求的SPI外设下,需要特别注意总线寄生容感。 为了提升SPI速率,在程序优化上需要下功夫,减少字节间的传输延迟。 ———————————————— 版权声明:本文为CSDN博主「realdd666」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/realdd666/article/details/106818549/ |
|