打印

求助!!!NRF24L01+无线模块

[复制链接]
843|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
YANG5815|  楼主 | 2016-8-5 08:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人刚接触这个模块、在网上找了一些资料在学习、也有下载中文版的用户手册在看、可是、、、、是这样的、想大多数网有所说、先调试一个单独的发射程序、下面是我的程序、希望各位大神指点小弟一二、
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
#define lcd P0
#define TX_ADR_WIDTH 5//发送地址宽度5字节
#define RX_ADR_WIDTH 5//接收地址宽度5字节
#define TX_PLOAD_WIDTH 32//发送数据宽度32字节
#define RX_PLOAD_WIDTH 32//接收数据的宽度32字节
uchar const TX_ADDRESS[TX_ADR_WIDTH]={0x01,0x02,0x03,0x04,0x05};
uchar const RX_ADDRESS[RX_ADR_WIDTH]={0x01,0x02,0x03,0x04,0x05};
#define WRITE_REG        0x00          // 读寄存器指令
#define FLUSH_TX        0xE1         // 冲洗发送 FIFO指令

#define FLUSH_RX        0xE2          // 冲洗接收 FIFO指令
#define NOP             0xFF          // 保留

#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_P5      0x0F  // 频道5接收数据地址

#define TX_ADDR         0x10  // 发送地址寄存器

#define RX_PW_P0        0x11  // 接收频道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栈入栈出状态寄存器设置
sbit lcdrs=P2^6;
sbit lcdrw=P2^5;
sbit lcde=P2^7;
sbit CE=P1^7;
sbit CSN=P3^7;
sbit SCK=P3^6;
sbit MOSI=P2^2;
sbit MISO=P2^0;
sbit IRQ=P3^3;
uchar str[4];
uchar status;
uchar SPI_RW_REG(uchar reg,uchar value);
uchar SPI_READ(uchar reg);
uchar SPI_RW(uchar unchar);
uchar * uchartostr(uchar unm);
void NRFinit(void);
void nrf24l01_txpacket(uchar *tx_buf);
uchar SPI_WRITE_BUF(uchar reg, uchar *pBUF, uchar uchars);
uchar SPI_READ_BUF(uchar reg, uchar *pBUF, uchar uchars);
void delay(uint t)
{
        uchar j;
        for(;t>0;t--)
                for(j=110;j>0;j--);
}
void write_com(uchar com)
{
        lcdrs=0;
        lcdrw=0;
        P0=com;
        delay(5);
        lcde=1;
        delay(5);
        lcde=0;       
}
void write_data(uchar date)
{
        lcdrs=1;
        lcdrw=0;
        P0=date;
        delay(5);
        lcde=1;
        delay(5);
        lcde=0;       
}
void init()
{
        lcde=0;
        write_com(0x38);
        write_com(0x0f);
        write_com(0x06);
        write_com(0x01);
        write_com(0x80);       
}
void display(uchar x,uchar y,uchar *p)
{
        uchar i;
        for(i=0;i<16;i++)
        {
                if(0==y) x|=0x80;
                else x|=0xc0;
                write_com(x);
                write_data(*p);
                x++;p++;       
        }
}
uchar * uchartostr(uchar unm)                                        //将char值转换成字符串
{
        uchar x00,xx,x0,x,n;
        x00=unm/100;xx=unm%100;x0=xx/10;x=xx%10;n=0;
        if(x00!=0)
        {
                str[n]=x00+48;
                n++;
        }
        if(!(x00==0&x0==0))
        {
                str[n]=x0+48;
                n++;
        }               
        str[n]=x+48;
        n++;
        str[n]='\0';
        return(str);
}
uchar SPI_RW(uchar byte)                 //写时序
{
        uchar bit_ctr;
        for(bit_ctr=0;bit_ctr<8;bit_ctr++)
        {
                MOSI=(byte&0x80);
                byte=byte<<1;
                SCK=1;
                byte|=MISO;
                SCK=0;
        }
        return(byte);
}
uchar SPI_READ(uchar reg)                                  //读时序
{
        uchar reg_val;
        CSN=0;
        SPI_RW(reg);
        reg_val= SPI_RW(0);
        CSN=1;
        return(reg_val);
}
uchar SPI_RW_REG(uchar reg,uchar value)                                //写一个字节到寄存器函数
{
        CSN=0;
        status=SPI_RW(reg);
        SPI_RW(value);
        CSN=1;
        return(status);
}
uchar SPI_READ_BUF(uchar reg, uchar *pBUF, uchar uchars)           //读数据
{
        uchar uchar_ctr;
        CSN=0;
        status=SPI_RW(reg);
        for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
        {
                pBUF[uchar_ctr]=SPI_RW(0);
        }
        CSN=1;
        return(status);
}
uchar SPI_WRITE_BUF(uchar reg, uchar *pBUF, uchar uchars)                 //写数据
{
        uchar uchar_ctr;
        CSN=0;
        status=SPI_RW(reg);
        for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
        {
                SPI_RW(*pBUF++);
        }
        CSN=1;
        return(status);
}
void NRFinit(void)                                                                                        //初始化
{
        CE=0;CSN=1;SCK=0;IRQ=1;
        SPI_RW_REG(WRITE_REG + EN_AA,0X00);
        SPI_RW_REG(WRITE_REG + SETUP_RETR,0X00);
        SPI_RW_REG(WRITE_REG + EN_RXADDR,0X01);
        SPI_RW_REG(WRITE_REG + RF_CH,1);
        SPI_RW_REG(WRITE_REG + RX_PW_P0,RX_PLOAD_WIDTH);
        SPI_RW_REG(WRITE_REG + RF_SETUP,0X07);
}
void nrf24l01_txpacket(uchar *tx_buf)                                 //发送tx_buf中的数据
{
        CE=0;
        SPI_WRITE_BUF(WRITE_REG + TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH);
        SPI_WRITE_BUF(WRITE_REG + RX_PW_P0,TX_ADDRESS,TX_ADR_WIDTH);
        SPI_WRITE_BUF(TX_PLOAD_WIDTH,tx_buf,TX_PLOAD_WIDTH);
        //SPI_WRITE_BUF(WRITE_REG + CONFIG,0x0e);
        CE=1;
        delay(1);
        CE=0;
        delay(1);
}
void main()
{
        uchar fifo_s;
        delay(30);
        init();
        delay(100);
        NRFinit();
        while(1)
        {
                SPI_RW_REG(WRITE_REG+STATUS,0XFF);
                //SPI_WRITE_BUF(TX_PLOAD_WIDTH,tx_buf,TX_PLOAD_WIDTH);
                status=SPI_READ(STATUS);
                fifo_s=SPI_READ(FIFO_STATUS);
                write_com(0x80+7);
                display(1,2,uchartostr(status));
                write_com(0x80+0x40+7);
                display(1,4,uchartostr(status));
                status=SPI_READ(STATUS);
                fifo_s=SPI_READ(FIFO_STATUS);
                write_com(0x80+11);
                display(1,6,uchartostr(status));
                write_com(0x80+0x40+11);
            display(1,8,uchartostr(status));
                delay(30);
                write_com(0x01);
                delay(30);
        }

程序是我在参考网上的资料还有用户手册半拷贝半自己写的、真心求教、

相关帖子

沙发
dirtwillfly| | 2016-8-5 09:57 | 只看该作者
有啥问题?

使用特权

评论回复
板凳
YANG5815|  楼主 | 2016-8-5 10:46 | 只看该作者
我只是单独在调试发射部分、照理说最后的显示应该有数据出现呐、可我这是一堆乱码、

使用特权

评论回复
地板
NE5532| | 2016-9-2 08:49 | 只看该作者
差太远,要有方法和步骤,内容太多了,没法回复。答案在我签名里。

使用特权

评论回复
5
416356084| | 2016-9-3 10:41 | 只看该作者
内容太多,没细看,应该不会有什么问题,以前做过n个

使用特权

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

本版积分规则

6

主题

37

帖子

0

粉丝