完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
怎么也检查不出问题#include
//============================================================================== #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字节 0x20,0x20, //接收发送有效数据长度为4字节 0xCC,0xCC,0xCC,0xCC, //接收地址 0x58, //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振 }; uchar TxAddress[4]={0xcc,0xcc,0xcc,0xcc}; uchar 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; CD_0; AM_1; DR_1; 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<10;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(500); // 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(100); TRX_CE_1; } //==========================NRF905数据接收流程================================ void RX(void) { SetRxMode(); // Set nRF905 in Rx mode // while (CheckDR()==0); Delay(10); RxPacket(); // Recive data by nRF905 Delay(100); //============================================================================= if(RxBuf[0]==0x29) { P1OUT^=BIT0; } RxBuf[0]=0x00; } //==================================主函数===================================== void main(void) { char tf; WDTCTL = WDTPW + WDTHOLD; InitSys(); nRF905_IO_set(); Delay(100); 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; } } } |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
3039个成员聚集在这个小组
加入小组2941 浏览 1 评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3620 浏览 2 评论
请问怎么把下面51单片机的代码改成msp430 g2 pocket的代码,还有改下时间变成30秒
2351 浏览 1 评论
4817 浏览 1 评论
2579 浏览 1 评论
1339浏览 3评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3620浏览 2评论
2941浏览 1评论
1527浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-4 15:44 , Processed in 1.413616 second(s), Total 42, Slave 35 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号