首页 理论教育 TILaunchPad与Energia:简单实现SPI通信

TILaunchPad与Energia:简单实现SPI通信

时间:2023-11-17 理论教育 版权反馈
【摘要】:SPI是串行外设接口的简称,也是一种串行通信技术。相对于UART和I2C通信,SPI通信的速度更快。图8-14SPI总线示意图一个SPI设备,通常会有4根连线,包括SCK、MOSI、MISO和CS。在SPI总线中主机负责输出时钟信号以及选择通信的从机。SPI主控模块和与之通信的外设时钟极性和相位应该一致。图8-15SPI数据模式②SPI_MODE1,CPOL为0,CPHA为1。图8-17SPI应用连接示意图原理分析。

TILaunchPad与Energia:简单实现SPI通信

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章中已经做过介绍了。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈