您的位置 首页 5G

C8051F的nRF24L01 PTR6000无线收发

************************发送部分*********************includec8051f310h>includestdioh>includemathh&

/************************发送部分*********************/

#include
#include
#include
#include
#include

#define uint unsigned int
#define uchar unsigned char

//nRF24L01的数据宽度,地址宽度,以及数据界说
#define TX_ADR_WIDTH 4 //地址数据
#define RX_PLOAD_WIDTH 4 //接纳的有用数据宽度
#define TX_PLOAD_WIDTH 4 //发送的有用数据宽度
#define BUSY SPI0CFG&0x80

uchar TX_ADDRESS[]={0xe7,0xe7,0xe7,0xe7}; //传送接纳端地址
uchar shuzu[4]={0x99,0x99,0xc7,0x99}; //要发送的有用数据
uchar rx_buf[4]={0x00,0x00,0x00,0x00}; //接纳的数据缓存
uchar a,b,i;
ucharsta;

//引脚界说2274
#define CSN_HIGH CSN=1
#define CSN_LOW CSN=0
#define CE_HIGH CE=1
#define CE_LOW CE=0

sbit CE=P0^5;
sbit CSN=P0^6;
sbit IRQ=P0^4;
sbit c=P0^7;

//24L01寄存器地址
#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//数据通道0接纳地址
#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//接纳地址通道0有用数据宽度
#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//FIFO状况寄存器
//SPI指令字
#define READ_REG 0X00//读寄存器指令
#define WRITE_REG 0X20//写寄存器指令
#define RD_RX_PLOAD 0X61//读有用数据指令
#define WR_TX_PLOAD 0XA0//写有用数据指令
#define FLUSH_TX 0XE1//铲除TX_FIFO应用于发射形式
#define FLUSH_RX 0XE2//铲除RX_FIFO应用于接纳形式
#define REUSE_TX_PL 0XE3//从头使用上一包有用数据
#define NOP 0XFF//空操作指令

void dat_int(void)
{
CSN_HIGH;
CE_LOW;
a=0;
c=0;
}

void sysclk(void) //内部晶振
{
OSCICL=0xb3; // 0x83
OSC%&&&&&%N=0xc2; //二分频
CLKSEL=0x00;
}

//延时子函数us
void delay(uint i)
{
while(i–)
;
}

uchar SPI_RW(uchar byte) //用SPI读写一字节的数据
{
uchar rbyte;

SPI0DAT=byte;
while(!SPIF);
rbyte=SPI0DAT;
SPIF=0;
delay(15);
return rbyte;
}

uchar SPI_RW_Reg(uchar reg,uchar value) //向寄存器写一字节的数据,一起回来状况字
{
uchar status;
CSN_LOW;
SPI0DAT=reg;
while(!SPIF);
delay(20);
status=SPI0DAT;
SPIF=0;
SPI0DAT=value;
while(!SPIF);
SPIF=0;
CSN_HIGH;
return(status);
}

uchar SPI_Read(uchar reg) //从寄存器读出一字节的数据
{
uchar byte;
CSN_LOW;
SPI0DAT=reg;
while(!SPIF);
delay(20);
SPI0DAT=0x00;
SPIF=0;
while(!SPIF);
byte=SPI0DAT;
SPIF=0;
CSN_HIGH;
return byte;
}

uchar SPI_Read_Buf(uchar reg,uchar *pBuf,uchar bytes) //从reg读出bytes字节的数据
{
uchar status,byte_ctr;
CSN_LOW;

status=SPI_RW(reg);
for(byte_ctr=0;byte_ctr pBuf[byte_ctr]=SPI_RW(0);

CSN_HIGH;
return status;
}

uchar SPI_RW_Buf(uchar reg,uchar *pBuf,uchar bytes) //向reg写入bytes字节的数据
{
uchar status,byte_ctr;
CSN_LOW;

status=SPI_RW(reg);
for(byte_ctr=0;byte_ctr SPI_RW(pBuf[byte_ctr]);

CSN_HIGH;
returnstatus;
}

//接纳函数,接纳回来1表明有数据收到
uchar nRF24L01_RxPacket(uchar *rx_buf)
{
uchar sta;
uchar revale=0;
SPI_RW_Reg(WRITE_REG+CONFIG,0X0F);
SPI_RW_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);//界说接纳通道号

CE_HIGH; //开端接纳数据
delay(130);

sta=SPI_Read(READ_REG+STATUS);//接纳状况寄存器,用于判别是否收到数据
if(sta&0x40)
{
CE_LOW; //完毕接纳数据
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);
revale=0xff;
}

SPI_RW_Reg(WRITE_REG+STATUS,sta); //接纳复位
return revale;
}

void nRF24L01_TxPacket(uchar *tx_buf) //发送函数
{
CE_LOW;

SPI_RW_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); //给发送寄存器写入地址,宽度为TX_ADR_WIDTH

SPI_RW_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);//给接纳寄存器写入地址,宽度也为TX_ADR_WIDTH
SPI_Read_Buf(RX_ADDR_P0,rx_buf,TX_ADR_WIDTH);

SPI_RW_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH); //向发送寄存器写入TX_PLOAD_WIDTH宽度的数据,

SPI_RW_Reg(WRITE_REG+CONFIG,0X0E); //装备为PWR_UP位,使能CRC,16位校验,发送形式

CE_HIGH;
delay(100);
CE_LOW;

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/5g/318678.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部