完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
目前为了程序移植方便,许多以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选通管脚拉高 } 选通管脚拉高} 代码也很简单,在通信前拉低 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测试数组rn"; 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速率,在程序优化上需要下功夫,减少字节间的传输延迟。 |
|
|
|
只有小组成员才能发言,加入小组>>
2513 浏览 0 评论
1085浏览 2评论
700浏览 1评论
453浏览 0评论
194浏览 0评论
333浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 01:41 , Processed in 1.065242 second(s), Total 51, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号