- #include <msp430.h>
- //==============================================================================
- #define uchar unsigned char
- #define uint unsigned int
- #define uclong unsigned long
- //==================TXEN,TRX_CE,PWR_0 为收发模式控制端口======================
- #define TXEN_0 P2OUT &=~BIT0 //输出0
- #define TXEN_1 P2OUT |= BIT0 //输出1
- //==============================================================================
- #define TRX_CE_0 P2OUT &=~BIT1
- #define TRX_CE_1 P2OUT |= BIT1
- //==============================================================================
- #define PWR_0 P2OUT &=~BIT2
- #define PWR_1 P2OUT |= BIT2
- //===================================主入从出===================================
- #define MISO_0 P1OUT &=~BIT2
- #define MISO_1 P1OUT |= BIT2
- //==================================主出从入====================================
- #define MOSI_0 P1OUT &=~BIT1
- #define MOSI_1 P1OUT |= BIT1
- //===================================SPI时钟端口================================
- #define SCK_0 P1OUT &=~BIT4
- #define SCK_1 P1OUT |= BIT4
- //===================================SPI使能端口=================================
- #define CSN_0 P1OUT &=~BIT5
- #define CSN_1 P1OUT |= BIT5
- //==================================以下为状态端口==============================
- //===========================AM 地址匹配=======================================
- #define AM_0 P2OUT &=~BIT5
- #define AM_1 P2OUT |= BIT5
- //=================================DR 数据接收状态==============================
- #define DR_0 P2OUT &=~BIT4
- #define DR_1 P2OUT |= BIT4
- //=====================================CD 载波侦听状态==========================
- #define CD_0 P2OUT &=~BIT3
- #define CD_1 P2OUT |= BIT3
- //==============================================================================
- #define LED1_0 P1OUT &=~BIT0 //输出0
- #define LED1_1 P1OUT |= BIT0 //输出1
- //===========================NRF905:SPI指令=====================================
- #define WC 0x00
- #define RC 0x10
- #define WTP 0x20
- #define RTP 0x21
- #define WTA 0x22
- #define RTA 0x23
- #define RRP 0x24
- //==========================32字节发送数据收发缓冲区============================
- #define TxRxBuf_Len 4
- char TxBuf[TxRxBuf_Len];
- char RxBuf[TxRxBuf_Len];
- //==========================NRF905:10寄存器配置================================
- unsigned char RFConf[11]=
- {
- WC, //SPI写操作命令
- 0x4c, //CH_NO,配置频段在430MHZ
- 0x0C, //输出功率为10db,不重发,节电为正常模式
- 0x44, //地址宽度设置,为4字节
- 0x04,0x04, //接收发送有效数据长度为4字节
- 0xCC,0xCC,0xCC,0xCC, //接收地址
- 0x58, //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
- };
- char TxAddress[4]={0xcc,0xcc,0xcc,0xcc};
- char DATA_BUF;
- /*****************************************************************************
- 系统初始化
- ******************************************************************************/
- void InitSys()
- {
- unsigned int iq0;
- _DINT();
- BCSCTL1 &=~XT2OFF;
- do
- {
- IFG1 &= ~OFIFG; // 清除振荡器失效标志
- for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振
- }
- while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振
- BCSCTL2 =SELM1+SELS; //MCLK,SMCLK时钟为XT2
- //???USART0
- }
- //==============================================================================
- void LED_IO_set(void)
- {
- P1DIR |= 0x01;
- }
- //==============================================================================
- void KEY_IO_set(void)
- {
- P1REN|=BIT3;
- P1DIR &=~BIT3;
- }
- //==========================延时================================================
- void Delay(uchar n)
- {
- uint i;
- while(n--)
- for(i=0;i<80;i++);
- }
- //=========================NRF905 SPI读函数(IO模拟SPI时序)==================
- unsigned char SpiRead(void)
- {
- unsigned char i;
- for (i=0;i<8;i++)
- {
- DATA_BUF=DATA_BUF<<1;
- SCK_1;
- if ((P1IN&0x04)) //读取最高位,保存至最末尾,通过左移位完成整个字节
- {
- DATA_BUF|=0x01;
- }
- else
- {
- DATA_BUF&=~(0x01);
- }
- SCK_0;
- }
- return DATA_BUF;
- }
- //=========================NRF905 SPI读写函数(IO模拟SPI时序)==================
- void SpiWrite(unsigned char send)
- {
- unsigned char i;
- DATA_BUF=send;
- for (i=0;i<8;i++)
- {
- if (((DATA_BUF&0x80) != 0)) //总是发送最高位
- {
- MOSI_1;
- }
- else
- {
- MOSI_0;
- }
- SCK_1;
- DATA_BUF=DATA_BUF<<1;
- SCK_0;
- }
- }
- //===========================初始化nRF905=======================================
- void nRF905_IO_set(void)
- {
- P2DIR |= 0x07; P2DIR &= 0xC7; P2SEL&=0x84;
- P1DIR |= 0xC0; P1DIR |= 0xFB; P1SEL&=0xE0;
- CSN_1; // Spi disable
- SCK_0; // Spi clock line init low
- PWR_1; // nRF905 power on
- TRX_CE_0; // Set nRF905 in standby mode
- TXEN_0; // set radio in Rx mode
- }
- //==================================初始化NRF905================================
- void Config905(void)
- {
- uchar i;
- CSN_0; // Spi enable for write a spi command
- for (i=0;i<11;i++) // Write configration words 写放配置字
- {
- SpiWrite(RFConf<i>);
- }
- CSN_1; //关闭SPI
- }
- //=========================NRF905装载地址+数据打包+数据发送=====================
- void TxPacket(char *data_Bufer)
- {
- uchar i;
- CSN_0;
- SpiWrite(WTP); // 待发数据装载命令
- for (i=0;i<4;i++)
- {
- SpiWrite(data_Bufer<i>);
- }
- CSN_1; // 关闭SPI
- Delay(1);
- CSN_0; // 打开SPI
- SpiWrite(WTA); // 写入地址要和接收方地址一样
- for (i=0;i<4;i++) // 4字节地址
- {
- SpiWrite(TxAddress<i>);
- }
- CSN_1; //关闭SPI
- TRX_CE_1; // Set TRX_CE high,start Tx data transmission
- Delay(10); // while (DR!=1); 延时时间不能太短
- TRX_CE_0; // Set TRX_CE low
- }
- //==================================发送模式初始化-=============================
- void SetTxMode(void)
- {
- TRX_CE_0;
- TXEN_1;
- Delay(1); // Delay for mode change(>=650us)
- }
- //=========DR检测,当 收到数据后DR置1,当把数据读出来后DR清0=====================
- unsigned char CheckDR(void) //检查是否有新数据传入 Data Ready
- {
- if ((P2IN&0x10))
- {
- return 1;
- }
- else
- {
- return 0;
- }
- }
- //==============================================================================
- void SetRxMode(void)
- {
- TXEN_0;
- TRX_CE_1;
- Delay(1); // delay for mode change(>=650us)
- }
- //=================================数据接收=====================================
- void RxPacket(void)
- {
- char i;
- Delay(1);
- Delay(100);
- TRX_CE_0;
- CSN_0; // SPI使能(Spi enable for write a spi command)
- Delay(1);
- SpiWrite(RRP); // 读SPI数据命令(Read payload command)
- for (i = 0 ;i <4 ;i++)
- {
- RxBuf<i>=SpiRead(); // Read data and save to buffer
- }
- CSN_1;
- Delay(10);
- TRX_CE_1;
- }
- //==========================NRF905数据接收流程================================
- void RX(void)
- {
- SetRxMode(); // Set nRF905 in Rx mode
- // while (CheckDR()==0);
- Delay(10);
- RxPacket(); // Recive data by nRF905
- Delay(10);
- //=============================================================================
- if(RxBuf[0]==0x29)
- {
- P1OUT^=BIT0;
- }
- RxBuf[0]=0x00;
- }
- //==================================主函数=====================================
- void main(void)
- {
- char tf;
- WDTCTL = WDTPW + WDTHOLD;
- InitSys();
- nRF905_IO_set();
- LED_IO_set();
- KEY_IO_set(); //KEY端口设置
- Config905();
- while(1)
- {
- RX();//接收数据
- //==================================================
- if((P1IN&0x08)) //检测按键
- {
- TxBuf[0]=0x29;tf = 1 ; LED1_1;
- }
- if(tf==1) //有按键后发送数据
- {
- SetTxMode(); TxPacket(TxBuf);
- tf = 0;
- TxBuf[0]=0x00;
- }
- }
- }
- </i></i></i></i>
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>