SPI(serial peripherial interface)是串行外设接口的简称,也是一种串行通信技术。它由一个主控制器和一个或多个从设备组成,如图8-14所示。主控器一般采用微控制器,常用的从设备包括液晶显示屏、SD卡等。相对于UART和I2C通信,SPI通信的速度更快。
图8-14 SPI总线示意图
一个SPI设备,通常会有4根连线,包括SCK、MOSI、MISO和CS。
(1)SCK为时钟线,用于通信同步的时钟信号,由主机产生。
(2)MOSI(master out slave in),主机数据输出,从机数据输入。如果设备设定为主机,它就是输出口;如果设备设定为从机,它就是输入口。
(3)MISO(master in slave out),主机数据输入,从机数据输出。如果设备设定为主机,它就是输入口;如果设备设定为从机,它就是输出口。
(4)CS(chip select),从机使能信号,由主机控制。
在SPI总线中主机负责输出时钟信号以及选择通信的从机。时钟信号会通过主机的SCK引脚输出,提供给通信的从机使用。而对于通信从机的选择,则由从机上的CS引脚决定:当从机上的CS引脚为低电平时,该从机被选中;当从机上的CS引脚为高电平时,该从机断开。数据的收/发通过MISO和MOSI进行。
不同型号LaunchPad控制器对应的SPI引脚的位置也有所不同,常见型号的SPI引脚位置如表8-9所示。
表8-9 不同型号的LaunchPad的SPI通信引脚
1)SPI类库成员函数
在大多数情况下LaunchPad都是作为主机使用的,所以Energia的SPI类库没有提供LaunchPad作为从机的API。Energia的SPI类库由SPI.h和SPI.cpp两个文件组成,其中SPI.h是SPI的头文件,SPI.cpp是实现文件。SPI类提供成员函数如下。
(1)begin()。
功能:初始化SPI通信。调用该函数后,SCK、MOSI和CS引脚被设置为输出模式,且SCK和MOSI引脚被拉低,CS引脚被拉高。
语法:SPI.begin()。
参数:无。
返回值:无。
(2)end()。
功能:关闭SPI总线通信。
语法:SPI.end()。
参数:无。
返回值:无。
(3)setBit Order()。
功能:设置传输顺序。
语法:SPI.setBit Order(order)。
参数为order,即传输顺序,取值为:①LSBFIRST,低位在前;②MSBFIRST,高位在前(默认配置)。
返回值:无。
(4)setClock Divider()。
功能:设置通信时钟。时钟信号由主机产生,从机不用配置。但主机时钟频率应该在从机允许的处理速度范围内,否则从机来不及处理,通信失败。
语法:SPI.setClock Divider(divider)。
参数:divider,SPI通信的时钟是由系统时钟分频得到的。可使用的分频配置如下。
①SPI_CLOCK_DIV2,2分频。
②SPI_CLOCK_DIV4,4分频(默认配置)。
③SPI_CLOCK_DIV8,8分频。
④SPI_CLOCK_DIV16,16分频。
⑤SPI_CLOCK_DIV32,32分频。
⑥SPI_CLOCK_DIV64,64分频。
⑦SPI_CLOCK_DIV128,128分频。
返回值:无。
(5)setData Mode()。
功能:设置数据模式。为了与外设进行交换数据,根据外设工作要求,其输出串行同步时钟(SCK)极性(clock polarity,CPOL)和相位(clock phase,CPHA)可以进行配置。如果CPOL=0,SCK的空闲状态为低电平;如果CPOL=1,SCK的空闲状态为高电平。如果CPHA=0,在SCK的第一跳变沿(上升或下降)数据被采样;如果CPHA=1,在SCK的第二跳变沿(上升或下降)数据被采样(见图8-15)。SPI主控模块和与之通信的外设时钟极性和相位应该一致。
语法:SPI.setData Mode(mode)。
参数:mode,可配置的模式,取值如下。(www.xing528.com)
①SPI_MODE0,CPOL(Clock Polarity)为0,CPHA(Clock Phase)为0。
图8-15 SPI数据模式
②SPI_MODE1,CPOL为0,CPHA为1。
③SPI_MODE2,CPOL为1,CPHA为0。
④SPI_MODE3,CPOL为1,CPHA为1。
返回值:无。
(6)transfer()。
功能:传输1B数据。
语法:SPI.transfer(val)。
参数:val,要发送的1B数据。
返回值:读到的字节数据。
2)SPI总线上的数据发送与接收
SPI总线是一种同步串行总线,其收/发数据可以同时进行。SPI类库没有像其他类库一样提供用于发送、接收操作的write()和read()函数,而是用transfer()函数代替了两者的功能,其参数是发送的数据,返回值是收到的数据。每发送一次数据,即会接收一次。
3)使用数字电位器AD5206
AD5206(见图8-16)是一个6通道、256位数字控制可变电阻器件,可实现与电位器或可变电阻相同的电子调整功能,也就是说它是一个可以由程序控制调节电阻大小的电位器。
图8-16 AD5206 DIP封装图
(1)引脚配置。AD5206的引脚配置如表8-10所示。
表8-10 AD5206引脚
(续表)
VDD可取值+3V或+5V,VSS可取值0 V或-2.7 V,但|VDD|+|VSS|<5.5 V。
(2)实验材料。实验材料包括MSP430G2 LaunchPad、AD5206、6个LED、6个220Ω电阻。
(3)连接示意图。由于AD5206使用SPI控制,因此需要将其与LaunchPad的SPI引脚连接。本示例的引脚连接情况如表8-11所示。
表8-11 AD5206与LaunchPad的引脚连接
所有的LED灯的正极连接220Ω电阻,LED灯的负极接地(见图8-17)。
图8-17 SPI应用连接示意图
(4)原理分析。AD5206的各通道均内置了一个带游标触点的可变电阻,每个可变电阻均有各自的锁存器,用于保存其编程的电阻值。这些锁存器由一个内部串行至并行移动寄存器更新,该移位寄存器从一个SPI接口加载数据。如表8-12所示,由11个数据位构成的数据读到串行输入寄存器中,前3位经过解码,可确定当CS引脚上的选择脉冲变回高电平时,哪一个锁存器需要载入该数字的后8位。
表8-12 输入到AD5206的串行数据
(5)实现代码。在菜单栏中打开“File”→“Examples”→“SPI”→“DigitalPotControl”,这时在编辑窗口会出现程序,如表8-13所示。
表8-13 AD5206应用示例程序清单
(续表)
首先需要将AD5206的CS引脚拉低,以便使能芯片,并使用SPI.begin()函数初始化SPI总线。然后使用SPI.transfer()函数将地址位和数据位发送至AD5206(见表8-13)。如表8-12所示,由于AD5206的串行输入寄存器只有11位,因此前5位数据会被挤出寄存器,剩下的11位数据中前面的3位为地址,其后的8位为调节电阻值使用的数值。最后再将CS引脚拉高,AD5206便会按照写入寄存器的数据控制其对应的电位器的阻值。
上传该程序后便可以通过LED的亮与灭看出AD5206调节阻值的效果了。
4)软件模拟SPI通信
在使用SPI时,必须将设备连接到LaunchPad指定的SPI引脚上。Energia还提供了模拟SPI通信功能,使用模拟SPI通信可以指定LaunchPad上的任意数值引脚为模拟SPI引脚,并与其他SPI器件连接进行通信。Energia提供了两个相关的函数用于实现模拟SPI通信功能,分别是shift Out()和shiftIn(),这两个函数在第6章中已经做过介绍了。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。