首页 >> 产品中心 >> 飞思卡尔半导体

那些你不知道的SPI秘密

在嵌入式数字通信领域,我们随处可见SPI(Serial Peripheral Interface)的身影,SPI是一种同步串行通信接口,用于处理器和外围扩展芯片之间的串行连接,现在已经发展成为一种工业标准。但是作为电子工程师的你对它们又了解多少呢?是不是在使用它的时候遇到了各种奇葩的问题?现在就来看一下那些你不知道的SPI的秘密吧。

我们都用过51单片机模拟过SPI吧,相信大家肯定都能正常的通信了。典型的51单片机模拟SPI时序如程序清单1所示。

程序清单1  51单片机模拟SPI时序

上面这个程序是完全没有问题,所有的I/O口也都是按照先后顺序依次操作的,所以只要我们了解时序,是很容易写正确的。但是现在已经进入32位机的时代了,大部分MCU都有SPI外设,这样我们再也不用模拟繁琐的时序了,大大方便了我们的编程。现在我们就用飞思卡尔的FRDM-KL25Z开发平台写一段SPI操作74HC595的程序。FRDM-KL25Z开发板如图1所示。

目前FM3系列开发出2个产品线、4个族类的产品,如图1.1所示。

图1 KL25开发板

测试使用SPI操作的器件是广州周立功单片机科技有限公司的TinyHMI模块,如图2所示。该模块驱动电路是由两个级联的74HC595构成的,采用共阴数码管。测试需要在该模块的左边第1位数码管显示数字0,对应的段码是0x3F,位码是0x7F(数码管原理不在这里赘述)。

图2 TinyHMI模块

74HC595具有串行输入的功能,我们使用硬件SPI驱动时发现一个问题, KL25Z系列MCU的SPI模块位宽只有8位,满足不了我们一次发送16位数据的要求,那么如何用硬件SPI时一次发送更多的位呢?我们可以采用硬件SPI加软件片选的方式。

基于51的程序,移植到KL25Z系列MCU上,如程序清单2所示。

程序清单2 硬件SPI加软件片选程序

程序清单2中的Send_Byte函数是采用硬件SPI发送一个字节。运行此程序,发现现象异常,如图3所示。

图3 数码管出现乱码

现象为什么异常?数据写错了吗?反复检查程序也没有发现问题。那让我们逆向分析,看看74HC595收到的数据到底是什么。

我们借助广州致远电子股份有限公司的LA1016逻辑分析仪来抓取74HC595收到的数据。LA1016逻辑分析仪有配套的上位机软件和主流协议的分析插件,使用非常的方便,尤其是在协议分析时更加给力。本例选择SPI协议插件,得到如图4所示波形。

图4 LA1016逻辑分析仪
图5 片选信号提前拉高

从波形图上我们可以清晰看出,第二个字节数据还没有发送完毕片选信号就被拉高了,最终造成数码管的数据失真。这是为什么呢?查看KL25Z系列MCU的用户手册,发现在SPI的状态寄存器里有一个SPRF(SPI read buffer flag)位,在每次SPI通信完成之后,SPRF位会自动置位,表明这次通信完成。我们就可以通过读取这个标志位,来判断发送是否完成。根据如上分析,我们把Send_Byte函数改了一下,如程序清单3所示。

程序清单3 更改后的SPI程序

运行修改后的程序,TinyHMI模块显示正常了,如图5所示。

图5 正常的运行效果图

我们再用LA1016逻辑分析仪查看波形,结果如图6所示。

图6 SPI正常波形

这时可以看出,数据已经可以正常的传输了,片选信号也是在第2个字节发送完毕之后拉高的。

另外NXP、 Spansion等其它单片机硬件SPI的操作方式也是很类似的。说到这里你掌握住硬件SPI的秘密了吗? 使用硬件SPI加软件片选时,请一定要等待数据发送完毕之后,再拉高片选信号哦。

X