C++语言:
MSP430F5438A的SPI通信例程
01
//===========================================================================//
02 // //
03 // 文件: MAIN.C //
04 // 说明: BW-DK5438开发板单片机SPI端口实验程序 //
05 // 设置SPI端口工作模式,通过SPI端口发送数据 //
06 // 可在P3.1/P3.3端口观察数据、时钟波形 //
07 // 编译: IAR Embedded Workbench IDE for MSP430 v4.21 //
08 // 版本: v1.1 //
09 // 编写: JASON.ZHANG //
10 // 版权: 北京拓普博维电子技术有限公司 //
11 // //
12 //===========================================================================//
13
14 #include "msp430x54x.h"
15 #include <stdlib.h>
16 #include <stdio.h>
17 #include <string.h>
18 #include "PIN_DEF.H"
19
20 #define FLL_FACTOR 649 // FLL_FACTOR: DCO倍频系数
21 char event , RXBuffer [ 2 ] ;
22
23
24 //***************************************************************************//
25 // //
26 // 初始化主时钟: MCLK = XT1×(FLL_FACTOR+1) //
27 // //
28 //***************************************************************************//
29 void Init_CLK( void)
30 {
31 WDTCTL = WDTPW + WDTHOLD ; // 关看门狗
32 P7SEL |= 0x03 ; // 端口选择外部低频晶振XT1
33 UCSCTL6 &=~ XT1OFF ; // 使能外部晶振
34 UCSCTL6 |= XCAP_3 ; // 设置内部负载电容
35 UCSCTL3 |= SELREF_2 ; // DCOref = REFO
36 UCSCTL4 |= SELA_0 ; // ACLK = XT1
37 __bis_SR_register( SCG0) ; // 关闭FLL控制回路
38 UCSCTL0 = 0x0000 ; // 设置DCOx, MODx
39 UCSCTL1 = DCORSEL_7 ; // 设置DCO振荡范围
40 UCSCTL2 = FLLD__1 + FLL_FACTOR ; // Fdco = ( FLL_FACTOR + 1)×FLLRef = (649 + 1) * 32768 = 21.2992MHz
41 __bic_SR_register( SCG0) ; // 打开FLL控制回路
42 __delay_cycles( 1024000) ;
43 do
44 {
45 UCSCTL7 &= ~( XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // 清除 XT2,XT1,DCO 错误标志
46 SFRIFG1 &= ~ OFIFG ;
47 } while( SFRIFG1 & OFIFG) ; // 检测振荡器错误标志
48 }
49
50 //***************************************************************************//
51 // //
52 // Init_Port(void): 设置IO端口 //
53 // //
54 //***************************************************************************//
55 void Init_Port( void)
56 {
57 P5DIR |= POWER ; // 主电源
58 MAIN_POWER_ON ;
59 P7DIR |= LED_PWR ; // 发光二极管电源
60 P7OUT &=~ LED_PWR ;
61 INTERNAL_PULL_UP ; // 使能键盘端口内部上拉电阻
62 ROW_IN_COL_OUT ; // 设置行输入,列输出0
63 }
64
65 //***************************************************************************//
66 // //
67 // Init_SPI(void): 设置SPI端口 //
68 // //
69 //***************************************************************************//
70 void Init_SPI( void)
71 {
72 P8OUT |= LCD_NCS ; // SPI端口复用,DisableTFT液晶端口
73 P8DIR |= LCD_NCS ;
74 P3OUT |= NCS25 ;
75 P3DIR |= NCS25 ;
76 P3SEL &= 0xF0 ;
77 P3SEL |= 0x0E ; // // P3.1/2/3功能选择为SPI
78 UCB0CTL1 |= UCSWRST ; // 复位SPI状态机
79 UCB0CTL0 |= UCMST + UCSYNC + UCCKPL + UCMSB ; // 3-pin, 8-bit SPI master, Clock polarity high, MSB
80 UCB0CTL1 |= UCSSEL_2 ; // 选择SCK参考源为SMCLK
81 UCB0BR0 = 0x02 ; // SCK = SMCK/2
82 UCB0BR1 = 0 ;
83 UCB0CTL1 &=~ UCSWRST ; // SPI状态机使能
84 }
85
86
87 void main( void )
88 {
89 WDTCTL = WDTPW + WDTHOLD ;
90 Init_CLK() ;
91 Init_Port() ;
92 Init_SPI() ;
93 for(;;)
94 {
95 UCB0TXBUF = 0x55 ;
96 __delay_cycles( 280) ;
97 }
98 }
02 // //
03 // 文件: MAIN.C //
04 // 说明: BW-DK5438开发板单片机SPI端口实验程序 //
05 // 设置SPI端口工作模式,通过SPI端口发送数据 //
06 // 可在P3.1/P3.3端口观察数据、时钟波形 //
07 // 编译: IAR Embedded Workbench IDE for MSP430 v4.21 //
08 // 版本: v1.1 //
09 // 编写: JASON.ZHANG //
10 // 版权: 北京拓普博维电子技术有限公司 //
11 // //
12 //===========================================================================//
13
14 #include "msp430x54x.h"
15 #include <stdlib.h>
16 #include <stdio.h>
17 #include <string.h>
18 #include "PIN_DEF.H"
19
20 #define FLL_FACTOR 649 // FLL_FACTOR: DCO倍频系数
21 char event , RXBuffer [ 2 ] ;
22
23
24 //***************************************************************************//
25 // //
26 // 初始化主时钟: MCLK = XT1×(FLL_FACTOR+1) //
27 // //
28 //***************************************************************************//
29 void Init_CLK( void)
30 {
31 WDTCTL = WDTPW + WDTHOLD ; // 关看门狗
32 P7SEL |= 0x03 ; // 端口选择外部低频晶振XT1
33 UCSCTL6 &=~ XT1OFF ; // 使能外部晶振
34 UCSCTL6 |= XCAP_3 ; // 设置内部负载电容
35 UCSCTL3 |= SELREF_2 ; // DCOref = REFO
36 UCSCTL4 |= SELA_0 ; // ACLK = XT1
37 __bis_SR_register( SCG0) ; // 关闭FLL控制回路
38 UCSCTL0 = 0x0000 ; // 设置DCOx, MODx
39 UCSCTL1 = DCORSEL_7 ; // 设置DCO振荡范围
40 UCSCTL2 = FLLD__1 + FLL_FACTOR ; // Fdco = ( FLL_FACTOR + 1)×FLLRef = (649 + 1) * 32768 = 21.2992MHz
41 __bic_SR_register( SCG0) ; // 打开FLL控制回路
42 __delay_cycles( 1024000) ;
43 do
44 {
45 UCSCTL7 &= ~( XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // 清除 XT2,XT1,DCO 错误标志
46 SFRIFG1 &= ~ OFIFG ;
47 } while( SFRIFG1 & OFIFG) ; // 检测振荡器错误标志
48 }
49
50 //***************************************************************************//
51 // //
52 // Init_Port(void): 设置IO端口 //
53 // //
54 //***************************************************************************//
55 void Init_Port( void)
56 {
57 P5DIR |= POWER ; // 主电源
58 MAIN_POWER_ON ;
59 P7DIR |= LED_PWR ; // 发光二极管电源
60 P7OUT &=~ LED_PWR ;
61 INTERNAL_PULL_UP ; // 使能键盘端口内部上拉电阻
62 ROW_IN_COL_OUT ; // 设置行输入,列输出0
63 }
64
65 //***************************************************************************//
66 // //
67 // Init_SPI(void): 设置SPI端口 //
68 // //
69 //***************************************************************************//
70 void Init_SPI( void)
71 {
72 P8OUT |= LCD_NCS ; // SPI端口复用,DisableTFT液晶端口
73 P8DIR |= LCD_NCS ;
74 P3OUT |= NCS25 ;
75 P3DIR |= NCS25 ;
76 P3SEL &= 0xF0 ;
77 P3SEL |= 0x0E ; // // P3.1/2/3功能选择为SPI
78 UCB0CTL1 |= UCSWRST ; // 复位SPI状态机
79 UCB0CTL0 |= UCMST + UCSYNC + UCCKPL + UCMSB ; // 3-pin, 8-bit SPI master, Clock polarity high, MSB
80 UCB0CTL1 |= UCSSEL_2 ; // 选择SCK参考源为SMCLK
81 UCB0BR0 = 0x02 ; // SCK = SMCK/2
82 UCB0BR1 = 0 ;
83 UCB0CTL1 &=~ UCSWRST ; // SPI状态机使能
84 }
85
86
87 void main( void )
88 {
89 WDTCTL = WDTPW + WDTHOLD ;
90 Init_CLK() ;
91 Init_Port() ;
92 Init_SPI() ;
93 for(;;)
94 {
95 UCB0TXBUF = 0x55 ;
96 __delay_cycles( 280) ;
97 }
98 }