历史上的今天
返回首页

历史上的今天

今天是:2025年01月07日(星期二)

正在发生

2020年01月07日 | MSP430 SPI(Serial Peripheral Interface) 入门学习

2020-01-07 来源:eefocus

基本简介

这次MSP430入门介绍是基于MSP430FR2433 Lunchpad进行学习。从小白开始进行SPI学习,理解使用SPI模块。如有错误的地方,大家多多指正。


MSP430 User Guide 学习

每个人学习MSP430的方法是不一样的,我习惯第一步先从User Guide开始。

文件:MSP430FR4xx and MSP430FR2xx Family User’s Guide.pdf

章节:Chapter 23 eUSCI - SPI Mode


23.1 增强型通用串行通信接口(eUSCI_A, eUSCI_B) 概要

eUSCI_A和eUSCI_B都支持SPI串行通信。

23.2 eUSCI 介绍 - SPI模式

在同步模式下(UCSYNC bit = 1), eUSCI模块通过3、4个管脚(UCxSIMO, UCxSOMI, UCxCLK, and UCxSTE)将430设备与外部系统进行连接。当UCSYNC = 1时,SPI模式被选择。3管脚还是4管脚设置是由UCMODEx位进行设置。

SPI模式的特点:

(1)7-8位数据长度

(2)最高位有效或者最低位有效可选的数据接收和发送

(3)3管脚或者4管脚的SPI操作

(4)主/从模式

(5)独立的接收和发送移位寄存器

(6)独立的接收和发送缓冲寄存器

(7)连续的接收和发送操作

(8)可选时钟极性和相位

(9)主模式下,时钟频率可编程

(10)独立的接收和发送中断

(11)从机可以操作在LPM4模式


图23-1显示了eUSCI配置成SPI模式的结构图。

23.3 eUSCI 操作 - SPI模式

在SPI模式,多个设备之间串行数据的发送和接收是由主机提供的时钟进行的。主机有一个额外的管脚UCxSTE来控制使能从机接收和发送数据。

3或4个信号用于SPI数据交换

(1)UCxSIMO – 从输入主输出

(2)UCxSOMI – 从输出主输入

(3)UCxCLK – eUSCI SPI clock 主机输出时钟,从机接收时钟

(4)UCxSTE – 从机使能

UCxSTE 用于4线模式,此时允许在1条总线有多个主机,它不用于3线模式。表23-1 描述了UCxSTE操作。

23.3.1 eUSCI 初始化和复位(Reset)

The eUSCI 会被 PUC 或者 UCSWRST bit进行复位. PUC后UCSWRST bit 会被自动置位使得eUSCI保持在Reset状态。当UCSWRST置位时UCRXIE,UCTXIE, UCRXIFG, UCOE, 和 UCFE bits会复位, UCTXIFG标志位会置位。清除UCSWRST会释放eUSCI使其进入运转状态。


初始化或者重新配置eUSCI模块

1. 置位UCSWRST

2. 通过UCSWRST = 1 初始化所有的eUSCI寄存器(包括UCxCTL1)

3. 配置端口

4. 软件清除UCSWRST

5. 设置UCRXIE or UCTXIE使能中断(可选)

23.3.2 字符格式

工作在SPI下的eUSCI模块支持7位/8位的字符长度,它由UC7BIT位进行设置。在7位数据模式下,UCxRXBUF是低有效位对齐,最高有效位总是复位。UCMSB控制着数据传送的方向,是高位在前还是低位在前。


23.3.3 主模式

图23-2显示了eUSCI作为主机模式工作在3线或者4线的配置。

当数据被移入到发送缓冲器中UCxTXBUF,eUSCI开始了数据的发送。当TX移位寄存器空的时候,UCxTXBUF的数据移位到TX移位寄存器。启动UCxSIMO的数据传输。UCMSB的设置决定了该数据是MSB在前还是LSB在前。UCxSOMI中的数据在相反的时钟沿被移入到接收移位寄存器中。


当主机接收到字符后,接收数据从接收移位寄存器移入接收缓冲器UCxRXBUF,同时接收中断标志位UCRXIFG被置位,这标志着RX和TX操作已经完成。


发送中断标志位UCTXIFG置位,表明数据已经由UCxTXBUF移位到TX移位寄存器,UCxTXBUF已经准备好接收新的数据。它不表示RX和TX操作已经完成。


主模式下为了USCI模块接收数据,数据必须写入UCxTXBUF,因为接收和发送数据是同步的。


这有两种不同的选项来配置eUSCI作为4线的主机。

(1)第四个管脚被用来输入来阻止和其他主机产生冲突(UCSTEM = 0)。

(2)第四个管脚被用来作为输出产生从机使能信号(UCSTEM = 1)。

UCSTEM位用来选择相应的选项。


23.3.3.1 4线制 SPI 主模式(UCSTEM = 0)

在4线制主模式下(UCSTEM = 0), UCxSTE 是数字输入端口来阻止和其他的主机产生冲突,如表23-1所示。

当UCxSTE处于主机-非活动状态时,UCSTEM = 0:

(1)UCxSIMO 和 UCxCLK 设置为输入状态,并且不再驱动总线。

(2)错误位UCFE置位,表明违反通信完整性,需要用户处理。

(3)内部状态机复位,移位操作终止。

如果UCxSTE保持主机在不活动状态下,将数据写入UCxTXBUF中,UCxSTE一旦转换到主机活动状态,立即发送数据。如果UCxSTE转换到主机不活动状态,而致使正在进行的数据发送停止,那么UCxSTE转换回主机活动状态下,数据必须再次写入UCxTXBUF。

UCxSTE信号不会用在3线制主机模式。


23.3.3.2 4线制 SPI 主模式(UCSTEM = 1)

如果UCSTEM = 1 在4线制主机模式,UCxSTE 是数据输出端口。这种模式下,UCxSTE会自动生成单个从机的从机使能信号。对应的行为可以看图23-4.

如果有多个从机,这个功能不能使用,软件需要使用通用I/O口来产生每个从机的单独的STE信号。


23.3.4从模式

图23-3显示了eUSCI 作为从模式的3线制和4线制的配置

UCxCLK被用作SPI时钟的输入,它必须有外部主机提供。数据传输速率由外部主机时钟决定而不是内部的时钟发生器。UCxCLK开始前,写入UCxTXBUF和移入TX移位寄存器的数据通过UCxSOMI发送。UCxSIMO中的数据在UCxCLK的反向沿移入到接收移位寄存器。当接收到设定的位数时,移入到接收缓冲器UCxBUF。

当数据从RX移位寄存器转移到接收缓冲器UCxRXBUF中时,UCRXIFG标志位置位,指示数据已经被接收到。当之前接收的数据没有从UCxRXBUF中读出而新的数据被移入到UCxRXBUF中时UCOE被置位发生overrun错误。


23.3.4.1 4线SPI从模式

在4线从模式,UCxSTE是数据输入端口,用来使能从机发送和接收,这个信号是由主机驱动的。当UCxSTE在从机活动状态下,从机会正常运行。当UCxSTE在从机不活动状态:

(1)UCxSIMO任何的接收活动会被停止。

(2)UCxSOMI会被设置成输入方向。

(3)移位操作会被停止,直到UCxSTE转换到从机发送活动状态。

在3线制从机模式下,不使用UCxSTE输入信号。


23.3.5 SPI使能

当清除UCSWRST位,使能eUSCI模块,它可以进行发送和接收。在主模式下,位时钟(bit clock)发生器已经就绪,但是不会产生任何时钟。在从模式,位时钟发生器被禁止,它的时钟信号由主机提供。

UCBUSY=1 说明发送和接收操作正在进行。

PUC和UCSWRST位会立即禁止到eUSCI,任何的传输都会被中断。


23.3.5.1发送使能

在主模式下,通过UCxTXBUF写操作会激活位时钟发生器(bit clock)开始发送数据。

在从模式下,当主机提供时钟,开始发送数据。4线制下,UCxSTE处于从活动状态下开始发送数据。


23.3.5.2接收使能

当发送处于活动状态下,SPI开始接收数据。接收和发送同时进行。


23.3.6串行时钟控制

UCxCLK是由SPI总线上的主机提供。UCMST=1,位时钟由eUSCI 位时钟发生器通过UCxCLK管脚提供。通过UCSSELx位可以选择生成bit clock的时钟源。当UCMST=0,eUSCI时钟是由主机UCxCLK管脚提供的。从机的位时钟发生器没有使用。不用在乎UCSSELx位。SPI接收和发送是并行的需要用到相同的时钟。

为速率控制寄存器UCxxBRW中的UCBRx的16位数值是USCI时钟源BRCLK的分频因子。当UCBRx=0,主模式能产生最大的bitclock是BRCLK。调制器没有用在SPI模式,当使用eUSCI_A时UCAxMCTL应当被清除。UCAxCLK或者UCBxCLK的频率公式如下:

fBitClock=fBRCLK/UCBRx f_{BitClock} =f_{BRCLK}/{UCBRx}

BitClock

 =f 

BRCLK

 /UCBRx


当UCBRx=0,BRCLK没有进行任何的分频,位时钟等于BRCLK。

偶数的UCBRx设置将会产生偶数的分频,因此产生一个50/50占空比的bit clock。

奇数的UCBRx设置将会进行奇数的分频。这种情况下,bit clock的高电平会比低电平长一个BR 时钟。


23.3.6.1串行时钟极性和相位

UCxCLK的极性和相位可通过eUSCI的UCCKPL和UCCKPH控制位独立配置。每种情况的时钟如图23-4所示。

23.7.3低功耗模式的使用SPI模式

在低功耗模式下,eUSCI模块提供自动的时钟激活。低功耗模式下当eUSCI时钟处于非活动状态。当需要时会自动激活USCI时钟,而不论时钟源控制位如何设置。在eUSCI模块回到空闲状态之前,时钟源一直保持活动状态。当eUSCI模块回到空闲状态,时钟源将恢复到控制位的设置。

在SPI的从模式,不需要内部时钟源,因为时钟由外部的主机提供。即使芯片处于LPM4模式,所有的时钟都被禁用的情况下,eUSCI也可以在SPI模式下操作。接收和发送中断可以将CPU从任何的低功耗模式下唤醒。


当从机在LPM4模式下,接受多个字节,CPU的唤醒时间必须要考虑其中。如果CPU的唤醒时间比如150us,请确保请确保CPU在第二个字节被完全接收之前服务于第一个接收字节的TXIFG。否则一个overrun 错误会产生。


23.3.8 SPI中断

eUSCI模块只有一个中断向量,发送和接收公用这个中断向量。eUSCI_Ax和eUSCI_Bx不共享同一个中断向量。


23.3.8.1 SPI 发送中断操作

UCTXIFG由发送器置位,表示UCxTXBUF已经准备好接收下一个字符。如果UCTXIE和GIE置位将会产生中断请求。当一个字符写入UCxTXBUF中,UCTXIFG会自动复位。PUC或者UCSWRST=1时UCTXIFG会置位,UCTXIE会复位。


注意:SPI数据下写数据到UCxTXBUF

当UCTXIFG=0时写数据到UCxTXBUF中将会导致错误的数据发送

23.3.8.2 SPI接收终端操作

每次当接收一个字符并把字符装载到UCxRXBUF时,UCRXIFG中断标志置位。如果UCRXIE和GIE置位时,将产生一个中断请求。PUC或者UCSWRST=1时,UCRXIFG和UCRXIE复位。当读取UC下RXBUF时,UCRXIFG会自动复位。


23.3.8.3中断向量发生器 UCxIV

eUSCI中断标志位具有不同的优先级,他们组合共用一个中断向量。中断向量寄存器UCxIV用来决定哪一个标志位请求中断。优先级最高的中断将会在UCxIV寄存器中产生一个数字偏移量。这个偏移量累加到程序计数器PC上。程序自动跳转到相应的软件程序处。禁止中断不会影响UCxIV值。

对UCxIV寄存器的任何读和写的访问,会复位挂起优先级最高的中断标志。如果另外一个中断标志置位,在响应完之前的中断后,将立即产生另一个中断。


基本知识介绍

User Guide往往特别冗长,并且都是英文写的,所以自己在刚开始学习MSP430时,最烦的一件事情就是读User Guide。但是它又非常重要,最终还是强迫自己好好读下来,第一章是对UG的中文翻译,方便大家理解,但是有条件的话还是推荐大家读英文版的UG。读完UG后我们往往是一知半解,要想更好的理解SPI模块,我们依然还要查询SPI的基本知识。


SPI基本知识

链接:https://wenku.baidu.com/view/c96f97ca79563c1ec4da7191.html


SPI

数据极性:表示时钟信号在空闲时是高电平还是低电平。

时钟相位:决定数据是在CLK的起始沿采样还是结束沿采样。


应用实例

本次实验使用的MSP430FR2433 Lunchpad(2块板子进行通信)。SPI主机与从机通过三线连接,主机发送数据给从机,同时又接收从机发来的数据,发送数据从0x01开始递增,从机接收数据,然后立刻发出数据。主机进入接收中断,如果发送和接收的数据相同,则点亮LED灯,否则熄灭。

参考文献: MSP430FR2433示例代码


主机代码


ACLK = ~32.768kHz, MCLK = SMCLK = DCO ~ 1MHz.  BRCLK = SMCLK/2.

//

//

//                   MSP430FR2433

//                 -----------------

//             /||                 |

//              | |                 |

//              --|RST              |

//                |                 |

//                |             P1.4|-> Data In (UCA0SIMO)

//                |                 |

//                |             P1.5|<- Data OUT (UCA0SOMI)

//                |                 |

//                |             P1.6|-> Serial Clock Out (UCA0CLK)

//******************************************************************************


#include


unsigned char RXData = 0;

unsigned char TXData;


int main(void)

{

    WDTCTL = WDTPW | WDTHOLD;                 // Stop watchdog timer


    P1SEL0 |= BIT4 | BIT5 | BIT6;             // set 3-SPI pin as second function


    //++

    P1DIR |=BIT0;

    P1OUT &= ~BIT0;



    UCA0CTLW0 |= UCSWRST;                     // **Put state machine in reset**

    UCA0CTLW0 |= UCMST|UCSYNC|UCCKPL|UCMSB;   // 3-pin, 8-bit SPI master

                                              // Clock polarity high, MSB

    UCA0CTLW0 |= UCSSEL__SMCLK;               // SMCLK

    UCA0BR0 = 0x01;                           // /2,fBitClock = fBRCLK/(UCBRx+1).

    UCA0BR1 = 0;                              //

    UCA0MCTLW = 0;                            // No modulation

    UCA0CTLW0 &= ~UCSWRST;                    // **Initialize USCI state machine**

    UCA0IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt

    TXData = 0x01;                            // Holds TX data


    PM5CTL0 &= ~LOCKLPM5;                     // Disable the GPIO power-on default high-impedance mode

                                              // to activate previously configured port settings

    while(1)

    {

        UCA0IE |= UCTXIE;                     // Enable TX interrupt

        __bis_SR_register(LPM0_bits | GIE);   // enable global interrupts, enter LPM0

        __no_operation();                     // For debug,Remain in LPM0

        __delay_cycles(2000);                 // Delay before next transmission

        TXData++;                             // Increment transmit data

    }

}


#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)

#pragma vector=USCI_A0_VECTOR

__interrupt void USCI_A0_ISR(void)

#elif defined(__GNUC__)

void __attribute__ ((interrupt(USCI_A0_VECTOR))) USCI_A0_ISR (void)

#else

#error Compiler not supported!

#endif

{

    switch(__even_in_range(UCA0IV,USCI_SPI_UCTXIFG))

推荐阅读

史海拾趣

ELINA INDEK公司的发展小趣事

因美纳(Illumina)公司成立于2000年,起初是一家专注于基因测序技术的小型企业。在创始人Jay Flatley的领导下,公司成功研发出了一系列高性能、低成本的基因测序仪器,使得基因测序技术从昂贵的实验室研究工具转变为广泛应用的医疗诊断工具。这一技术突破不仅为因美纳赢得了市场份额,也为整个医疗行业带来了革命性的变化。

ESTEK公司的发展小趣事

ESTEK公司自创立之初,就专注于电子产品的技术创新。在早期的市场竞争中,公司研发团队通过不懈努力,成功研发出一款具有革命性意义的电子元件。这款元件不仅性能卓越,而且成本远低于同类产品,使得ESTEK公司迅速在市场上脱颖而出。随着这款元件的广泛应用,ESTEK公司的知名度逐渐提升,为公司的后续发展奠定了坚实基础。

BOWEI公司的发展小趣事

ESTEK公司自创立之初,就专注于电子产品的技术创新。在早期的市场竞争中,公司研发团队通过不懈努力,成功研发出一款具有革命性意义的电子元件。这款元件不仅性能卓越,而且成本远低于同类产品,使得ESTEK公司迅速在市场上脱颖而出。随着这款元件的广泛应用,ESTEK公司的知名度逐渐提升,为公司的后续发展奠定了坚实基础。

AMI [American Megatrends Inc]公司的发展小趣事

ESTEK公司自创立之初,就专注于电子产品的技术创新。在早期的市场竞争中,公司研发团队通过不懈努力,成功研发出一款具有革命性意义的电子元件。这款元件不仅性能卓越,而且成本远低于同类产品,使得ESTEK公司迅速在市场上脱颖而出。随着这款元件的广泛应用,ESTEK公司的知名度逐渐提升,为公司的后续发展奠定了坚实基础。

East Texas Integrated Circuits公司的发展小趣事

随着市场的不断扩大,ETIC意识到必须不断提升自身的研发实力才能保持竞争优势。因此,公司加大了对研发的投入,引进了一批高端人才和先进的研发设备。同时,ETIC还积极与国内外高校和研究机构开展合作,共同开展前沿技术的研究和开发。这些努力使ETIC在集成电路领域的技术实力得到了显著提升。

飞翼科技(FEIYI)公司的发展小趣事

East Texas Integrated Circuits公司(ETIC)成立于XX世纪初,最初只是一个由几位电子工程师组成的创业团队。他们的梦想是利用最新的技术研发高性能的集成电路。通过不断的努力,他们成功地研发出了一种新型的低功耗集成电路,这种电路能够在保持高速度的同时降低能源消耗,迅速在市场上获得了认可。

问答坊 | AI 解惑

用于汽车防盗器的低功耗无匙进入加密收发器技术

本文分析了不断变化的汽车盗窃手段,以及相应的汽车防盗技术的发展,重点介绍了TI最新的汽车防盗解决方案—DST+收发器的加密技术及系统组成,并阐述了与之兼容的新一代射频识别(RFID)技术方案—三维天线模拟前端芯片实现无匙进入的工作原理。 由 ...…

查看全部问答>

怎样利用MCS51单片机和PTR8000实现无线传输和发送

如题!谢谢大侠们…… 经过几天的努力,我的无线通信的硬件模块已经调试通过了!谢谢大家的帮助! [ 本帖最后由 zhangzhe0124 于 2009-5-19 10:06 编辑 ]…

查看全部问答>

功率测量模块的设计与实现

功率测量模块的设计与实现           (功率测量模块的硬件设计与实现) 要求:以单片机为核心设计一可测量8路功率(1Kw以内)的模块。在该模块中将测量结果用LCD显示,并通过串行接口传送到上位计算机中。请查阅 ...…

查看全部问答>

WinCE的Notification怎么搞啊?

RT. 好像CE 6里面有那个API,请问该怎么弄啊?…

查看全部问答>

WINCE开机自动运行应用程序问题

我按照如下的方法想做一个开机自运行我的应用程序(MyApp.exe),可怎么也不成功.开机后LCD没有显示(黑屏),我查了下WINDOWS目录,其目录下根本没有MyApp.exe.也就是说我的应用程序(MyApp.exe)没有打包进nk.   1. 假定Windows CE.NET目标工程 ...…

查看全部问答>

PXA270关于CF host口的驱动

开发板处理器是PXA270的,现在想在板子上装一个CF无线网卡(NETGEAR MA701),因为板子是自己做的,所以需要修改一下pcmcia的接口驱动。 我是在drivers/pcmcia/pxa2xx_mainstone.c基础上修改的。 现在问题: 1.CF卡在开放板启动起来以后,CF卡上 ...…

查看全部问答>

i2c读写操作时序

i2c协议中提到有三种可能的传输方式 1 主机(发送器)发送到从机(接收器),传输的方向不会改变   S-->Slave Address-->R/W-->A-->Data-->NA-->P 2 在第一个字节后,主机立即读从机。在第一次响应时,主机(发送器)变成主机(接收器), ...…

查看全部问答>

请教问题:error: linking files for incompatible targets ??

本帖最后由 dontium 于 2015-1-23 12:43 编辑 我自己建了个工程,单个文件编译可以通过,但是链接后就出现: [Linking...] \\"d:\\\\ti\\\\c5500\\\\cgtools\\\\bin\\\\cl55\\" -@\\"Debug.lkf\\" >>   error: linking fi ...…

查看全部问答>

SCI中断老是进不去

今天做了一上午发现SCI的中断程序怎么也进不去,最后解决是重新翻看了TI的SCI模块手册,发现自己有一个使能位没有做,导致无法识别。 在此记下,也许有人会跟我一样傻 RXFFIENA Receive FIFO interrupt enable0 RX FIFO interrupt based on RXFF ...…

查看全部问答>

开工第一件事情就是管理层统一更换为智能手机

今年过年就是不停的玩智能手机,自己手上的iPhone 3G,Google的Nexus和三星的P1010,感觉确实不错,并且开通了微博,包括新浪和腾讯的,不仅仅获取了更多的信息,也推广了公司的信息,尤其是经常用它看看书,把零碎的时间都用起来了。回公司发现 ...…

查看全部问答>