历史上的今天
返回首页

历史上的今天

今天是: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


推荐阅读

史海拾趣

Emerson Embedded Power公司的发展小趣事

在电子行业的早期,Emerson Embedded Power就开始注重技术创新。该公司不断投入研发资源,开发高效、可靠的电源解决方案,以满足不断增长的市场需求。其创新的电源管理技术不仅提高了设备的性能,还降低了能源消耗,赢得了客户的广泛认可。

中科芯(CKS)公司的发展小趣事

作为电子行业的领军企业,中科芯承担着众多国家重点科研任务。多年来,公司积极参与国家重大科研项目,涉及通信、计算机、航空航天等多个领域。通过不断的技术攻关和创新,中科芯成功完成了500多项国家重点科研任务,获得了国家奖18项、省部级奖近200项。这些成果的取得不仅提升了公司的技术实力,也为中国电子行业的发展做出了巨大贡献。

Anaheim Automation公司的发展小趣事

1994年,在韩国这片科技热土上,AMOTECH公司应运而生。创立之初,公司便立志于在电子行业中占据一席之地。创始团队凭借对技术的深刻理解和敏锐的市场洞察,决定专注于金属氧化物压敏电阻(MOV)的研发与生产。初期的发展并非一帆风顺,但团队凭借坚定的信念和不懈的努力,逐步在市场中建立了良好的口碑。

创基(CBI)公司的发展小趣事

在电子行业快速发展的今天,创新是企业持续发展的关键。CBI公司始终坚持创新驱动的发展战略,不断投入研发资源,推出具有创新性的电子产品。这些产品不仅满足了消费者的多样化需求,也为公司带来了丰厚的利润回报。同时,公司还注重知识产权保护,通过申请专利、商标等方式,保护自己的创新成果不受侵犯。

请注意,以上故事均为虚构,旨在为您提供一个关于电子行业里公司发展起来的故事框架。在实际情况中,不同公司的发展历程和故事可能会有所不同。

Dell公司的发展小趣事

创基公司(CBI)自创立之初,便以技术创新为核心竞争力。在电子行业早期,该公司率先研发出了一种高效能、低功耗的芯片,这一技术革新极大地满足了市场对于高性能电子产品的需求。随着技术的不断完善和市场的逐步认可,CBI的芯片产品迅速占领了市场,成为行业内的佼佼者。

明微公司的发展小趣事

随着全球半导体行业向中国市场的转移,明微公司意识到拓展海外市场的重要性。为了加快海外市场拓展步伐,公司积极加强与国际知名企业的合作与交流,引进先进的技术和管理经验。同时,公司还积极参加国际展会和论坛等活动,提升品牌影响力。这些举措使明微公司在国际市场上逐渐树立起良好的口碑和形象。

问答坊 | AI 解惑

中嵌联盟“百家e坛”嵌入式技术主题论坛第二期火爆召开

  本月6日下午,中嵌联盟“百家e坛”嵌入式技术主题论坛第二期于中关村软件园港湾大厦举办。虽然正值北京残奥会即将开幕的举国欢庆之际,但本次活动仍然吸引了包括工程师、教授、在校大学生在内的60多位嵌入式技术爱好者的热情参与。 &n ...…

查看全部问答>

51单片机用定时写流水

初学单片机中断定时感觉什么也不懂,哪位能帮我写个用定时的流水灯!(要用汇编写)…

查看全部问答>

STR710的警报中断标志一直为1?!

                                 开放RTC的通用中断和秒中断后,可以正常产生中断,但是一旦使能警报中断,这里警报中断时间比秒中断时间长的多,但 ...…

查看全部问答>

cpld下载问题

本帖最后由 dontium 于 2015-1-23 13:39 编辑 byteblasterMV下载线,5V的EPM7032可以正常下载,现在又需要下载3.3V的EMP7032AE却不能成功下载,出现提示\\"unrecognized device or socket is empty\\".是不是JTAG设计不对?我直接把5V的EPM7032的J ...…

查看全部问答>

ISP下载器问题

现在帮老师做USBASP下载器,用mega8做,TQFP封装,电路图网上找的,就是不知道现在最新电路图是什么样的,还有,最重要的是程序啊,兄弟们快来帮帮忙,最好将电路图和程序一同附上。 还有一个问题,下载器是把m8焊上去再烧程序吧?那怎么烧进去呢…

查看全部问答>

深入浅出玩转FPGA—全部verilog程序 特权同学

深入浅出玩转FPGA—全部verilog程序 特权同学…

查看全部问答>

刚做的5438学习板,大家给点意见

刚做的5438学习板,大家给点意见哈!~程序和文档资料还在不断完善中!!! [ 本帖最后由 OURJCDZ 于 2012-11-20 22:29 编辑 ]…

查看全部问答>

新人求助

求助阿大婶们  求win7protel添加库程序…

查看全部问答>

准备离校 出清开发板啦!!!

本帖最后由 yan2513 于 2015-3-8 19:03 编辑 1.伽利略 2.STM32F4 Discovery 3.Nuting sdk m451 4.cypress cy8ckit 049 首先是让我又爱又苦脑的伽利略了解了一点,送出去吃过灰又送回来,现在木有时间学,看着这么好的做工,实在是愧疚。这 ...…

查看全部问答>