SPI(Serial Peripheral Interrace,串行外设接口)是摩托罗拉公司推出的一种同步串行通讯总线,用于微处理器/微控制器和外围扩展芯片之间的串行连接,现已发展成为一种工业标准。讯通科技的PTR8000无限通讯模块就是以SPI为通讯接口的器件,由于其优越的性能被广泛应用于众多领域。它的SPI接口需要占用微处理器四个I/O线。SPCE061A是凌阳公司的推出的具有语音功能的16位单片机,I/O资源丰富,但不具备SPI接口。在实际应用中,出于产品体积、成本和可扩展性及应用场合等方面的考虑,我们选择二者结合组成无线通讯系统,用软件模拟方式实现SPI串口通讯,限于篇幅,仅介绍读命令的时序和应用子程序。此方法同样适用于其他不具备SPI接口的MCU与SPI接口器件的通信。
1 SPCE061A板与PTR8000硬件连接
图1所示为SPCE061A单片机与PTR8000的硬件连接图。
2 PTRS000通讯模块的SPI总线的工作原理
PTR8000通讯模块作为从设备,其SPI接口使用4条I/O口线:串行时钟线SCK、输出数据线MISO、输入数据线MOSI和高电平有效的从机选择线CSN。PTR8000的SPI总线接口读命令时序如图2所示。写命令如图3所示。
3软件模拟SPI接口的实现方法
对于不具备SPI串行总线接口的SPCE061A单片机来说,可以使用软件来模拟SPI的操作。图1中IOBl模拟SPI主设备的数据输出端SDO,IOB0模拟SPI的时钟输出端SCK,IOA4模拟SPI的从机选择端CSN,IOB9模拟SPI的数据输入端SDI。
上电复位后首先将IOB0(SCK)的初始状态设置为0(空闲状态)。
读操作:SPCE061A首先通过IOB1口发送1位起始位(1),2位操作码(10),6位被读的数据地址,然后通过IOB9口读1位空位,之后再读16位数据(高位在前)。
写操作:SPCE061A首先通过IOB1口发送1位起始位(1),2位操作码(01),6位被写的数据地址,之后通过IOB1口发送被写的16位数据(高位在前),写操作之前要发送写允许命令,写之后要发送写禁止命令。
写允许操作(WEN):写操作首先发送l位起始位(1),2位操作码(00),6位数据(11XXXX)。
写禁止操作(WDS):写操作首先发送1位起始位(1),2位操作码(00),6位数据(00XXXX)。
下面介绍用SPCE061A模拟SPI的子程序。
对于不同的串行接口外围芯片,它们的时钟时序是不同的。上述子程序是针对在SCK的上升沿输入(接收)数据和在下降沿输出(发送)数据的器件。这些子程序也适用于在串行时钟的上升沿输入和下降沿输出的其他各种串行外围接口芯片,只要在程序中改变IOB0(SCK)的输出电平顺序进行相应调整即可口。