关于PIC16F877A与NRF24L01通信的问题急急急急急急急急急急急急急急

2019-03-25 19:43发布

小弟最近弄无线通信部分,但是程序出来之后,出现许多问题,下面是程序,请哪位帮忙看看,谢谢,不胜感激,弄一个礼拜了,还是没有成果,着急啊!
首先是发送部分
#include<pic.h>
#define uchar unsigned char
#define uint unsigned int
#define T_L 5
#define R_L 5
/********接口定义*******/
#define CSN RE2
#define SCK RC3
#define DI RC4
#define DO RC5
#define CE RD2
#define IRQ RD3
/**********************/
/********寄存器地址*******/
#define CONFIG 0X00
#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
#define RX_ADDR_P1 0X0B
#define RX_ADDR_P2 0X0C
#define RX_ADDR_P3 0X0D
#define RX_ADDR_P4 0X0E
#define RX_ADDR_P5 0X0F
#define TX_ADDR 0X10
#define RX_PW_P0 0X11
#define RX_PW_P1 0X12
#define RX_PW_P2 0X13
#define RX_PW_P3 0X14
#define RX_PW_P4 0X15
#define RX_PW_P5 0X16
#define FIFO_STATUS 0X17
/***********************/
/*********寄存器指令*********/
#define R_REG 0X00
#define W_REG 0X20
#define R_RX_PAY 0X61
#define W_RX_PAY 0XA0
#define FLUSH_TX 0XE1
#define FLUSH_RX 0XE2
#define RESUSE 0XE3
#define NOP 0XFF
/**********************/
void delayus(uchar x,uchar y);
uchar SPI_RW(uchar byte);
uchar SPI_RW_Reg(uchar reg,uchar value);
uchar SPI_Read_REG(uchar reg);
uchar SPI_Read_Buf(uchar reg,uchar *puf,uchar bytes);
uchar SPI_Write_Buf(uchar reg,uchar *puf,uchar bytes);
void RX_Mode();
void TX_Mode();

#include<pic.h>
#include"f_nrf.h"
void delayus(uchar x,uchar y)
{
        uchar a,b;
        for(a=0;a<x;a++)
                for(b=0;b<y;b++);
}
#include<pic.h>
#include"s_nrf.h"
void delayus(uchar x,uchar y)
{
        uchar a,b;
        for(a=0;a<x;a++)
                for(b=0;b<y;b++);
}
void SPI_Write(uchar byte)//SPI写
{
        SSPBUF=byte;
        while(!SSPIF);
        SSPIF=0;
}
uchar SPI_Read(uchar byte)//SPI读
{
        uchar R_temp;
        SSPBUF=byte;
        while(!SSPIF);
        SSPIF=0;
        R_temp=SSPBUF;
        return(R_temp);
}
void SPI_RW_Reg(uchar reg,uchar value)//写寄存器
{
        uchar R_status;
        CSN=0;
        R_status=SPI_Read(reg);
        SPI_Write(value);
        CSN=1;
}
uchar SPI_Read_REG(uchar reg)//读寄存器
{
        uchar reg_val;
        CSN=0;
        SPI_Write(reg);
        reg_val=SPI_Read(0);
        CSN=1;
        return(reg_val);
}
uchar SPI_Read_Buf(uchar reg,uchar *puf,uchar bytes)//读缓冲区
{
        uchar B_status,i;
        CSN=0;
        B_status=SPI_Read(reg);
        for(i=0;i<bytes;i++)
        puf=SPI_Read(0);
        CSN=1;
        return(B_status);       
}
void SPI_Write_Buf(uchar reg,uchar *puf,uchar bytes)//写缓冲区
{
        uchar B_status,i;
        CSN=0;
        B_status=SPI_Read(reg);
        for(i=0;i<bytes;i++)
        SPI_Write(*puf++);
        CSN=1;
}

#include<pic.h>
#include"f_nrf.h"
uchar sta=0;
uchar T_temp[32]={0X31,0X31,0X31,0X31,0X31,0X31,0X31,0X31,
                                        0X31,0X31,0X31,0X31,0X31,0X31,0X31,0X31,
                                        0X31,0X31,0X31,0X31,0X31,0X31,0X31,0X31,
                                        0X31,0X31,0X31,0X31,0X31,0X31,0X31,0X31};//发送32个0X31

uchar T_buf[5]={0x34,0x43,0x10,0x10,0x01};//发送端地址
uchar R_buf[5]={0x34,0x43,0x10,0x10,0x01};//接收端地址
void delay(uint xms)
{
  uint i,j;
  for(i=xms;i>0;i--)
    for (j=110;j>0;j--);
}
void Init_SPI()
{
        SSPSTAT=0XC0;//CKP=0;SMP=1;
        SSPCON=0X30;//CKE=1;
}
void Init_Port()
{
        TRISD2=0;//CE出
        TRISD3=1;//IRQ入
        TRISE2=0;//CSN出
        ADCON1=0X07;//设置RE端口为数字输出
        TRISC4=1;//SPI输入
        TRISC5=0;//SPI输出
        TRISC3=0;//SCK输出
}
void Init_nrf()
{
        CSN=1;
        SCK=0;
        CE=0;
        SPI_Write_Buf(W_REG+TX_ADDR,T_buf,5);
        SPI_Write_Buf(W_REG+RX_ADDR_P0,R_buf,5);
        SPI_RW_Reg(W_REG+EN_AA,0X01);
        SPI_RW_Reg(W_REG+EN_RXADDR,0X01);
        SPI_RW_Reg(W_REG+RF_CH,40);
        SPI_RW_Reg(W_REG+RF_SETUP,0X07);
        SPI_RW_Reg(W_REG+RX_PW_P0,32);
        SPI_RW_Reg(W_REG+CONFIG,0X0E);//配置模式为接收模式
        CE=1;
}
void send(uchar *t_buf)//发送数据
{
        CE=0;
        SPI_Write_Buf(W_REG+RX_ADDR_P0,T_buf,5);
        SPI_Write_Buf(W_RX_PAY,t_buf,32);
        CE=1;
        delayus(0,0);
}
void main()
{
        Init_Port();
        Init_SPI();
        Init_nrf();
        while(1)
        {
                send(T_temp);
                SPI_RW_Reg(W_REG+STATUS,0xff);
        }
}

下面是接收端程序
#include<pic.h>
#define uchar unsigned char
#define uint unsigned int
#define T_L 5
#define R_L 5
#define RX_DR 0X40
/********接口定义*******/
#define CSN RE2
#define SCK RC3
#define MOSI RC4
#define MISO RC5
#define CE RD2
#define IRQ RD3
/**********************/
/********寄存器地址*******/
#define CONFIG 0X00
#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
#define RX_ADDR_P1 0X0B
#define RX_ADDR_P2 0X0C
#define RX_ADDR_P3 0X0D
#define RX_ADDR_P4 0X0E
#define RX_ADDR_P5 0X0F
#define TX_ADDR 0X10
#define RX_PW_P0 0X11
#define RX_PW_P1 0X12
#define RX_PW_P2 0X13
#define RX_PW_P3 0X14
#define RX_PW_P4 0X15
#define RX_PW_P5 0X16
#define FIFO_STATUS 0X17
/***********************/
/*********寄存器指令*********/
#define R_REG 0X00
#define W_REG 0X20
#define R_RX_PAY 0X61
#define W_RX_PAY 0XA0
#define FLUSH_TX 0XE1
#define FLUSH_RX 0XE2
#define RESUSE 0XE3
#define NOP 0XFF
/**********************/
void delayus(uchar x,uchar y);
uchar SPI_Read(uchar byte);
void SPI_Write(uchar byte);
void SPI_RW_Reg(uchar reg,uchar value);
uchar SPI_Read_REG(uchar reg);
uchar SPI_Read_Buf(uchar reg,uchar *puf,uchar bytes);
void SPI_Write_Buf(uchar reg,uchar *puf,uchar bytes);
void RX_Mode();
void TX_Mode();
void U_Send(uchar tab);

#include<pic.h>
#include"s_nrf.h"
void delayus(uchar x,uchar y)
{
        uchar a,b;
        for(a=0;a<x;a++)
                for(b=0;b<y;b++);
}
void SPI_Write(uchar byte)
{
        SSPBUF=byte;
        while(!SSPIF);
        SSPIF=0;
}
uchar SPI_Read(uchar byte)
{
        uchar R_temp;
        SSPBUF=byte;
        while(!SSPIF);
        SSPIF=0;
        R_temp=SSPBUF;
        return(R_temp);
}
void SPI_RW_Reg(uchar reg,uchar value)
{
        uchar R_status;
        CSN=0;
        R_status=SPI_Read(reg);
        SPI_Write(value);
        CSN=1;
}
uchar SPI_Read_REG(uchar reg)
{
        uchar reg_val;
        CSN=0;
        SPI_Write(reg);
        reg_val=SPI_Read(0);
        CSN=1;
        return(reg_val);
}
uchar SPI_Read_Buf(uchar reg,uchar *puf,uchar bytes)
{
        uchar B_status,i;
        CSN=0;
        B_status=SPI_Read(reg);
        for(i=0;i<bytes;i++)
        puf=SPI_Read(0);
        CSN=1;
        return(B_status);       
}
void SPI_Write_Buf(uchar reg,uchar *puf,uchar bytes)
{
        uchar B_status,i;
        CSN=0;
        B_status=SPI_Read(reg);
        for(i=0;i<bytes;i++)
        SPI_Write(*puf++);
        CSN=1;
}
void RX_Mode()
{
        CE=0;
        SPI_RW_Reg(W_REG+CONFIG,0X0F);
        CE=1;
        delayus(2,1);
}
void TX_Mode()
{
        CE=0;
        SPI_RW_Reg(W_REG+CONFIG,0X0E);
        CE=1;
}


#include<pic.h>
#include"s_nrf.h"
#define R_L 32
uchar sta=0;
uchar T_buf[5]={0x34,0x43,0x10,0x10,0x01};
uchar R_buf[5]={0x34,0x43,0x10,0x10,0x01};
void delay(uint xms)
{
  uint i,j;
  for(i=xms;i>0;i--)
    for (j=110;j>0;j--);
}
void Init_SPI()
{
        SSPSTAT=0XC0;
        SSPCON=0X20;
}
void Init_Port()
{
        TRISD4=0;
        RD4=0;
        TRISD2=0;
        ADCON1=0X07;
        TRISD3=1;
        TRISE2=0;
        TRISC4=1;
        TRISC5=0;
        TRISC3=0;
}
void Init_nrf()
{
        CSN=1;
        SCK=0;
        CE=0;
        //SPI_RW_Reg(FLUSH_RX,0X00);
        //SPI_Write_Buf(W_REG+TX_ADDR,T_buf,5);
        SPI_Write_Buf(W_REG+RX_ADDR_P0,R_buf,5);
        SPI_RW_Reg(W_REG+EN_AA,0X01);
        SPI_RW_Reg(W_REG+EN_RXADDR,0X01);
        SPI_RW_Reg(W_REG+RF_CH,40);
        SPI_RW_Reg(W_REG+RX_PW_P0,32);
        SPI_RW_Reg(W_REG+RF_SETUP,0X07);
        SPI_RW_Reg(W_REG+CONFIG,0X0F);
        CE=1;
}
uchar receive(uchar *r_buf)
{
        uchar i=0;
        sta=SPI_Read_REG(STATUS);
        if(sta&RX_DR)
        {       
                CE=0;
                SPI_Read_Buf(R_RX_PAY,r_buf,32);
                i=1;
        }       
        SPI_RW_Reg(W_REG+STATUS,sta);
        return(i);
}
void main()
{
        uchar Rbuf[32];
        Init_SPI();
        Init_Port();
        Init_nrf();
        while(1)
        {
                if(receive(Rbuf))
                {
                        RD4=1;//如果接收到数据,RD4灯亮,问题:没开启发送,就亮了,个人认为是RX_DR的   设置不对,没接收数据就置1了;请问在接收程序中sta和RX_DR应该如何定义,个人感觉是关与PIC的位操作吧?不明白,新手,请各位不吝赐教
                }
        }
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
nsqdy
1楼-- · 2019-03-26 03:57
在线等回复,谢谢大家
nsqdy
2楼-- · 2019-03-26 04:59
SPI_RW_Reg(W_REG+CONFIG,0X0E);//配置模式为接收模式,这个是发送模式,不好意思,程序有点长,没来得及改

一周热门 更多>