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

[复制链接]
2240|20
 楼主| dirtwillfly 发表于 2017-7-15 16:00 | 显示全部楼层 |阅读模式
实例代码:
  1. //   MSP430F59xx Demo - eUSCI_A0, SPI 3-Wire Master Incremented Data
  2. //
  3. //   Description: SPI master talks to SPI slave using 3-wire mode. Incrementing
  4. //   data is sent by the master starting at 0x01. Received data is expected to
  5. //   be same as the previous transmission TXData = RXData-1.
  6. //   USCI RX ISR is used to handle communication with the CPU, normally in LPM0.
  7. //   ACLK = 32.768kHz, MCLK = SMCLK = DCO ~1MHz.  BRCLK = ACLK/2
  8. //
  9. //
  10. //                   MSP430FR5969
  11. //                 -----------------
  12. //            /|\ |              XIN|-
  13. //             |  |                 |  32KHz Crystal
  14. //             ---|RST          XOUT|-
  15. //                |                 |
  16. //                |             P2.0|-> Data Out (UCA0SIMO)
  17. //                |                 |
  18. //                |             P2.1|<- Data In (UCA0SOMI)
  19. //                |                 |
  20. //                |             P1.5|-> Serial Clock Out (UCA0CLK)
  21. //
  22. //   P. Thanigai
  23. //   Texas Instruments Inc.
  24. //   Feb 2012
  25. //   Built with CCS V5.5
  26. //******************************************************************************
  27. #include <msp430.h>

  28. volatile unsigned char RXData = 0;
  29. volatile unsigned char TXData;

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

  33.   // Configure GPIO
  34.   P1SEL1 |= BIT5;                           // USCI_A0 operation
  35.   P2SEL1 |= BIT0 | BIT1;                    // USCI_A0 operation
  36.   PJSEL0 |= BIT4 | BIT5;                    // For XT1

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

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

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

  63.   while(1)
  64.   {
  65.     UCA0IE |= UCTXIE;
  66.     __bis_SR_register(LPM0_bits | GIE);     // CPU off, enable interrupts
  67.     __delay_cycles(2000);                   // Delay before next transmission
  68.     TXData++;                               // Increment transmit data
  69.   }
  70. }

  71. #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
  72. #pragma vector=USCI_A0_VECTOR
  73. __interrupt void USCI_A0_ISR(void)
  74. #elif defined(__GNUC__)
  75. void __attribute__ ((interrupt(USCI_A0_VECTOR))) USCI_A0_ISR (void)
  76. #else
  77. #error Compiler not supported!
  78. #endif
  79. {
  80.   switch(__even_in_range(UCA0IV, USCI_SPI_UCTXIFG))
  81.   {
  82.     case USCI_NONE: break;
  83.     case USCI_SPI_UCRXIFG:
  84.       RXData = UCA0RXBUF;
  85.       UCA0IFG &= ~UCRXIFG;
  86.       __bic_SR_register_on_exit(LPM0_bits); // Wake up to setup next TX
  87.       break;
  88.     case USCI_SPI_UCTXIFG:
  89.       UCA0TXBUF = TXData;                   // Transmit characters
  90.       UCA0IE &= ~UCTXIE;
  91.       break;
  92.     default: break;
  93.   }
  94. }


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

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


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

(2)设置模式。



  1.   UCA0CTLW0 |= UCMST | UCSYNC | UCCKPL | UCMSB;     // 3-pin, 8-bit SPI master
  2.                                                                                               // 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时钟源
  1.   UCA0CTLW0 |= UCSSEL__ACLK;                // ACLK


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

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

  1.   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 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
fentianyou 发表于 2017-7-16 22:50 | 显示全部楼层
fentianyou 发表于 2017-7-16 22:52 | 显示全部楼层

跟着版主学习一下铁电处理器。
touser 发表于 2017-7-19 23:08 | 显示全部楼层
touser 发表于 2017-7-19 23:11 | 显示全部楼层
这个是TI的评估板吗?
tongbu2015 发表于 2017-7-22 15:20 | 显示全部楼层
SPI总线的设计还是蛮重要的。
jstgotodo 发表于 2017-7-24 22:05 | 显示全部楼层
SPI一般都是模拟使用。
jstgotodo 发表于 2017-7-24 22:07 | 显示全部楼层
这个模拟spi怎么中断接收数据?
firstblood 发表于 2017-7-24 22:29 | 显示全部楼层
这个是最基本的SPI总线的应用程序分享。
10299823 发表于 2017-7-25 22:41 | 显示全部楼层
这个spi模拟能够实现吗?
10299823 发表于 2017-7-25 22:42 | 显示全部楼层
读取SD卡,做FATFS系统的。
plsbackup 发表于 2017-7-26 12:09 | 显示全部楼层
心率传感器的程序有吗?
plsbackup 发表于 2017-7-26 12:11 | 显示全部楼层
MSP430Fr5969的AD是12位的,可以做心率采集吗?
minzisc 发表于 2017-8-2 21:49 | 显示全部楼层
minzisc 发表于 2017-8-2 21:52 | 显示全部楼层
现在这个使用模拟spi是不是调试方便一些?
wangdezhi 发表于 2017-8-3 17:07 | 显示全部楼层
10299823 发表于 2017-7-25 22:41
这个spi模拟能够实现吗?

集成数据的SPI更省事。
wangdezhi 发表于 2017-8-3 17:10 | 显示全部楼层
minzisc 发表于 2017-8-2 21:52
现在这个使用模拟spi是不是调试方便一些?

现在都是使用自带的spi通信技术,不用自己读写更多。
htmlme 发表于 2017-8-6 22:47 | 显示全部楼层

这个MSP430FR5969能够自测吗?
htmlme 发表于 2017-8-6 22:49 | 显示全部楼层

怎么才能自收自发测试spi?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

1199

主题

35121

帖子

1122

粉丝
快速回复 在线客服 返回列表 返回顶部