
本帖最后由 衔胆栖冰 于 2017-1-29 21:38 编辑 ) [; V& C2 Z2 b. [ 如你所知,UART、I2C和SPI是MCU最常用的通信方式。相对于UART和I2C,SPI有着明显是速度优势。随着无线通信的普及,各种无线通信模块(如蓝牙模块、WiFi模块等)更多的配备SPI接口。还有芯片之间的通信,甚至是片外FLASH运行程序,越来越多的场合需要SPI通信。本人也经常使用SPI通信,深知SPI的应用广泛及其具备的优势。但本文针对我在项目开发中遇到的问题以及网友遇到的问题进行一次整理,不对SPI通信进行入门指导。目的在于探讨一些常见的SPI问题,抛砖引玉,望各位大神多多指点。本文以STM32为主进行讨论,但不局限于STM32,对于其他友商的MCU,同样具有参考意义。 4 S8 z3 R& d2 D 陷阱1:STM32的SPI连续性时钟。1 [! }$ D( G* \. @2 I STM32的SPI时钟是连续的,数据也是连续的。也就是说,在连续通信的过程中,SPI发送和接收的每两个字节(8bit模式时)之间是没有间隙的,时钟没有间隙,数据也没有间隙。这一特性的优点是有更快的通信速度。但也有一些隐性的问题,比如数据若有1bit出错,则可能导致所有数据出错;若从器件不能识别连续的时钟和数据,则可能导致错误。 ① 快速连续通信时,ST部分MCU提供了TI模式,加上了SPI_CS的信号控制,能在一定程度上缓解这种出错,提高SPI的通信速率。该模式局限于通信的主从设备必须都具备TI模式的SPI。该问题的解决办法,可参考OpenEdv-开源电子网会员“mzwhhwj”的《调试SPI+DMA的一点心得》http://www.openedv.com/thread-43538-1-1.html# G; i2 g( m5 _5 q②从器件不能识别连续的时钟和数据的情况,网友遇到具体问题是读取从设备的数据一直是第一个字节,最后在每个字节之间插入延时,问题得到解决。9 _# L. [0 j$ G8 x V 陷阱2:SPI的FIFO和DMA问题。 有的MCU的SPI没有FIFO但是有DMA,有的SPI没有DMA但是配备FIFO。对于SPI没有DMA也没有FIFO的MCU,在选型是需特别注意是否需要SPI快速通信。FIFO和DMA都是提高SPI通信速率的一种手段。下面分别分析DMA和FIFO可能存在的问题。 ①STM32有的MCU的DMA本身带有FIFO,使用DMA+FIFO无疑是SPI通信速率最快的方式。但是如果使用不当,可能会出现从机接收到重复数据的可能。STM32单片机的DMAFIFO中的突发处理事件,具体可参考官方应用文档AN4031。②其他友商的MCU,有的SPI不具备DMA,但是有单独的SPI硬件FIFO。这样的单片机,有的SPIFIFO 与接收/发送寄存器是分开的,若在全双工通信时要自定义通信协议,应先进行评估其数据的同步性。; r0 e4 p/ V0 h4 N 陷阱3:SPI时钟频率问题。 ①MCU的Datasheet中标明的最高速率,不等于实际最高速率。实际中往往达不到理论的最高速率。有的人认为,比如SPI时钟配置为16MHz,那么SPI的数据传输速率就是16Mbit/s,这是一个误区。有的MCU SPI数据之间是存在间隙的,即便是连续的数据,实际SPI通信速率也低于SPI时钟频率。3 O* L2 w7 a4 a3 k o. I ②有的MCU没有明确说明SPI时钟是否可以是任意的,导致有的人以为所有的MCU的SPI是任意的。对于STM32单片机,SPI外设时钟由MCU主时钟分频而得,分频数为2的次方数。若要分出合适的非常规的SPI时钟,可能需要调整MCU的主频。; e- B. F7 s/ u! c6 q SPI是MCU最常用、最可靠和最成熟的通信方式之一,若在SPI通信上遇到问题,切忌心烦意燥,吐槽硬件垃圾或厂商提供的库烂,只要你耐心的去解决,相信都会迎刃而解。更不提倡用模拟的SPI,因为SPI硬件外设已经非常成熟可靠,软件模拟的SPI速率较低、占用CPU频率高等。最后,祝大家新年快乐,身体健康,工作顺利,阖家幸福! 8 u& C: w9 y1 J$ G; } 2 c R+ N. R& Y' d% T! K1 v ' d* |0 W* S* D |
印象中STM32的SPI有个NSSP控制位,该位置位后字节间会有间隔。
嗯嗯,一般的MCU都是可以插入间隙,只是STM32默认是连续的。
新年快乐!
新年快乐
嗯嗯,本来想配些例程的,但是很多问题是工作中遇到的,不太方便放上来。就这样简单的Mark一下,希望可以给遇到类似问题的朋友一个参考。
新年快乐!
,纯友情支持 帮顶, N+ G9 G7 F0 b; ]6 G0 U6 ]