打印

MSP430 SPI学习分享-基于MSP-EXP430FR5969

[复制链接]
1715|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dirtwillfly|  楼主 | 2017-7-15 16:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实例代码:
//   MSP430F59xx Demo - eUSCI_A0, SPI 3-Wire Master Incremented Data
//
//   Description: SPI master talks to SPI slave using 3-wire mode. Incrementing
//   data is sent by the master starting at 0x01. Received data is expected to
//   be same as the previous transmission TXData = RXData-1.
//   USCI RX ISR is used to handle communication with the CPU, normally in LPM0.
//   ACLK = 32.768kHz, MCLK = SMCLK = DCO ~1MHz.  BRCLK = ACLK/2
//
//
//                   MSP430FR5969
//                 -----------------
//            /|\ |              XIN|-
//             |  |                 |  32KHz Crystal
//             ---|RST          XOUT|-
//                |                 |
//                |             P2.0|-> Data Out (UCA0SIMO)
//                |                 |
//                |             P2.1|<- Data In (UCA0SOMI)
//                |                 |
//                |             P1.5|-> Serial Clock Out (UCA0CLK)
//
//   P. Thanigai
//   Texas Instruments Inc.
//   Feb 2012
//   Built with CCS V5.5
//******************************************************************************
#include <msp430.h>

volatile unsigned char RXData = 0;
volatile unsigned char TXData;

int main(void)
{
  WDTCTL = WDTPW | WDTHOLD;                 // Stop watchdog timer

  // Configure GPIO
  P1SEL1 |= BIT5;                           // USCI_A0 operation
  P2SEL1 |= BIT0 | BIT1;                    // USCI_A0 operation
  PJSEL0 |= BIT4 | BIT5;                    // For XT1

  // Disable the GPIO power-on default high-impedance mode to activate
  // previously configured port settings
  PM5CTL0 &= ~LOCKLPM5;

  // XT1 Setup
  CSCTL0_H = CSKEY >> 8;                    // Unlock CS registers
  CSCTL1 = DCOFSEL_0;                       // Set DCO to 1MHz
  CSCTL2 = SELA__LFXTCLK | SELS__DCOCLK | SELM__DCOCLK;
  CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1;     // set all dividers
  CSCTL4 &= ~LFXTOFF;
  do
  {
    CSCTL5 &= ~LFXTOFFG;                    // Clear XT1 fault flag
    SFRIFG1 &= ~OFIFG;
  }while (SFRIFG1&OFIFG);                   // Test oscillator fault flag
  CSCTL0_H = 0;                             // Lock CS registers

  // Configure USCI_A0 for SPI operation
  UCA0CTLW0 = UCSWRST;                      // **Put state machine in reset**
  UCA0CTLW0 |= UCMST | UCSYNC | UCCKPL | UCMSB; // 3-pin, 8-bit SPI master
                                            // Clock polarity high, MSB
  UCA0CTLW0 |= UCSSEL__ACLK;                // ACLK
  UCA0BR0 = 0x02;                           // /2
  UCA0BR1 = 0;                              //
  UCA0MCTLW = 0;                            // No modulation
  UCA0CTLW0 &= ~UCSWRST;                    // **Initialize USCI state machine**
  UCA0IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt
  TXData = 0x1;                             // Holds TX data

  while(1)
  {
    UCA0IE |= UCTXIE;
    __bis_SR_register(LPM0_bits | GIE);     // CPU off, enable interrupts
    __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))
  {
    case USCI_NONE: break;
    case USCI_SPI_UCRXIFG:
      RXData = UCA0RXBUF;
      UCA0IFG &= ~UCRXIFG;
      __bic_SR_register_on_exit(LPM0_bits); // Wake up to setup next TX
      break;
    case USCI_SPI_UCTXIFG:
      UCA0TXBUF = TXData;                   // Transmit characters
      UCA0IE &= ~UCTXIE;
      break;
    default: break;
  }
}


分析:直接分析SPI部分,其实这篇的话也是对我自己一些不理解的进行提问,希望能得到解答。这系列可以说是虎头蛇尾吧,不好意思。

1、配置USCI_A0为I2C模式。
(1)在配置或者重新配置eUSCI_A模块时应该先将UCSWRST置1以避免出现配置错误,配置完之后释放复位。


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

(2)设置模式。



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


其中,UCMST = 0x0800,  UCSYNC = 0x0100, UCCKPL = 0x4000, UCMSB = 0x2000。
这里我们会发现,eUSCI_A在UART和SPI两种模式下,UCAxCTLW0 寄存器是不一样的。我有一个疑问:
eUSCI_A在UART和SPI两种模式是通过哪里切换的,只要PxSEL设置了两个引脚就是UART模式,四个引脚就自动进入SPI模式?

(3)选择eUSCI_A时钟源
  UCA0CTLW0 |= UCSSEL__ACLK;                // ACLK


其中,UCSSEL__ACLK = 0x0040。
(4)设置设置比特率。
  UCA0BR0 = 0x02;                           // /2
  UCA0BR1 = 0;                                //
fBitClock = fBRCLK/UCBRx
(5)我在SPI的模式说明里发现没有对UCA0MCTLW这个寄存器的说明,是不是和UART模式时的寄存器一模一样。用来配置波特率参数?希望有知道的帮忙解答下这条代码的作用:

  UCA0MCTLW = 0;                            // No modulation
(6)使能中断

  UCA0IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt
2、处理函数(参考UART和I2C,这里不详述)
3、对于中断子程序(参考UART和I2C,这里不详述)
转自http://www.deyisupport.com/quest ... /f/55/t/134870.aspx

相关帖子

沙发
dirtwillfly|  楼主 | 2017-7-15 16:01 | 只看该作者
MSP430FR5969 SPI 测试.pdf (248.62 KB)

使用特权

评论回复
板凳
fentianyou| | 2017-7-16 22:50 | 只看该作者

使用特权

评论回复
地板
fentianyou| | 2017-7-16 22:52 | 只看该作者

跟着版主学习一下铁电处理器。

使用特权

评论回复
5
touser| | 2017-7-19 23:08 | 只看该作者

使用特权

评论回复
6
touser| | 2017-7-19 23:11 | 只看该作者
这个是TI的评估板吗?

使用特权

评论回复
7
tongbu2015| | 2017-7-22 15:20 | 只看该作者
SPI总线的设计还是蛮重要的。

使用特权

评论回复
8
jstgotodo| | 2017-7-24 22:05 | 只看该作者
SPI一般都是模拟使用。

使用特权

评论回复
9
jstgotodo| | 2017-7-24 22:07 | 只看该作者
这个模拟spi怎么中断接收数据?

使用特权

评论回复
10
firstblood| | 2017-7-24 22:29 | 只看该作者
这个是最基本的SPI总线的应用程序分享。

使用特权

评论回复
11
10299823| | 2017-7-25 22:41 | 只看该作者
这个spi模拟能够实现吗?

使用特权

评论回复
12
10299823| | 2017-7-25 22:42 | 只看该作者
读取SD卡,做FATFS系统的。

使用特权

评论回复
13
plsbackup| | 2017-7-26 12:09 | 只看该作者
心率传感器的程序有吗?

使用特权

评论回复
14
plsbackup| | 2017-7-26 12:11 | 只看该作者
MSP430Fr5969的AD是12位的,可以做心率采集吗?

使用特权

评论回复
15
minzisc| | 2017-8-2 21:49 | 只看该作者

使用特权

评论回复
16
minzisc| | 2017-8-2 21:52 | 只看该作者
现在这个使用模拟spi是不是调试方便一些?

使用特权

评论回复
17
wangdezhi| | 2017-8-3 17:07 | 只看该作者
10299823 发表于 2017-7-25 22:41
这个spi模拟能够实现吗?

集成数据的SPI更省事。

使用特权

评论回复
18
wangdezhi| | 2017-8-3 17:10 | 只看该作者
minzisc 发表于 2017-8-2 21:52
现在这个使用模拟spi是不是调试方便一些?

现在都是使用自带的spi通信技术,不用自己读写更多。

使用特权

评论回复
19
htmlme| | 2017-8-6 22:47 | 只看该作者

这个MSP430FR5969能够自测吗?

使用特权

评论回复
20
htmlme| | 2017-8-6 22:49 | 只看该作者

怎么才能自收自发测试spi?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:欢迎进入TI MCU论坛      21ic TI技术交流1群:61549143(已满),  21ic TI技术交流2群:311421422 我的博客:http://blog.timcu.com/

1180

主题

34838

帖子

1117

粉丝