MPS430F149单片机之_基于MSP430单片机实现的无线传输模块.c

2019-04-15 14:46发布

#include "Msp430X14X.h" #define CE BIT0 #define CS BIT1 #define PWR_UP BIT3 #define ADDR_INDEX 8 #define ADDR_COUNT 4 void CE_HI(void); void CE_LO(void); void CS_HI(void); void CS_LO(void); void PWR_UP_HI(void); void PWR_UP_LO(void); void Init_CLK(void); void Port_Init(void); void Init_SPI (void); void Delay_us(unsigned long nValue); void Delay_ms(unsigned long nValue); void Init_RF2401(void); char ReceivePacket(void); void TransmitPacket(unsigned char nVal); //定义串口操作变量 unsigned char UART0_TX_BUF[25]; // 串口 0 的发送缓冲区 int nTX0_Len; char nTX0_Flag; int nSend_TX0; int nDR; unsigned char rxConfig[15] = { 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x65, 0x43, 0x21, 0x83, 0x6c, 0x05 }; unsigned char txConfig[15] = { 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x65, 0x43, 0x21, 0x83, 0x6c, 0x04 }; void main(void) { char n; WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗 _DINT(); // 关闭中断 Init_CLK(); Port_Init(); Init_SPI(); _EINT(); // 打开中断 Init_RF2401(); while(1) { TransmitPacket(3); Delay_ms(3); n = ReceivePacket(); } } void Port_Init(void) { P1DIR = 0; //设置CE为输出管脚 P1DIR |= BIT0; //设置CS为输出管脚 P1DIR |= BIT1; //设置PWR_UP为输出管脚 P1DIR |= BIT3; //将中断寄存器清零 P1IE = 0; P1IES = 0; P1IFG = 0; //管脚 P1.2 使能中断 P1IE |= BIT2; //对应的管脚由低到高电平跳变使相应的标志置位 P1IES &= ~(BIT2); //将P3口所有的管脚设置为一般I/O口 P3SEL = 0; //P3.1 P3.2 P3.3被分配为SPI口 P3SEL = BIT3 + BIT2 + BIT1; //P3.3作为输出管脚 P3DIR |= BIT3; //P3.1作为输出管脚 P3DIR |= BIT1; return; } void Init_SPI (void) { //SPI0模块允许 ME1 |= USPIE0; //将寄存器的内容清零 U0CTL = 0X00; //数据为8比特,选择SPI模式,单片机为主机模式 U0CTL |= CHAR + SYNC + MM; //将寄存器的内容清零 U0TCTL = 0X00; // 时钟源为SMCLK,选择3线模式 U0TCTL = CKPH + SSEL1 + SSEL0 + STC; //传输时钟为SMCLK / 800 UBR0_0 = 0X20; UBR1_0 = 0X03; //调整寄存器,没有调整 UMCTL_0 = 0X00; //The modulation control register is not used for SPI mode and should be set to 000h. //发送中断允许 IE1 |= UTXIE0; } void CE_HI(void) //CE高电平 { P1OUT |= BIT0; return; } void CE_LO(void) //ce低 { P1OUT &= ~(BIT0); return; } void CS_HI(void) { P1OUT |= BIT1; return; } void CS_LO(void) { P1OUT &= ~(BIT1); return; } void PWR_UP_HI(void) { P1OUT |= BIT3; return; } void PWR_UP_LO(void) { P1OUT &= ~(BIT3); return; } void Init_CLK(void) { unsigned int i; BCSCTL1 = 0X00; //将Basic Clock System Control Register 1寄存器的内容清零 //XT2震荡器开启 //LFTX1工作在低频模式 //ACLK的分频因子为1 do { IFG1 &= ~OFIFG; // 清除OSCFault标志 for (i = 0x20; i > 0; i--); } while ((IFG1 & OFIFG) == OFIFG); // 如果OSCFault =1 BCSCTL2 = 0X00; //将寄存器的内容清零 BCSCTL2 += SELM1; //MCLK的时钟源为TX2CLK,分频因子为1 BCSCTL2 += SELS; //SMCLK的时钟源为TX2CLK,分频因子为1 } interrupt [UART0TX_VECTOR] void UART0_TX_ISR(void) { if(nTX0_Len != 0) { // 表示缓冲区里的数据没有发送完 nTX0_Flag = 0; TXBUF0 = UART0_TX_BUF[nSend_TX0]; nSend_TX0 += 1; if(nSend_TX0 >= nTX0_Len) { nSend_TX0 = 0; nTX0_Len = 0; nTX0_Flag = 1; } } } interrupt [PORT1_VECTOR] void DR_ISR(void) { if(P1IFG & BIT2) { nDR = 1; // 清除中断标志位 P1IFG &= ~(BIT2); } } void Delay_ms(unsigned long nValue)//毫秒为单位,8MHz为主时钟 { unsigned long nCount; int i; unsigned long j; nCount = 2667; for(i = nValue;i > 0;i--) { for(j = nCount;j > 0;j--); } return; } void Delay_us(unsigned long nValue)//微秒为单位,8MHz为主时钟 { int nCount; int i; int j; nCount = 3; for(i = nValue;i > 0;i--) { for(j = nCount;j > 0;j--); } return; } void Init_RF2401(void) { int i; nDR = 0; //激活nRF2401 PWR_UP_HI(); //延迟 Delay_ms(4); CS_HI(); Delay_us(100); CE_LO(); Delay_us(100); //进入配置模式 //发送配置信息 for(i = 0;i < 15;i++) { UART0_TX_BUF[i] = rxConfig[i]; } nTX0_Len = 15; // 设置中断标志,进入发送中断程序 IFG1 |= UTXIFG0; } void TransmitPacket(unsigned char nVal) { unsigned char i; CS_HI(); Delay_us(10); TXBUF0 = 0x05; CS_LO(); Delay_us(300); CE_HI(); Delay_us(10); for(i = 0;i < ADDR_COUNT;i++) { UART0_TX_BUF[i] = rxConfig[ADDR_INDEX + i]; } UART0_TX_BUF[i] = nVal; nTX0_Len = ADDR_COUNT + 1; // 设置中断标志,进入发送中断程序 IFG1 |= UTXIFG0; CE_LO(); //延迟 Delay_us(300); } char ReceivePacket(void) { char nVal; CS_HI(); Delay_us(10); TXBUF0 = 0x04; CS_LO(); Delay_us(300); CE_HI(); while(1) { if(nDR == 1) { break; } } TXBUF0 = 0x0; while ((IFG1 & UTXIFG0) == 0) ; nVal = RXBUF0; CE_LO(); //延迟 Delay_us(300); return nVal; }