打印
[Kinetis]

无线串口NRF24L01

[复制链接]
1718|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
secretuniverse|  楼主 | 2016-1-4 20:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
做这个无线通信是目前项目上需要的,但是项目进行中,不方便上传资料,用无线通信模块来做闭环控制的,两个无线模块分别在跟在51单片和dsp后面进行数据实时通信的,但是51的处理能力毕竟弱些,换成飞思卡尔挺好的,哈哈,申请放我过吧!

usb口的无线通信模块


单片机侧的无线模块


相关帖子

沙发
secretuniverse|  楼主 | 2016-1-4 20:23 | 只看该作者
本帖最后由 secretuniverse 于 2016-1-4 20:25 编辑

代码在这里

nRF24L01中文说明书.pdf

711.47 KB

使用特权

评论回复
板凳
secretuniverse|  楼主 | 2016-1-4 20:26 | 只看该作者
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int

/**********  NRF24L01寄存器操作命令  ***********/
#define READ_REG        0x00  //读配置寄存器,低5位为寄存器地址
#define WRITE_REG       0x20  //写配置寄存器,低5位为寄存器地址
#define RD_RX_PLOAD     0x61  //读RX有效数据,1~32字节
#define WR_TX_PLOAD     0xA0  //写TX有效数据,1~32字节
#define FLUSH_TX        0xE1  //清除TX FIFO寄存器.发射模式下用
#define FLUSH_RX        0xE2  //清除RX FIFO寄存器.接收模式下用
#define REUSE_TX_PL     0xE3  //重新使用上一包数据,CE为高,数据包被不断发送.
#define NOP             0xFF  //空操作,可以用来读状态寄存器         
/**********  NRF24L01寄存器地址   *************/
#define CONFIG          0x00  //配置寄存器地址                             
#define EN_AA           0x01  //使能自动应答功能
#define EN_RXADDR       0x02  //接收地址允许
#define SETUP_AW        0x03  //设置地址宽度(所有数据通道)
#define SETUP_RETR      0x04  //建立自动重发
#define RF_CH           0x05  //RF通道
#define RF_SETUP        0x06  //RF寄存器
#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有效数据宽度(1~32字节)
#define RX_PW_P1        0x12  // 接收数据通道1有效数据宽度(1~32字节)
#define RX_PW_P2        0x13  // 接收数据通道2有效数据宽度(1~32字节)
#define RX_PW_P3        0x14  // 接收数据通道3有效数据宽度(1~32字节)
#define RX_PW_P4        0x15  // 接收数据通道4有效数据宽度(1~32字节)
#define RX_PW_P5        0x16  // 接收数据通道5有效数据宽度(1~32字节)
#define FIFO_STATUS     0x17  // FIFO状态寄存器
/*————————————————————————————————————————————————


使用特权

评论回复
地板
bitofnoone| | 2016-1-4 20:29 | 只看该作者
void delay_150us()
{
        uint i;

        for(i=0;i>150;i++);
}
void qianjin()        //前进
{
        A1=0;A2=1;
        B1=0;B2=1;
}
void houtui()        //后退
{
        A1=1;A2=0;
        B1=1;B2=0;
}
void zuozhuan()        //左转
{
        A1=1;A2=0;
        B1=0;B2=1;
}
void youzhuan()        //右转
{
        A1=0;A2=1;
        B1=1;B2=0;
}
void tingzhi()        //停止
{
        A1=0;A2=0;
        B1=0;B2=0;
}
/***************************************************************/

/*******************************************************************/
uchar SPI_RW(uchar byte)
{
        uchar bit_ctr;
        for(bit_ctr=0;bit_ctr<8;bit_ctr++)  // 输出8位
        {
                NRF_MOSI=(byte&0x80);                         // MSB TO MOSI
                byte=(byte<<1);                                        // shift next bit to MSB
                NRF_SCK=1;
                byte|=NRF_MISO;                                // capture current MISO bit
                NRF_SCK=0;
        }
        return byte;
}

使用特权

评论回复
5
bitofnoone| | 2016-1-4 20:30 | 只看该作者
/*********************************************/
/* 函数功能:给24L01的寄存器写值(一个字节) */
/* 入口参数:reg   要写的寄存器地址          */
/*           value 给寄存器写的值            */
/* 出口参数:status 状态值                   */
/*********************************************/
uchar NRF24L01_Write_Reg(uchar reg,uchar value)
{
        uchar status;

        NRF_CSN=0;                  //CSN=0;   
          status = SPI_RW(reg);                //发送寄存器地址,并读取状态值
        SPI_RW(value);
        NRF_CSN=1;                  //CSN=1;

        return status;
}
/*************************************************/
/* 函数功能:读24L01的寄存器值 (一个字节)      */
/* 入口参数:reg  要读的寄存器地址               */
/* 出口参数:value 读出寄存器的值                */
/*************************************************/
uchar NRF24L01_Read_Reg(uchar reg)
{
        uchar value;

        NRF_CSN=0;              //CSN=0;   
          SPI_RW(reg);                        //发送寄存器值(位置),并读取状态值
        value = SPI_RW(NOP);
        NRF_CSN=1;                     //CSN=1;

        return value;
}

使用特权

评论回复
6
bitofnoone| | 2016-1-4 20:31 | 只看该作者
/*********************************************/
/* 函数功能:读24L01的寄存器值(多个字节)   */
/* 入口参数:reg   寄存器地址                */
/*           *pBuf 读出寄存器值的存放数组    */
/*           len   数组字节长度              */
/* 出口参数:status 状态值                   */
/*********************************************/
uchar NRF24L01_Read_Buf(uchar reg,uchar *pBuf,uchar len)
{
        uchar status,u8_ctr;
        NRF_CSN=0;                           //CSN=0      
          status=SPI_RW(reg);                                //发送寄存器地址,并读取状态值             
        for(u8_ctr=0;u8_ctr<len;u8_ctr++)
        pBuf[u8_ctr]=SPI_RW(0XFF);                //读出数据
        NRF_CSN=1;                                 //CSN=1
          return status;                                //返回读到的状态值
}
/**********************************************/
/* 函数功能:给24L01的寄存器写值(多个字节)  */
/* 入口参数:reg  要写的寄存器地址            */
/*           *pBuf 值的存放数组               */
/*           len   数组字节长度               */
/**********************************************/
uchar NRF24L01_Write_Buf(uchar reg, uchar *pBuf, uchar len)
{
        uchar status,u8_ctr;
        NRF_CSN=0;
          status = SPI_RW(reg);                        //发送寄存器值(位置),并读取状态值
          for(u8_ctr=0; u8_ctr<len; u8_ctr++)
        SPI_RW(*pBuf++);                                 //写入数据
        NRF_CSN=1;
          return status;                          //返回读到的状态值
}                                                                                                    

使用特权

评论回复
7
bitofnoone| | 2016-1-4 20:32 | 只看该作者
/*********************************************/
/* 函数功能:24L01接收数据                   */
/* 入口参数:rxbuf 接收数据数组              */
/* 返回值: 0   成功收到数据                 */
/*          1   没有收到数据                 */
/*********************************************/
uchar NRF24L01_RxPacket(uchar *rxbuf)
{
        uchar state;
         
        state=NRF24L01_Read_Reg(STATUS);                          //读取状态寄存器的值             
        NRF24L01_Write_Reg(WRITE_REG+STATUS,state); //清除TX_DS或MAX_RT中断标志
        if(state&RX_OK)                                                                //接收到数据
        {
                NRF_CE = 0;
                NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据
                NRF24L01_Write_Reg(FLUSH_RX,0xff);                                        //清除RX FIFO寄存器
                NRF_CE = 1;
                delay_150us();
                return 0;
        }          
        return 1;//没收到任何数据
}
/**********************************************/
/* 函数功能:设置24L01为发送模式              */
/* 入口参数:txbuf  发送数据数组              */
/* 返回值; 0x10    达到最大重发次数,发送失败*/
/*          0x20    成功发送完成              */
/*          0xff    发送失败                  */
/**********************************************/
uchar NRF24L01_TxPacket(uchar *txbuf)
{
        uchar state;
   
        NRF_CE=0;                                                                                                //CE拉低,使能24L01配置
          NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);        //写数据到TX BUF  32个字节
        NRF_CE=1;                                                                                                //CE置高,使能发送          
        while(NRF_IRQ==1);                                                                                //等待发送完成
        state=NRF24L01_Read_Reg(STATUS);                                                  //读取状态寄存器的值          
        NRF24L01_Write_Reg(WRITE_REG+STATUS,state);                         //清除TX_DS或MAX_RT中断标志
        if(state&MAX_TX)                                                                                //达到最大重发次数
        {
                NRF24L01_Write_Reg(FLUSH_TX,0xff);                                        //清除TX FIFO寄存器
                return MAX_TX;
        }
        if(state&TX_OK)                                                                                        //发送完成
        {
                return TX_OK;
        }
        return 0xff;                                                                                        //发送失败
}

使用特权

评论回复
8
americ| | 2016-1-4 21:41 | 只看该作者
用蓝牙也挺好吧?
或者wifi

使用特权

评论回复
9
dwdsp| | 2016-1-5 08:32 | 只看该作者
不必求吧,这类模块不要太便宜啊!自个买就好的

使用特权

评论回复
10
woosoo521| | 2016-1-5 08:55 | 只看该作者
用在四轴上

使用特权

评论回复
11
xszms| | 2016-1-5 10:13 | 只看该作者
赞一个!

使用特权

评论回复
12
jls1976| | 2016-1-5 20:20 | 只看该作者
跟赞

使用特权

评论回复
13
xpu_ws| | 2016-1-6 09:13 | 只看该作者
呵呵哈哈 我看看

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

55

帖子

1

粉丝