6765|16

324

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

msp430g2553+nrf24l01程序 [复制链接]

 
自己写了改了一个程序,使用msp430g2553控制nrf24l01的程序,,下面的是接收端的程序。测试过可以用,有需要的可以参考一下。

#include "msp430g2553.h"

#define uchar unsigned char
#define uint unsigned int

#define CPU_F          ((double)1000000)
#define delay_us(x)      __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x)         __delay_cycles((long)(CPU_F*(double)x/1000.0))

uchar RxBuf[3];

#define RF24L01_CE_0 P2OUT&=~BIT0
#define RF24L01_CE_1 P2OUT|=BIT0
#define RF24L01_MOSI_0 P2OUT&=~BIT4
#define RF24L01_MOSI_1 P2OUT|=BIT4
#define RF24L01_SCK_0 P2OUT&=~BIT1
#define RF24L01_SCK_1 P2OUT|=BIT1
#define RF24L01_CSN_0 P2OUT&=~BIT3
#define RF24L01_CSN_1 P2OUT|=BIT3

#define RF24L01_MISO P2IN&BIT2
#define RF24L01_IRQ P2IN&BIT5

#define TX_ADR_WIDTH    5           // 5 uints TX address width
#define RX_ADR_WIDTH    5           // 5 uints RX address width
#define TX_PLOAD_WIDTH  3         // 20 uints TX payload
#define RX_PLOAD_WIDTH  3         // 20 uints TX payload
char TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //本地地址
char RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //接收地址
//***************************************NRF24L01寄存器指令

*******************************************************
#define READ_REG        0x00          // 读寄存器指令
#define WRITE_REG       0x20         // 写寄存器指令
#define RD_RX_PLOAD     0x61          // 读取接收数据指令
#define WR_TX_PLOAD     0xA0          // 写待发数据指令
#define FLUSH_TX        0xE1         // 冲洗发送 FIFO指令
#define FLUSH_RX        0xE2          // 冲洗接收 FIFO指令
#define REUSE_TX_PL     0xE3          // 定义重复装载数据指令
#define NOP             0xFF          // 保留
//*************************************SPI(nRF24L01)寄存器地址

****************************************************
#define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式
#define EN_AA           0x01  // 自动应答功能设置
#define EN_RXADDR       0x02  // 可用信道设置
#define SETUP_AW        0x03  // 收发地址宽度设置
#define SETUP_RETR      0x04  // 自动重发功能设置
#define RF_CH           0x05  // 工作频率设置
#define RF_SETUP        0x06  // 发射速率、功耗功能设置
#define STATUS          0x07  // 状态寄存器
#define OBSERVE_TX      0x08  // 发送监测功能
#define CD              0x09  // 地址检测
#define RX_ADDR_P0      0x0A  // 频道0接收数据地址
#define RX_ADDR_P1      0x0B  // 频道1接收数据地址
#define RX_ADDR_P2      0x0C  // 频道2接收数据地址
#define RX_ADDR_P3      0x0D  // 频道3接收数据地址
#define RX_ADDR_P4      0x0E  // 频道4接收数据地址
#define RX_ADDR_P5      0x0F  // 频道5接收数据地址
#define TX_ADDR         0x10  // 发送地址寄存器
#define RX_PW_P0        0x11  // 接收频道0接收数据长度
#define RX_PW_P1        0x12  // 接收频道0接收数据长度
#define RX_PW_P2        0x13  // 接收频道0接收数据长度
#define RX_PW_P3        0x14  // 接收频道0接收数据长度
#define RX_PW_P4        0x15  // 接收频道0接收数据长度
#define RX_PW_P5        0x16  // 接收频道0接收数据长度
#define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置
//**************************************************************

char sta;

//===========================RF24L01端口设置==========================================
void RF24L01_IO_set(void)
{
        P2DIR|=BIT0+BIT1+BIT4+BIT3;
        P2DIR&=~BIT2;
        P2DIR&=~BIT5;
}

//==============================================================================
//函数:uint SPI_RW(uint uchar)
//功能:NRF24L01的SPI写时序
//******************************************************************************
char SPI_RW(char data)
{
        char i,temp=0;
        for(i=0;i<8;i++) // output 8-bit
        {
                if((data & 0x80)==0x80)
                {
                        RF24L01_MOSI_1; // output 'uchar', MSB to MOSI
                }
                else
                {
                        RF24L01_MOSI_0;
                }
                data = (data << 1); // shift next bit into MSB..
                temp<<=1;
                RF24L01_SCK_1; // Set SCK high..
                if(RF24L01_MISO)temp++; // capture current MISO bit
                RF24L01_SCK_0; // ..then set SCK low again
        }
        return(temp); // return read uchar
}

//*************************************************************************************

***************
//函数:uchar SPI_Read(uchar reg)
//功能:NRF24L01的SPI时序
//*************************************************************************************

***************
char SPI_Read(char reg)
{
        char reg_val;
        RF24L01_CSN_0; // CSN low, initialize SPI communication...
        SPI_RW(reg); // Select register to read from..
        reg_val = SPI_RW(0); // ..then read registervalue
        RF24L01_CSN_1; // CSN high, terminate SPI communication
        return(reg_val); // return register value
}

//*************************************************************************************

***************/
//功能:NRF24L01读写寄存器函数
//*************************************************************************************

***************/
char SPI_RW_Reg(char reg, char value)
{
        char status1;
        RF24L01_CSN_0; // CSN low, init SPI transaction
        status1 = SPI_RW(reg); // select register
        SPI_RW(value); // ..and write value to it..
        RF24L01_CSN_1; // CSN high again
        return(status1); // return nRF24L01 status uchar
}

//*************************************************************************************

***************/
//函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
//功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数
//*************************************************************************************

***************/
char SPI_Read_Buf(char reg, char *pBuf, char chars)
{
        char status2,uchar_ctr;
        RF24L01_CSN_0; // Set CSN low, init SPI tranaction
        status2 = SPI_RW(reg); // Select register to write to and read status uchar
        for(uchar_ctr=0;uchar_ctr         {
                pBuf[uchar_ctr] = SPI_RW(0);
        }
        RF24L01_CSN_1;
        return(status2); // return nRF24L01 status uchar
}

//*************************************************************************************

********************
//函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
//功能: 用于写数据 reg:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数
//*************************************************************************************

********************/
char SPI_Write_Buf(char reg, char *pBuf, char chars)
{
        char status1,uchar_ctr;
        RF24L01_CSN_0; //SPI使能
        status1 = SPI_RW(reg);
        for(uchar_ctr=0; uchar_ctr         {
                SPI_RW(*pBuf++);
        }
        RF24L01_CSN_1; //关闭SPI
        return(status1);
}

//*************************************************************************************

***************/
//函数:void SetRX_Mode(void)
//功能:数据接收配置
//*************************************************************************************

***************/
void SetRX_Mode(void)
{
        RF24L01_CE_0;
        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC,主接收
        RF24L01_CE_1;
        delay_ms(2); //注意不能太小
}

//*************************************************************************************

*****************/
//函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
//功能:数据读取后放如rx_buf接收缓冲区中
//*************************************************************************************

*****************/
char nRF24L01_RxPacket(char* rx_buf)
{
        char revale=0;
        sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况
        if(sta&0x40) // 判断是否接收到数据
        {
        RF24L01_CE_0 ; //SPI使能
        SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH); // read receive payload from

RX_FIFO buffer
        revale =1; //读取数据完成标志
        }
        SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通

过写1来清楚中断标志
        return revale;
}

//*************************************************************************************

**********************
//函数:void nRF24L01_TxPacket(char * tx_buf)
//功能:发送 tx_buf中数据
//*************************************************************************************

*********************/
void nRF24L01_TxPacket(char * tx_buf)
{
        RF24L01_CE_0 ; //StandBy I模式
        SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端

地址
        SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据
        // SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发


        RF24L01_CE_1; //置高CE,激发数据发送
        delay_us(60);
}

//*************************************************************************************

***
//NRF24L01初始化
//*************************************************************************************

**/
void init_NRF24L01(void)
{
        delay_us(250);
        RF24L01_CE_0 ; // chip enable
        RF24L01_CSN_1; // Spi disable
        RF24L01_SCK_0; // Spi clock line init high
        SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址
        SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地


        SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 频道0自动 ACK应答允许
        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频

道可以参考Page21
        SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为2.4GHZ,收发必须一致
        SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置

为32字节
        SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值

0dB
        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0E); // IRQ收发完成中断响应,16位CRC ,主接收}
}




void main()
{
        WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
        BCSCTL1=CALBC1_1MHZ; //设定DCO 为1MHZ
        DCOCTL=CALDCO_1MHZ;

        P1DIR|=BIT0+BIT6;//led
        P1OUT&=~BIT0;
        P1OUT&=~BIT6;
        RF24L01_IO_set();
        init_NRF24L01() ;
        SetRX_Mode();   //数据接收配置
        while(1)
        {
                SetRX_Mode();   //数据接收配置  要写在里面
                if(nRF24L01_RxPacket(RxBuf))//如果收到数据
                {
                       
                        P1OUT|=BIT0;
                        P1OUT&=~BIT6;
                       
                       
                }
                else
                {
                        P1OUT|=BIT6;
                        P1OUT&=~BIT0;
                }

        }
}

最新回复

求源码  详情 回复 发表于 2014-8-28 11:39
 
点赞 关注(4)

回复
举报

324

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
这个程序应该是最基础的测试程序,很容易懂,很容易再利用。

24l01.txt

9.5 KB, 下载次数: 168

nrf24l01

 
 

回复

2781

帖子

419

TA的资源

五彩晶圆(中级)

板凳
 
谢谢分享!很给力~
 
个人签名
 
 

回复

54

帖子

0

TA的资源

一粒金砂(高级)

4
 

不错!谢谢分享!

学习学习!谢谢分享!
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(初级)

5
 
太感谢了
 
 
 

回复

357

帖子

0

TA的资源

一粒金砂(中级)

6
 
谢谢
 
 
 

回复

32

帖子

0

TA的资源

一粒金砂(中级)

7
 
mark!
 
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

8
 
牛XXXX
 
 
 

回复

357

帖子

0

TA的资源

一粒金砂(中级)

9
 
请问楼主如何修改成MSP430G2231来收发按键识别信号,MSP430G2231按下另外一个接受到发光管亮一下
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

10
 
楼主有发射端的吗?
 
 
 

回复

4008

帖子

0

TA的资源

版主

11
 
就没有真spi的
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

12
 
谢谢分享!
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

13
 
求发送端的程序呢,跪求大神把发送跟接受的完整程序,留下邮箱给您 1054325445@qq.com
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

14
 
请问大神 我用的launchpad做的 ,也是g2553的,发送端用2节1.5V电池供电发送数据,接收端在线调试接受数据,可是每次第一次上电接受数据正确,后来改发送的数据,再接受就出现乱码了。。求大神指导呢。。。

点评

没有太理解你的问题,可能是程序还有点问题。可以参考这个帖子(nrf24l01(msp430主控)接收发送参考程序https://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=439323&fromuid=421788 (出处: 电子工程世界-论坛)  详情 回复 发表于 2014-8-1 12:15
 
 
 

回复

324

帖子

0

TA的资源

一粒金砂(高级)

15
 
我是明天 发表于 2014-8-1 08:53
请问大神 我用的launchpad做的 ,也是g2553的,发送端用2节1.5V电池供电发送数据,接收端在线调试接受数据 ...

没有太理解你的问题,可能是程序还有点问题。可以参考这个帖子(nrf24l01(msp430主控)接收发送参考程序https://bbs.eeworld.com.cn/forum ... 9323&fromuid=421788
(出处: 电子工程世界-论坛)),这个帖子里有发送和接收的程序,可以先参考试试
 
个人签名

欢迎关注:JL单片机

 
 

回复

9

帖子

0

TA的资源

一粒金砂(初级)

16
 
请问楼主怎么改频道啊
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

17
 
求源码
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表