MSP430G2553的UART与SPI应用.docx
- 文档编号:8693846
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:19
- 大小:538.55KB
MSP430G2553的UART与SPI应用.docx
《MSP430G2553的UART与SPI应用.docx》由会员分享,可在线阅读,更多相关《MSP430G2553的UART与SPI应用.docx(19页珍藏版)》请在冰豆网上搜索。
MSP430G2553的UART与SPI应用
MSP430G2553的UART与SPI编程
MSP430的不同型号,其串行通讯工作模式是一样的。
以MSP430G2553为例进行说明。
MSP430G2553是20个引脚的16位单片机。
具有内置的16位定时器、16k的FLASH和512B的RAM,以及一个通用型模拟比较器以及采用通用串行通信接口的内置通信能力。
此外还具有一个10位的模数(A/D)转换器。
其引脚排布如图1.1所示。
其功能表如表1.1所示。
表1.1MSP430G2553引脚功能表
引脚号
引脚名
引脚功能描述
1
DVCC
接电源
2
DVSS
接地
3
P1.0
通用I/O口、ADC10模拟输入A0
(1)、Comparator_A+,CA0输入、TIMER_A时钟信号TACLK输入、ACLK信号输出
4
P1.1/RXD
通用I/O口、Timer0_A,捕捉:
CCI0A输入,比较:
Out0输出/BSL发送、UART模式中USCI_A0接收数据输入、SPI模式中USCI_A0受控器数据输出/主控器输入、ADC10模拟输入A1、Comparator_A+,CA1输入
5
P1.2/TXD
通用I/O口、Timer0_A,捕获:
CCI1A输入,比较:
Out1输出、UART模式中USCI_A0发送数据输出、SPI模式中USCI_A0受控器数据输入/主控器输出、ADC10模拟输入A2、Comparator_A+,CA2输入
6
P1.3
通用I/O口、ADC10,转换时钟输出
(1)、ADC10模拟输入A3、ADC10负基准电压、Comparator_A+,CA3输入、Comparator_A+,输出
7
P1.5
通用I/O口、Timer0_A,比较:
Out0输出/BSL接收、USCI_B0时钟输入/输出、USCI_A0受控器发送使能、ADC10模拟输入A5、Comparator_A+,CA5输入、JTAG测试模式选择输入终端
8
P2.0
通用I/O口、Timer1_A,捕获:
CCI0A输入,比较:
Out0输出
9
P2.1
通用I/O口、Timer1_A,捕获:
CCI1A输入,比较:
Out1输出
10
P2.2
通用I/O口、Timer1_A,捕获:
CCI1B输入,比较:
Out1输出
11
P2.3
通用I/O口、Timer1_A,捕获:
CCI0B输入,比较:
Out0输出
12
P2.4
通用I/O口、Timer1_A,捕获:
CCI2A输入,比较:
Out2输出
13
P2.5
通用I/O口、Timer1_A,捕获:
CCI2B输入,比较:
Out2输出
14
P1.6
通用I/O口、Timer0_A,比较:
Out1输出、、ADC10模拟输入A6、Comparator_A+,CA6输入、SPI模式中USCI_B0受控器输出/主控器输入、I2C模式中的USCI_B0SCLI2C时钟、JTAG测试数据输入或测试时钟输入
15
P1.7
通用I/O口、ADC10模拟输入A7、Comparator_A+,CA7输入、Comparator_A+,输出、SPI模式中的USCI_B0受控器输入/主控器输出、I2C模式中的USCI_B0SDAI2C数据输入、JTAG测试数据输出终端或测试数据输入
16
RST
复位、不可屏蔽中断输入、编程及测试期间的两线制(Spy-Bi-Wire)测试数据输入/输出
17
TEST
为端口1上JTAG引脚选择测试模式、器件保护熔丝连接至TEST、编程及测试期间的Spy-Bi-Wire测试时钟输入
18
P2.6/XOUT
晶体振荡器的输出终端、通用I/O口
19
P2.7/XIN
晶体振荡器的输入终端、通用I/O口、Timer0_A,比较:
Out1输出
20
DVSS
接地
串行通讯模块主要由三个部分组成:
波特率生成部分、发送控制器以及接收控制器。
如图1.2所示。
图1.2串行通讯模块内部结构图
一、UART模式
在异步模式下,接收器自身实现帧的同步,外部的通讯设备并不使用这一时钟。
波特率的产生是在本地完成的。
异步帧格式由1个起始位、7或8个数据位、校验位(奇/偶/无)、1个地址位、和1或2个停止位。
一般最小帧为9个位,最大为13位。
(一)UART的初始化
单片机工作的时钟源来自内部三个时钟或者外部输入时钟,由SSEL1、SSEL0,以决定最终进入模块的时钟信号BRCLK的频率。
所以配置串行通讯的第一步就是选择时钟。
通过选择时钟源和波特率寄存器的数据来确定位周期。
所以波特率的配置是串行通讯中最重要的一部分。
波特率设置用三个寄存器实现:
UxBR0(选择控制器0):
波特率发生器分频系数低8位。
UxBR1(选择控制器1):
波特率发生器分频系数高8位。
UxMCTL
数据传输的格式,以及数据传输的模式是通过配置控制寄存器UCTL来进行设置。
接收控制部分和发送控制部分。
首先需要串行口进行配置、使能以及开启中断。
串口接收数据一般采用中断方式,发送数据采用主动发送。
当接收到一个完整的数据,产生一个信号:
URXIFG0=1(类似于51单片机的接收中断标志位),表示接收完整的数据。
当数据正在发送中,UTXIFG0=1,此时不能再发送数据,必须等当前数据发送完毕(UTXIFG0=0)才能进行发送。
程序实例如下:
VoidUART_init()
{
WDTCTL=WDTPW+WDTHOLD;
P1SEL|=0x06;//I/O口的功能寄存器配置。
为1时作为模块输出或者输出,0为端口输入或者输出。
配置P1.1,P1.2为串行口。
P2DIR=0x04;//串口发送端为输出,串口接收端为输入。
0为输入,1为输出
U0CTL|=CHAR; //配置控制寄存器,数据类型为8位。
U0TCTL|=SSEL0; //选择时钟UCLK=ACLK。
U0BR0=0x45; //分频系数的高8位,8MHz时钟下波特率为115200
U0BR1=0x00; //分频系数的低8位。
U0MCTL=0x00; //波特率的调整。
U0CTL&=~SWRST; //系统复位。
只有对SWRST复位,USART才能重新被允许。
而接收和发送允许标志URXE和UTXE不会因SWRST而更改。
ME1|=UTXE0+URXE0; //使能USART0TXD/RXD模块USART中特有的使能配置。
IE1|=URXIE0; //使能USART0接收中断
_EINT();//开启全部中断。
_BIS_SR(LPM0_bits+GIE); //初始化完毕,进入睡眠状态。
等待工作。
该程序直接调用。
}
发送数据函数:
__interruptvoidusart0_rx(void)
{
while(!
(IFG1&UTXIFG0)); //判断发送缓冲区是否为空。
TXBUF0=RXBUF0; //将数据发送到串口。
}
二、SPI编程
1、概述.
SPI,SerialPerripheralInterface,串行外围设备接口,是Motorola公司推出的一种同步串行接口技术.SPI总线在物理上是通过接在外围设备微控制器(PICmicro)上面的微处理控制单元(MCU)上叫作同步串行端口(SynchronousSerialPort)的模块(Module)来实现的,它允许MCU以全双工的同步串行方式,与各种外围设备进行高速数据通信.
SPI主要应用在EEPROM,Flash,实时时钟(RTC),数模转换器(ADC),数字信号处理器(DSP)以及数字信号解码器之间.它在芯片中只占用四根管脚(Pin)用来控制以及数据传输,节约了芯片的pin数目,同时为PCB在布局上节省了空间.正是出于这种简单易用的特性,现在越来越多的芯片上都集成了SPI技术.
2、特点
1.采用主-从模式(Master-Slave)的控制方式
SPI规定了两个SPI设备之间通信必须由主设备(Master)来控制次设备(Slave).一个Master设备可以通过提供Clock以及对Slave设备进行片选(SlaveSelect)来控制多个Slave设备,SPI协议还规定Slave设备的Clock由Master设备通过SCK管脚提供给Slave设备,Slave设备本身不能产生或控制Clock,没有Clock则Slave设备不能正常工作.
2.采用同步方式(Synchronous)传输数据
Master设备会根据将要交换的数据来产生相应的时钟脉冲(ClockPulse),时钟脉冲组成了时钟信号(ClockSignal),时钟信号通过时钟极性(CPOL)和时钟相位(CPHA)控制着两个SPI设备间何时数据交换以及何时对接收到的数据进行采样,来保证数据在两个设备之间是同步传输的.
3.数据交换(DataExchanges)
SPI设备间的数据传输之所以又被称为数据交换,是因为SPI协议规定一个SPI设备不能在数据通信过程中仅仅只充当一个"发送者(Transmitter)"或者"接收者(Receiver)".在每个Clock周期内,SPI设备都会发送并接收一个bit大小的数据,相当于该设备有一个bit大小的数据被交换了.
一个Slave设备要想能够接收到Master发过来的控制信号,必须在此之前能够被Master设备进行访问(Access).所以,Master设备必须首先通过SS/CSpin对Slave设备进行片选,把想要访问的Slave设备选上.
在数据传输的过程中, 每次接收到的数据必须在下一次数据传输之前被采样.如果之前接收到的数据没有被读取,那么这些已经接收完成的数据将有可能会被丢弃, 导致SPI物理模块最终失效.因此,在程序中一般都会在SPI传输完数据后,去读取SPI设备里的数据,即使这些数据(DummyData)在我们的程序里是无用的.
3、工作机制
3.1.概述
2011-03-1216:
22上传
下载附件(28.52KB)
上图只是对SPI设备间通信的一个简单的描述,下面就来解释一下图中所示的几个组件(Module):
SSPBUF,SynchronousSerialPortBuffer,泛指SPI设备里面的内部缓冲区,一般在物理上是以FIFO的形式,保存传输过程中的临时数据;
SSPSR,SynchronousSerialPortRegister,泛指SPI设备里面的移位寄存器(ShiftRegitser),它的作用是根据设置好的数据位宽(bit-width)把数据移入或者移出SSPBUF;
Controller,泛指SPI设备里面的控制寄存器,可以通过配置它们来设置SPI总线的传输模式.
通常情况下,我们只需要对上图所描述的四个管脚(pin)进行编程即可控制整个SPI设备之间的数据通信:
SCK,SerialClock,主要的作用是Master设备往Slave设备传输时钟信号,控制数据交换的时机以及速率;
SS/CS,SlaveSelect/ChipSelect,用于Master设备片选Slave设备,使被选中的Slave设备能够被Master设备所访问;
SDO/MOSI,SerialDataOutput/MasterOutSlaveIn,在Master上面也被称为Tx-Channel,作为数据的出口,主要用于SPI设备发送数据;
SDI/MISO,SerialDataInput/MasterInSlaveOut,在Master上面也被称为Rx-Channel,作为数据的入口,主要用于SPI设备接收数据;
SPI设备在进行通信的过程中,Master设备和Slave设备之间会产生一个数据链路回环(DataLoop),就像上图所画的那样,通过SDO和SDI管脚,SSPSR控制数据移入移出SSPBUF,Controller确定SPI总线的通信模式,SCK传输时钟信号.
3.2.Timing.
2011-03-1513:
42上传
下载附件(21.66KB)
上图通过Master设备与Slave设备之间交换1Byte数据来说明SPI协议的工作机制.
首先, 在这里解释一下两个概念:
CPOL:
时钟极性,表示SPI在空闲时,时钟信号是高电平还是低电平.若CPOL被设为1,那么该设备在空闲时SCK管脚下的时钟信号为高电平.当CPOL被设为0时则正好相反.
CPHA:
时钟相位,表示SPI设备是在SCK管脚上的时钟信号变为上升沿时触发数据采样,还是在时钟信号变为下降沿时触发数据采样.若CPHA被设置为1,则SPI设备在时钟信号变为下降沿时触发数据采样,在上升沿时发送数据.当CPHA被设为0时也正好相反.
上图里的"Mode1,1"说明了本例所使用的SPI数据传输模式被设置成CPOL=1,CPHA=1.这样,在一个Clock周期内,每个单独的SPI设备都能以全双工(Full-Duplex)的方式,同时发送和接收1bit数据,即相当于交换了1bit大小的数据.如果SPI总线的Channel-Width被设置成Byte,表示SPI总线上每次数据传输的最小单位为Byte,那么挂载在该SPI总线的设备每次数据传输的过程至少需要8个Clock周期(忽略设备的物理延迟).因此,SPI总线的频率越快,Clock周期越短,则SPI设备间数据交换的速率就越快.
3.3.SSPSR.
2011-03-1216:
51上传
下载附件(34.63KB)
SSPSR是SPI设备内部的移位寄存器(ShiftRegister).它的主要作用是根据SPI时钟信号状态,往SSPBUF里移入或者移出数据,每次移动的数据大小由Bus-Width以及Channel-Width所决定.
Bus-Width的作用是指定地址总线到Master设备之间数据传输的单位.
例如,我们想要往Master设备里面的SSPBUF写入16Byte大小的数据:
首先,给Master设备的配置寄存器设置Bus-Width为Byte;然后往Master设备的Tx-Data移位寄存器在地址总线的入口写入数据,每次写入1Byte大小的数据(使用writeb函数);写完1Byte数据之后,Master设备里面的Tx-Data移位寄存器会自动把从地址总线传来的1Byte数据移入SSPBUF里;上述动作一共需要重复执行16次.
Channel-Width的作用是指定Master设备与Slave设备之间数据传输的单位.与Bus-Width相似, Master设备内部的移位寄存器会依据Channel-Width自动地把数据从Master-SSPBUF里通过Master-SDO管脚搬运到Slave设备里的Slave-SDI引脚,Slave-SSPSR再把每次接收的数据移入Slave-SSPBUF里.
通常情况下,Bus-Width总是会大于或等于Channel-Width,这样能保证不会出现因Master与Slave之间数据交换的频率比地址总线与Master之间的数据交换频率要快,导致SSPBUF里面存放的数据为无效数据这样的情况.
3.4.SSPBUF.
2011-03-1217:
14上传
下载附件(39.78KB)
我们知道,在每个时钟周期内,Master与Slave之间交换的数据其实都是SPI内部移位寄存器从SSPBUF里面拷贝的.我们可以通过往SSPBUF对应的寄存器(Tx-Data/Rx-Dataregister)里读写数据,间接地操控SPI设备内部的SSPBUF.
例如,在发送数据之前,我们应该先往Master的Tx-Data寄存器写入将要发送出去的数据,这些数据会被Master-SSPSR移位寄存器根据Bus-Width自动移入Master-SSPBUF里,然后这些数据又会被Master-SSPSR根据Channel-Width从Master-SSPBUF中移出,通过Master-SDO 管脚传给Slave-SDI管脚, Slave-SSPSR则把从 Slave-SDI接收到的数据移入Slave-SSPBUF里. 与此同时,Slave-SSPBUF里面的数据根据每次接收数据的大小(Channel-Width),通过Slave-SDO发往Master-SDI,Master-SSPSR再把从Master-SDI接收的数据移入Master-SSPBUF.在单次数据传输完成之后,用户程序可以通过从Master设备的Rx-Data寄存器读取Master设备数据交换得到的数据.
VoidUART_init()
{
WDTCTL=WDTPW+WDTHOLD;
P1SEL|=0x06;//I/O口的功能寄存器配置。
为1时作为模块输出或者输出,0为端口输入或者输出。
配置P1.1,P1.2为串行口。
P2DIR=0x04;//串口发送端为输出,串口接收端为输入。
0为输入,1为输出
U0CTL|=CHAR; //配置控制寄存器,数据类型为8位。
U0TCTL|=SSEL0; //选择时钟UCLK=ACLK。
U0BR0=0x45; //分频系数的高8位,8MHz时钟下波特率为115200
U0BR1=0x00; //分频系数的低8位。
U0MCTL=0x00; //波特率的调整。
U0CTL&=~SWRST; //系统复位。
只有对SWRST复位,USART才能重新被允许。
而接收和发送允许标志URXE和UTXE不会因SWRST而更改。
ME1|=UTXE0+URXE0; //使能USART0TXD/RXD模块USART中特有的使能配置。
IE1|=URXIE0; //使能USART0接收中断
_EINT();//开启全部中断。
_BIS_SR(LPM0_bits+GIE); //初始化完毕,进入睡眠状态。
等待工作。
该程序直接调用。
}
发送数据函数:
__interruptvoidusart0_rx(void)
{
while(!
(IFG1&UTXIFG0)); //判断发送缓冲区是否为空。
TXBUF0=RXBUF0; //将数据发送到串口。
}
4、SPI模式具体代码
USTAR下的SPI模式有如下特点:
1、SPI模式支持3线和4线模式;
2、支持主机与从机模式;
3、接受和发送有各自独立的发送移位寄存器和缓冲器;
4、接受和发送都有独立的中断能力;
5、移位时钟的极性和相位可编程;
6、字符长度可以是7位或者8位。
SPI工作在全双工下,即主机发送的同时也接收数据,传输的速率由编程决定。
4线SPI模式用附加数据线,允许从机数据的发送和接收。
其信号如下:
SIMO:
从进主出,主机模式下,数据输出;从机模式下,数据输入。
SOMI:
从出主进,主机模式下,数据输入,从机模式下,数据输出。
UCLK:
USARTSPI模式时钟,信号有主机输出,从机输入。
CLK时钟只能由主机提供。
STE:
从机模式发送接收允许控制脚,用于4线模式。
(一)SPI初始化
SPI当中不需要波特率调整,所以UxMCTL=0x0000,SPI的初始化及其复位和UART公用一套寄存器。
在初始化或者重新配置USART的SPI时,必须按照以下顺序进行:
1、UxCTL寄存器的第0位SWRST置位;
2、在SWRST置位的条件下,初始化所有的SPI寄存器,包括UxCTL寄存器;
3、通过置位模块使能寄存器MEx的URXEx和UTXEx位使能SPI的接受和发送使能模块;
4、通过软件复位UxCTL寄存器的第0位SWRST;
5、通过中断使能寄存器IEx的URXIEx和UTXIEx来使能发送和接受中断。
voidmain(void)
{
WDTCTL=WDTPW+WDTHOLD; //关闭看门狗。
P1SEL|=0x07; //配置P1.0、P1.1、P1.2模块输出。
UCTL=CHAR+SYNC+MM; //工作模式以及数据格式的设置,CHAR为1时为8-bit,0时为7位,SYNC控制通讯模式,1为SPI模式,0为UART模式。
UTCTL=CKPL+STC+SSEL0+SSE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MSP430G2553 UART SPI 应用
![提示](https://static.bdocx.com/images/bang_tan.gif)