http://www.znmcu.cn/mod_sios_speed_test.html
振南的 串行IO扩展模块 性能速率测评【常规方式与DMA方式】 (详细阐述影响数据读写速度的主要因素) 振南的串行IO扩展模块,采用595+165方案实现用很少的IO(同步串行,SPI)扩展大量IO。 我们比较关心串行方式扩展的IO速度如何?输出一个字节和输入一个字节需要多少时间?这将成为数据传输的瓶颈。 振南针对这一指标进行了简单的测试:回环测试10000000次,看需要多少时间。所谓回环测试是指CPU通过串行接口通过此模块输出16位并行数据,然后再通过模块将16位数据读回,如果前后的值相等,则认识回环测试成功。否则失败。 测试代码如下: int main(void) { unsigned int i=0,temp=0; unsigned int counter=0; delay_init(); //延时函数初始化 uart_init(115200); SIO_IO_INIT; printf("SIO test Start!!\r\n"); while(counter++<10000000) { HIGH_SPI_FOR_595; SIO_Write_3595(i); LOW_SPI_FOR_165; temp=SIO_Read_2165(); if(temp!=i) {printf("SIO test Fail %04X\r\n",temp);while(1);} i++;i%=65536; } printf("SIO test Completed!!\r\n"); while(1); } 在STM32 M3平台上(基于振南的ZN-X开发板 STM32 M3版),SPI时钟频率分别为40MHz与10MHz(595与165最高时钟频率不同,详见《回环测试实验》)。此时,实测需要的时间如下表: 回环测试次数 | | | | | | | 使用8位SPI (写3片595,共3个字节,读2片165,共2个字节) | | | | 使用16位SPI (写3片595,共2个字,读2片165,共1个字) | | | | 使用8位SPI+DMA (写3片595,共3个字节,读2片165,共2个字节) |
其实STM32 M3(STM32F103RBT6)的SPI正常最高只能工作在18MHz,这里对其进行了超频(40MHz)。经过长时间的测试并没有发现问题。这里这样作只是为了测试模块的性能和速度,实际开发中不建议超频。SPI速率再高,其实意义不大,因为595和165的最高时钟频率有限(595振南实测到40MHz,根据数据手册,它上到60MHz应该不是问题。165则慢一些,振南最高测到15MHz,此实验中使用10MHz)。所以,即使在STM32 M4平台上(ZN-X开发板 M4版,STM32F405RGT6),主频可以跑到240MHz,但是SPI最高也只有42MHz,这个读写模块的速率也不会有太多提升。至于51等低端单片机来说,速度就要更低一些。 此模块,在STM32平台上,振南写了3种驱动,本质上都是SPI,但是传输和实现方式不同。为什么?主要是为了评估不同的实现方式对于读写速度的影响。3种方式分别是:1、8位SPI方式,输出的时候向模块上的3片595写3次,共3个字节,输入的时候从2片165读2次,共2个字节。2、16位SPI试,输出时写2次,共2个字,即4个字节,输入时读1次,即1个字,2个字节。3、8位SPI+DMA方式,同1。 造成读写速度有差异的根本原因是:SPI通信中的时钟间隙! 我们来比较一下3种方式SPI时钟的差异(以下波形拍摄于示波器): 常规情况下,使用SPI进行通信,在字节或字之间,即两次基本的最小数据单位的传输之间都会有一些间隙,也就是时钟不连续,其根本原因是CPU对传输状态的等待。更为详细的讲解请参见以下链接中的“STM32 SPI的时钟连续与非连续方式”一文 从上面的测试结果来看,同样是8位SPI,使用DMA比不使用数据读写速度上提升了不少,将近25%。而使用16位SPI和使用8位SPI+DMA在速度上差不多,其根本原因是16位SPI在读取单个字的时候,即2个字节,中间无时钟的间隙,效果同8位SPI+DMA一样(16位SPI甚至比8位SPI+DMA更快,因为它字节间完全不需要等待)。但是16位模式每次要比8位SPI模式向595多写入一个字节(因为它最小单位是16位,即字)。因此,最终的结果是这两种方式在速度差不多。 核算下来,振南的串行IO扩展模块数据读写速度至少可以达到每读写一个字节需要3-4us,单独写一个字节需要1~2us,读一个字节需要1-2us。也就是说,此模块IO的读写速度不低于5Mbps(约500KBps),它很大程度上取决于串行时钟的频率,以及数据传输方式。
|