//******************************************************************************
// MSP430P149 Demo - SPI0(nRF905), Ultra-Low Pwr UART 9600 Echo ISR, 32kHz ACLK
//
// Description: Echo a received character, RX ISR used. Normal mode is LPM3,
// USART1 RX interrupt triggers TX Echo.
// ACLK = UCLK1 = LFXT1 = 32768, MCLK = SMCLK = DCO~ 800k
// Baud rate divider with 32768hz XTAL @9600 = 32768Hz/9600 = 3.41 (0003h 4Ah )
// //* An external watch crystal is required on XIN XOUT for ACLK *//
//
//
// MSP430F149
// -----------------
// /|\| XIN|-
// | | | 32kHz
// --|RST XOUT|-
// | |
// | |
// | P65 P3.1 |<----WL_MOSI
// | P64 P3.2 |<----WL_MISO
// | P66 P3.3 |<----WL_SCK
// | P67 P5.4 |<----WL_CSN
// | P11 P5.0 |<----TRX_CE
// | P12 P5.1 |<----TXEN
// | P63 P5.2 |<----DR
// | P60 P5.3 |<----PWR
// | |
// Copyright (c) 2009.04 WH, All Rights Reserved.
// WebSite:www.smart-dz.cn
// Email:dragonhzw@163.com
// Description : The SPI0(nRF905) module
// History :
// [Author] [Date] [Version] [Description]
// [1] dragonhzw 2009/04/09 Ver 1.0.0 Initial file.
//
// Built with IAR Assembler for MSP430V3.20A/W32 (3.20.1.9)
//******************************************************************************
#include <msp430x14x.h>
#include "nRF905RX.h"
#include "_printf.h"
/***FUNC+*********************************************************************/
/* Name : Delay_Ms */
/* Descrp : Delay timer. */
/* Input : None. */
/* Output : None. */
/* Return : None. */
/***FUNC-*********************************************************************/
void delay_us(unsigned int t)
{
while(--t>0)
{
_NOP();
_NOP();
_NOP();
_NOP();
}
}
void Delay_Ms(unsigned int t)
{
while(t-->0)
delay_us(100);
}
/***FUNC+*********************************************************************/
/* Name : Init_CLK */
/* Descrp : Set PLL Clock. */
/* Input : None. */
/* Output : None. */
/* Return : None. */
/***FUNC-*********************************************************************/
void Init_Port(void)
{
//将P6口所有的管脚在初始化的时候设置为输入方式
P6DIR = 0;
//将P6口所有的管脚设置为一般I/O口
P6SEL = 0;
P6DIR |= BIT7;//P6.7设置为输出方向
P6DIR |= BIT6;//P6.6设置为输出方向
P6DIR |= BIT5;//P6.5设置为输出方向
P6DIR &= ~(BIT4);//P6.4设置为输入方向
P6DIR &= ~(BIT3); //P6.3作为输入管脚
P6DIR |= BIT0;//P6.0设置为输出方向
//P6.7 输出高电平,使nRF905不被选通
P6OUT |= BIT7;
//将P1口所有的管脚在初始化的时候设置为输入方式
P1DIR |= BIT1;//P1.1设置为输出方向
P1DIR |= BIT2;//P1.2设置为输出方向
return;
}
/***FUNC+*********************************************************************/
/* Name : Init_CLK */
/* Descrp : Set PLL Clock. */
/* Input : None. */
/* Output : None. */
/* Return : None. */
/***FUNC-*********************************************************************/
void Init_CLK(void)
{
unsigned int iq0;
BCSCTL1&=~0X00; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振
}
while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振
BCSCTL2 =SELM_2+SELS; //选择MCLK、SMCLK为XT2
// _EINT(); //打开全局中断控制,若不需要打开,可以屏蔽本句
}
/***FUNC+*********************************************************************/
/* Name : main */
/* Descrp : main process */
/* Input : None. */
/* Output : None. */
/* Return : None. */
/***FUNC-*********************************************************************/
void main(void)
{
short sIndex =0;
unsigned char Data = 0;
// 停止WDT
WDTCTL = WDTPW + WDTHOLD;
//初始化时钟
Init_CLK();
//端口初始化
Init_Port();
//SPI初始化
Init_UART0();
Uart_Printf("\r\nMSP430F149 development board SPI0(nRF905) Port Test!\r\n");
while(1)
{
Uart_Printf("\r\nPlease Select Enter Number[1]: ");
sIndex = Uart_GetIntNum();
Uart_Printf("\r\n");
if (0x1 == sIndex)
{
ConfignRF905();
Delay_Ms(0xFF);
Uart_Printf("\r\nReceive data to nRF905 ... \r\n");
SET_IO_PWR;
CLR_IO_TXEN;
SET_IO_TRXCE; //接收
while(!DR_Data_In) ; //等待接收
while(DR_Data_In) //接收数据准备就绪
{
SET_IO_PWR; //进入待机模式
CLR_IO_TRXCE;
CLR_IO_TXEN;;
CLR_SPI_CS; //片选
SpiWrite(0x24); //写读接收数据配置字
Data= SpiRead();
SET_SPI_CS;
if(Data!=0x00)
{
Uart_Printf("\r\nReceive data:%d\r\n",Data);
}
}
}
}
}
/***FUNC+*********************************************************************/
/* Name : ConfignRF905 */
/* Descrp : ConfignRF905 process */
/* Input : None. */
/* Output : None. */
/* Return : None. */
/***FUNC-*********************************************************************/
void ConfignRF905(void)
{
SET_SPI_CS;
CLR_SPI_SCK;
SET_IO_PWR;
CLR_IO_TRXCE;
CLR_IO_TXEN;
Delay_Ms(2);
CLR_SPI_CS;
SpiWrite( 0x00); //配置命令//
SpiWrite( 0x6C); //CH_NO,配置频段在430MHZ 4c
SpiWrite( 0x0C); //输出功率为10db,不重发,节电为正常模式 0c
SpiWrite( 0x44); //地址宽度设置,为4字节
SpiWrite( 0x01);
SpiWrite( 0x01); //接收发送有效数据长度为1字节
SpiWrite( 0x5A); //接收地址 4字节
SpiWrite( 0x5A);
SpiWrite( 0x5A);
SpiWrite( 0x5A);
SpiWrite( 0xD8); //6位CRC校验,CRC充许,16M晶振
SET_SPI_CS;
}
/***************************************************************************************************
Function: SpiRead
Description: Read a byte from SPI