历史上的今天
今天是:2025年02月06日(星期四)
2021年02月06日 | MSP430系列通用串行通信模块的同步模式(SPI)
2021-02-06 来源:eefocus
1、SPI概述
串行外围设备接口SPI(seria丨peripheral interface)总线技术是一种同步串行接口,其硬件功能很强,所以,与SPI有关的软件相当简单,使CPU有更多的时间处理其他事务。SPI总线上可以连接多个可作为主机的MCU(微控制器)、装有SPI接口的输出设备、输入设备,如液晶驱动、A/D转换等外设,也可以简单连接到单个TTL移位寄存器的芯片。 总线上允许连接多个设备,但在任一瞬间只允许一个设备作为主机。典型的结构如图1示(3线模式)。
图1:SPI典型结构
其中SPI总线的时钟线由主机控制,另外还有数据线:主机输入/从机输出线和主机输出/从机输入线。主机和哪台从机通信通过各从机的选通线进行选择。
应用SPI的系统可以简单,也可以复杂,主要有以下几种形式:
—台主机MCU和若干台从机MCU。
多台MCU互相连接成一个多主机系统。
一台主机MCU和若干台从机外围设备。
2、同步操作
当MSP430的 USART 模块控制寄存器 UCTL 的 SYNC 位置位且I2C位复位时,串行模块工作在SPI模式,通过4线(SOMI、SIMO、UCLK 及STE)或者3线(SOMI、SIMO、UCLK)同外界通信。MSP430的同步通信模块有如下特点:
支持3线或4线SPI操作。
支持主机模式与从机模式。
接收和发送有单独的移位寄存器。
接收和发送有独立的缓冲器。
接收和发送有独立的中断能力。
时钟的极性和相位可编程。
主模式的时钟频率可编程。
7位或8位字符长度。
2.1 SPI模式的引脚信号
引脚 SOMI、SIMO、UCLK 和 STE 用于 SPI模式。其中 SOMI、SIMO、UCLK 在主机模式和从机模式下存在差别,如图2所示。
图2:SOMI、SIMO、UCLK含义
STE:从机模式发送接收允许控制引脚,控制多主从系统中的多个从机。该引脚不用于3线SPI操作,可以在4线模式SPI操作中使多主机共享总线,避免发生冲突。
4线SPI操作主模式中,STE的含义如下:
0 SIMO和UCLK被强制进入输入状态;
1 SIMO和UCLK正常操作。
4线SPI操作从模式中,STE的含义如下:
0 允许从机发送接收数据,SOMI正常操作;
1 禁止从机发送接收数据,SOMI被强制进入输入状态。
2.2 SPI的操作方式
SPI是全双工的,即主机在发送的同时也在接收数据,传送的速率由主机编程决定: 主机提供时钟UCLK与数据,从机利用这一时钟接收数据,或在这一时钟下送出数据。主机在任何时侯初始化发送并控制时钟。时钟的极性和相位也是可以选择的,具体的约定由设计人员根据总线上各设备接口的功能决定。4线SPI模式用附加数据线,允许从机数据的发送和接收,它由主机控制。
(1)SPI的主机模式
图3是MSP430的USART模块使用同步模式时,作为主机与另一SPI从机设备的连接。
图3 :USART模块为主机
当控制寄存器中 MM=1 时,工作在主机模式。USART 模块通过在 UCLK 引脚上的 UCLK信号控制串行通信。在第一个UCLK周期,数据由SIMO引脚移出,并在相应的 UCLK 周期的中间,从SOMI 引脚锁存数据。每当移位寄存器为空,已写入发送缓存 UTXBUF的数据移入移位寄存器,并启动在 SIMO 引脚的数据发送,最髙有效位先发送。同时,接收到的数据移入移位寄存器。当移完所有选定位数时,接收移位寄存器中的数据移入接收缓存 URXBUF,并设置中断标志URXIFG,表明接收到一个数据。在接收过程中, 最先收到的数据为最高有效位,数据以右对齐的方式存入接收缓存器。如果这时前一数据未被读取,则溢出位OE=1。
用户程序可以使用接收中断标志和发送中断标志完成协议的控制。当数据从移位寄存器中发送给从机后,可立即用 UTXIFG 标志将数据从缓存中移入移位寄存器,开始一次发送操作。从机接收定时应能确保及时获取数据。URXIFG 标志指示数据移出移入完成。主机可利用URXIFG确定从机已经准备好接收新数据。
注意:UTXIFG标志不代表数据移入移出完成。
在使用4线通信时,由激活的主机 STE 信号防止与别的主机发生总线冲突。如果相应的PNSEL位选择模块功能,则 STE 引脚为输入线。主机在STE信号为高电平时正常工作。当STE信号被设置为低电平时,例如另一个设备申请成为主机,这时当前的主机应作出如下反应:
SIMO 和 UCLK 引脚被强制为输入,不再驱动SPI总线;
出错标志位 FE 和 URCTL 中的中断标志位 URXIFG置位。
这样,总线冲突就被消除,即 SIMO 和 UCLK 两引脚(原主机)不再驱动总线线路, 同时用出错标志 FE 通知系统的完备性被破坏。与 STE 为低电平时 SIMO 和 UCLK 引脚被强制为输入;当 STE 返回高电平时,系统将返回到由相应控制位定义的状态。
在3线模式中,STE输入信号与控制无关。
(2)SPI中的从机模式
图4是MSP430的 USART 模块使用同步模式时,作为从机与另一设备的连接。
图4:USART模块作为从机
当选择同步模式且 MM=0时,则为从机模式。在从机模式下,通信用的串行时钟来源于外部主机,从机的 UCLK 引脚为输入状态。
数据传输速率由主机发出的串行时钟确定,而不由内部的波特率发生器决定。在开始 UCLK 之前,由 UTXBUF 装入移位寄存器中的数据在主机提供的 UCLK 信号作用下,通过从机的SOMI 引脚对外发送(给主机)。同时在 UCLK 时钟的反向沿 SIMO 引脚上的串行数据移入接收寄存器中。如果接收中断标志 URXIFG=1,则标志数据已经接收并装配到接收缓存器。当新数据写入接收缓存时前一个数据还没有被取出,则溢出标志被置位。
在使用4线同步通信时,STE信号被从机用作发送和接收允许信号,它由主机提供。
STC=1 时,该从机禁止接收和发送:
STE=0 时,该从机被允许接收和发送。
在已经启动的接收操作过程中,STE=1,则接收操作也将在中途被停止,直到STE=0。
(3)同步操作
主机通过发送 UCLK 信号用于初始化发送。主机在一个时钟跳变沿将数据移出发送移位寄存器,在另一个反向跳变沿移入接收寄存器。从机数据的移位操作与此相同,但用公共的移位寄存器接收和发送。主机与从机数据的发送和接收是同时进行的,因为使用的是不同的线路。
图5:同步串行数据通信
图5是7位字长串行同步数据发送的例子,接收移位寄存器的初始内容为00,那么会发生如下系列事件:
A:从机写98H 到 DSR,并等待主机将数据移出。
B:主机写0B0H 到 UTXBUF,它将立刻送往发送移位寄存器,且开始发送。
C:完成第一个字符,中断标志置位。
D:从机由它的接收缓存读出 58H(右对齐)。
E:从机写54H 到 DSR,并等待主机将数据移出。
F:主机与它的接收缓存 URXBUF读出 4CH(右对齐)。
G:主机写0E8H 到发送缓存 UTXBUF,并开始发送。
H:完成第二个字符,中断标志置位。
I:主机收到2AH,从机收到 74H(右对齐)。
如果 USART为从机模式,则D事件后至G事件前不需要 UCLK。如果为主机模式,则内部需要两个时钟(内部产生,非UCLK)来终止发送和接收第一个字符,并准备下一个字符的发送和接收。
这些过程如图6所示(当为7位模式是,RXBUF 的 MSB 读出为0)。
图6:数据传输循环
3、同步通信寄存器
同步通信和异步通信寄存器资源一致,但具体寄存器的不同位之间存在差异,使用时不要搞混。
下面依次介绍各寄存器(用x表示0和1):
3.1 UxCTL 控制寄存器
该寄存器的各位定义如下:

I²C 模式选择位。当SYNC=1时,选择SPI或者I²C模式。
0 SPI模式;
1 I²C模式。
CHAR 字符长度。选择字符以7位或8位发送。7位时不用发送或接收缓存的最高位,补0。
0 7位;
1 8位。
LISTEN 选择是否将发送数据由内部反馈给接收器。
0 无反馈;
1 有反馈,发送信号由内部反馈给接收器,自己发送的数据同时被自己接收, 通常被称为自闭环模式。
SYNC USART模块的模式选择。
0 UART模式;
1 SPI模式。
MM 主机模式或从机模式选择位。
0 从机模式;
1 主机模式。
SWRST 控制位。该位的状态影响着其他一些控制位和状态位的状态。在串行口的使用过程中,这一位是比较重要的控制位。一次正确的 USART 模块初始化应该是这样的顺序:先在SWRST=1的情况下设置串口;然后设置 SWRST=0;最后如果需要中断,则设置相应的中断使能。
3.2 UxTCTL 发送控制寄存器
各位定义如下:

CKPH 时钟相位控制位。
0 SPICLK 信号使用正常的 UCLK 时钟;
1 UCLK 时钟信号被延迟半个周期后用作 SPICLK 信号。
CKPL SPICLK信号时钟极性控制位。
0 时钟信号的低电乎为无效电平,数据在 UCLK 的上升沿输出,输入数据在 UCLK 的上升沿被锁存。
1 时钟信号的高电平为无效电平,数据在 UCLK 的下降沿输出,输入数据在 UCLK 的上升沿被锁存。
同步模式下,数据输入或输出与时钟信号的相位和极性之间的关系如图7所示。
图7:数据输入或输出与时钟信号的相位和极性之间的关系
SSEL1, SSEL0 时钟源选择位。这两位确定波特率发生器的时钟源。
0 外部时钟 UCLK (仅对从机模式有效);
1 辅助时钟 ACLK (对主机模式有效);
2,3 子系统主时钟 SMCLK (对主机模式有效)。
STC 从机发送控制位。
0 SPI的4线模式,STE 信号用于主机以避免总线冲突,或用于从机模式的控制发送或接收允许;
1 SPI的3线模式,此时 STE 引脚信号在主机、从机模式中不起作用。
TXTEPT 发送器空标志。从机模式没有用到。
0 有数据在发送或者发送缓冲器(UTXBUF)有数据;
1 发送移位寄存器和 UTXBUF 为空。
3.3 URCTL 接收控制寄存器
各位定义如下:

错误标志含义参见异步通信自动错误检测部分。
曾小庆:MSP430系列通用串行通信模块的异步模式zhuanlan.zhihu.com
FE 帧错误标志。
0 没有帧错误;
1 帧错误。
OE 溢出标志位。
0 无溢出;
1 有溢出。
3.4 UxBR0,UxBR1 波特率选择寄存器0和1
格式和含义同异步通信寄存器,同步通信最小的分频因子为2。
曾小庆:MSP430系列通用串行通信模块的异步模式zhuanlan.zhihu.com
3.5 UxMCTL 波特率调整控制寄存器
在同步通信时不需要调整寄存器,使用时最好全部写0。
3.6 URXBUF 接收数据缓存
接收缓存存放从接收移位寄存器最后接收到的字符,可由用户访问。读接收缓存可以复位接收时产生的各种错误标志、RXWAKE 位和 URXIFGx位。如果传输7位数据,接收缓存内容右对齐,最高位为0.
3.7 UTXBUF 发送数据缓存
发送缓存内容可以传送至发送移位寄存器,然后由UTXDx传输。对发送缓存进行写操作可以复位UTXIFGx。如果传输7位数据,发送缓存内容最高位为0.
4、同步操作应用举例
4.1 SPI三线从模式
以下程序是MSP430F148在MCLK=SMCLK=DCO~800KHz情况下以三线从模式与主机通信的例子。发送到主机的数据从0xFF开始逐渐递减,从主机收到的数据应该从0x00开始每逐次递增。在首次数据交换前,主机发起一个RST脉冲使从机复位。
/***********main程序***********/
#include
char MST_Data = 0x00, SLV_Data = 0xFF;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P3SEL = 0x0E; //P3用于SPI模式
U0CTL = CHAR + SYNC +SWRST; //8位SPI,从模式
U0TCTL = CKPL + STC; //时钟极性,UCLK,3线
ME1 = USPIE0; //模块使能
U0CTL &= ~SWRST; //接收中断使能
IE1 |= URXIE0; //使能总中断
_EINT();
while(1)
{
TXBUF0 = SLV_Data; //准备第一个字符
LPM4; //进入LPM4
}
}
/***********中断程序***********/
#pragma vector = USART0RX_VECTOR
__interrupt void SPI0_rx (void)
{
while ((IFG1 & UTXIFG0) == 0); //USART0 发送数据准备好?
if (U0RXBUF == MST_Data) //接收数据是否正确
{
SLV_Data = SLV_Data - 1; //输入数据递减
MST_Data = MST_Data +1; //输入数据递增
TXBUF0 = SLV_Data;
}
else
TXBUF0 = SLV_ Data;
}
其中:P3.1--数据输入(SIMO0)
P3.2--数据输出(SOMI0)
P3.3--时钟(UCLK)
4.2 SPI三线主模式
SPI主机与从机通过三线方式通信。主机发送从0开始递增的数据,接收到的数据应当从0xFF开始递减。USART0接收中断服务子程序用来处理LPM0状态时与CPU的通信。主机初始化从机,并等待一定时间以使SPI同步。P1.0指示收到了正确的数据。MCLK=SMCLK=DCO~800KHz
/***********main程序***********/
#include
char MST_Data = 0x00, SLV_Data = 0xFF;
void main(void)
{
unsigned int i;
WDTCTL = WDTPW + WDTHOLD;
P1OUT = 0x00;
P1DIR |= 0x01;
P3SEL = 0x0E;
P3OUT = 0x20;
P3DIR |= 0x30;
U0CTL = CHAR + SYNC +MM + SWRST;
U0TCTL = CKPL + SSEL1 + STC;
U0BR0 = 0x02;
U0BR1 = 0x00;
U0MCTL = 0x00;
ME1 = USPIE0;
U0CTL &= ~SWRST;
IE1 |= URXIE0;
_EINT();
P3OUT &= ~0x20;
P3OUT |= ~0x20;
i = 50000;
do (i--);
while(i != 0);
while(1)
{
TXBUF0 = MST_Data;
LPM0;
}
}
/***********中断程序***********/
#pragma vector = USART0RX_VECTOR
__interrupt void SPI0_rx (void)
{
P3OUT ^= 0x10;
while ((IFG1 & UTXIFG0) == 0);
if (U0RXBUF == SLV_Data)
{
SLV_Data = SLV_Data - 1;
MST_Data = MST_Data +1;
TXBUF0 = MST_Data;
P1OUT |= 0x01;
P1OUT &= ~0x01;
}
else
{
TXBUF0 = MST_ Data;
P1OUT |= 0x01;
}
}
其中:P3.1--数据输出(SIMO0)
P3.2--数据输入(SOMI0)
P3.3--时钟(UCLK)
上位信号--P3.4
从RST--P3.5
显示--P1.0
史海拾趣
|
本月6日下午,中嵌联盟“百家e坛”嵌入式技术主题论坛第二期于中关村软件园港湾大厦举办。虽然正值北京残奥会即将开幕的举国欢庆之际,但本次活动仍然吸引了包括工程师、教授、在校大学生在内的60多位嵌入式技术爱好者的热情参与。 &n ...… 查看全部问答> |
|
刚做的5438学习板,大家给点意见哈!~程序和文档资料还在不断完善中!!! [ 本帖最后由 OURJCDZ 于 2012-11-20 22:29 编辑 ]… 查看全部问答> |
|
本帖最后由 yan2513 于 2015-3-8 19:03 编辑 1.伽利略 2.STM32F4 Discovery 3.Nuting sdk m451 4.cypress cy8ckit 049 首先是让我又爱又苦脑的伽利略了解了一点,送出去吃过灰又送回来,现在木有时间学,看着这么好的做工,实在是愧疚。这 ...… 查看全部问答> |




