求NRF2401 C语言收发程序,51单片机的,注意不是24L01的哦

求NRF2401 C语言收发程序,51单片机的,注意不是24L01的哦,第1张

#include <reg52.h>

#include<intrins.h>

// 常量定义

#define uchar unsigned char

#define uint unsigned int

#define BYTE_BIT0 0x01

#define BYTE_BIT1 0x02

#define BYTE_BIT2 0x04

#define BYTE_BIT3 0x08

#define BYTE_BIT4 0x10

#define BYTE_BIT5 0x20

#define BYTE_BIT6 0x40

#define BYTE_BIT7 0x80

//---------------------------位变量定义----------------------------------------

bdata uchar DATA_BUF //用于ByteRead和ByteWrite 函数

#define DATA7 ((DATA_BUF&BYTE_BIT7)!=0)

#define DATA0 ((DATA_BUF&BYTE_BIT0)!=0)

uchar TxBuf[28]={

0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,

0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,

0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,

0x25,0x26,0x27,0x28,}// ------------------------------<RF2401_Pins 对应引脚>-----------------------

sbit PWR_UP = P1^3

sbit CE = P1^2

// sbit DR2 = P1^7 //暂时没有用到

// sbit CLK2 = P1^1

// sbit OUT2 = P1^6

sbit CS = P1^0

sbit DR1 = P1^5

sbit CLK1 = P1^4

sbit DATA = P3^3

//----------------------------------------LED显示端口团拦---------------------------------------------------

sbitLED=P3^5

//-------------------------------------------------------------------------------

unsigned char TxAddress[4]={0xcc,0xcc,0xcc,0xcc} //发送地址

//---------------------<nRF-Configuration-Register 配置信息 >------------------------------

//芯片测试用,无需修改

#define TEST_2 0x8E // MSBD143-D136

#define TEST_1 0x08//D135~D128

#define TEST_0 0x1c// D127~D120

// 注意 DATAx_W+ADDRx_W+CRC 的值必须小于256!单个数据包的大小必须小于32字节(256位)

#define DATA2_W 0x10//未用到--0x10=2字节 //频道2发送/接受数据长度(单位纯悄:Bit)

#define DATA1_W 0xE0//28字节 16 位 //频道1发送/接受数据长度(单位:Bit)

//频道2接收地址<-频道2未使用

#define ADDR2_4 0x00

#define ADDR2_3 0x1c

#define ADDR2_2 0xcc

#define ADDR2_1 0xcc

#define ADDR2_0 0xcc

// 频道1接收地址 (当前塌裤胡模块地址) <-只是用频道1

#define ADDR1_4 0x00

#define ADDR1_3 0xcc

#define ADDR1_2 0xcc

#define ADDR1_1 0xcc

#define ADDR1_0 0xcc

//接收地址位置设置--CRC设置

#define ADDR_W 0x10 //0x10 =2字节 //发送/接收地址宽度(单位:Bit)

#define CRC_L 0x1 //CRC模式 0:8位 1:16位

#define CRC_EN 0x1 //CRC校验 0:禁止 1:启用

//频道设置--发送方式设置--速率设置--频率设置

#define RX2_EN 0x0 //双频道功能 0:禁用 1:启用

#define CM 0x1 //0:Direct Mode 1: Shockburst Mode

#define RFDR_SB 0x1 //传输速率 0:250k 1: 1M (250k比1M传输距离远)

#define XO_F 0x3 //16M D12 D11 D10 确定 5种频率

#define RF_PWR 0x3 //信号发射功率---0DB

//

#define RF_CH 0x2 //Channal 频率设置Channel=2400MHz+RF_CH*1.0MHz

#define RXEN 0x0 //0:TX 1:RX

//<将设置信息组合成每个字节的数据信息

#define RFconfig_Bit0 TEST_2

#define RFconfig_Bit1 TEST_1

#define RFconfig_Bit2 TEST_0

#define RFconfig_Bit3 DATA2_W

#define RFconfig_Bit4 DATA1_W

#define RFconfig_Bit5 ADDR2_4

#define RFconfig_Bit6 ADDR2_3

#define RFconfig_Bit7 ADDR2_2

#define RFconfig_Bit8 ADDR2_1

#define RFconfig_Bit9 ADDR2_0

#define RFconfig_Bit10 ADDR1_4

#define RFconfig_Bit11 ADDR1_3

#define RFconfig_Bit12 ADDR1_2

#define RFconfig_Bit13 ADDR1_1

#define RFconfig_Bit14 ADDR1_0

#define RFconfig_Bit15 (ADDR_W<<2|CRC_L<<1|CRC_EN)

#define RFconfig_Bit16 (RX2_EN<<7|CM<<6|RFDR_SB<<5|XO_F<<2|RF_PWR)

#define RFconfig_Bit17 (RF_CH<<1|RXEN)

//通过宏定义将18字节的寄存器参数按照各个功能分解,参照DATASHHET

uchar code nRF2401_Conf[18]=

{

RFconfig_Bit0,RFconfig_Bit1,RFconfig_Bit2,

RFconfig_Bit3,

RFconfig_Bit4,

RFconfig_Bit5,RFconfig_Bit6,RFconfig_Bit7,RFconfig_Bit8,RFconfig_Bit9,

RFconfig_Bit10,RFconfig_Bit11,RFconfig_Bit12,RFconfig_Bit13,RFconfig_Bit14,

RFconfig_Bit15,

RFconfig_Bit16,

RFconfig_Bit17

}

//------------------------------------------函数申明------------------------------------------

void Delay_us(uchar n)

void DoClock()

void Delay_ms(uchar n)

unsigned char Spi_ByteRead(void)

void Spi_ByteWrite(unsigned char send)

void Config2401(void)

void SetTxMode(void)

void nRF2401_TxPacket(uchar TxBuf[])

//--------------------------------11.0592M晶振 n=100 868us 左右-------------------------------

void Delay_us(uchar n)

{

uint i

for(i=0i<ni++)

}

//------------------------------------------ -----------------------------------------

void Delay_ms(uchar n)

{

unsigned int i,j,kfor(i=0i<ni++)

{

for(k=0k<5k++)

{

for(j=0j<200j++)

}

}

}

/*

//--------------------------SPI读------------------------------------------

unsigned char Spi_ByteRead(void)

{

unsigned char i = 0

for (i=0i<8i++)

{

DATA_BUF = DATA_BUF <<1

CLK1 = 1

DATA = 1//设置为输入状态

if (DATA) //读取最高位,保存至最末尾,通过左移位完成整个字节

{

DATA_BUF |= BYTE_BIT0

}

else

{

DATA_BUF &= ~BYTE_BIT0

}

CLK1 = 0

}

return DATA_BUF

}*/

//----------------------------------SPI写-----------------------------------------

void Spi_ByteWrite(unsigned char send)

{

unsigned char iDATA_BUF = sendCLK1 = 0for (i=0i<8i++)

{

if (DATA7) //总是发送最高位

{

DATA = 1

}

else

{

DATA = 0

}

CLK1 = 1

DATA_BUF = DATA_BUF <<1

CLK1 = 0

}

}

//-----------------------------配置2401--------------------------------------------

void Config2401(void)

{

uint i

uchar variable1

PWR_UP=1 //上电

CE=0

CS=1 //使RF2401进入配置方式

Delay_ms(3) //从上电到进入配置模式需要3ms的延时(最少)

for(i=0i<18i++) //输入3个测试字节15个配置字节共 18Byte

{

variable1=nRF2401_Conf[i]

Spi_ByteWrite(variable1)

}

CS=0//Disable CS -----standby mode

DATA=0

Delay_us(100)

}

//--------------------------------设置为发送模式 ----------------------------

void SetTxMode(void)

{

//-------------------------------设置为配置模式----------------------------------

PWR_UP=1 //上电

CE=0

CS=1 //进入配置模式

Delay_us(100)

DATA=0 //配置寄存器0字节RXEN 设置为0: 发送模式

CLK1=1

CLK1=0

//----------------------------设置为 Activemodes(TX)------------------------------

CS=0

CE=1 //set standby mode

Delay_us(100)

}

//--------------------------------nRF 数据发送函数--------------------------------

void nRF2401_TxPacket()

{

int i

uchar variable2

CE=1

for(i=0i<2i++)//写入接受地址(按字节对齐)

{

variable2=TxAddress[i]

Spi_ByteWrite(variable2)

}

for(i=0i<(28)i++) //写入接受地址(按字节对齐)

{

variable2=TxBuf[i]

Spi_ByteWrite(variable2)

}

CE=0 //CE配置低使发送有效

Delay_us(100) //时钟信号高电平有效

}

//------------------------------------主函数---------------------------------------

main()

{

Config2401()

while(1)

{

nRF2401_TxPacket()

SetTxMode()

LED=0 Delay_ms(10)LED=1Delay_ms(10)

}

}

我有一完整的程序,由于担心单片含厅机实验板上的5V电压会损坏24L01,加上需两块单片机协调工缓姿作,因此也没敢试,如果你有条件,帮我试一下,我不要积分,只告诉我实验结果就行

#include "reg52.h"

#include "intrins.h" //_nop_()延时函数用

#define uchar unsigned char

#define uint unsigned int

sbit DATA=P1^1 //发送方管脚配置

sbit CLK1=P1^2

sbit CS=P1^3

sbit CE=P1^4

sbit DR1=P1^5

sbit PWR_UP=P1^6

sbit led1=P1^0

sbit diol=P2^5

/*sbit DATA=P2^1 //接收方管脚配置

sbit CLK1=P2^2

sbit CS=P2^3

sbit CE=P2^4

sbit DR1=P2^5

sbit PWR_UP=P1^6

sbit led1=P3^7

sbit diol=P2^0//没用扰老绝*/

sbit BIT0=ACC^0

sbit BIT7=ACC^7//

uchar TXData[14]

uchar RXData[10]

uchar Data1=0xff

uchar code table1[]={0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}

uchar code table2[]={0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}

delay1ms(int t)

{

uint i

uint j

for(i=0i<ti++)

for(j=0j<116j++)

}

void delay10us(void)

{

uchar y

for(y=0y<10y++)

_nop_()

}

void delay100us(void)

{

uchar y

for(y=0y<100y++)

_nop_()

}

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

/*函数:write( uchar byte)

/*功能:通过IO口写入一个字节到NRF24L01

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

void write(uchar byte)

{

uchar i

ACC=byte

i=8

while(i)

{

DATA=BIT7

CLK1=1// output 'uchar', MSB to MOSI

_nop_()

_nop_() // shift next bit into MSB..

ACC<<=1

CLK1=0 // Set SCK high..

i-- // ..then set SCK low again

}

}

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

/*函数:Read(uchar reg)

/*功能:NRF24L01的读时序

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

uchar Read(void)

{

uchar i

i=8

while(i)

{

CLK1=1// output 'uchar', MSB to MOSI

_nop_()

_nop_() // shift next bit into MSB..

ACC<<=1

BIT0=DATA

CLK1=0 // Set SCK high..

i-- // ..then set SCK low again

}

return ACC // return register value

}

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

/*功能:NRF24L01初始化控制结构体

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

struct RFConfig

{

uchar n

uchar buf[15]

}

typedef struct RFConfig RFConfig

#define ADDR_INDEX 8 //地址起始号为 8

#define ADDR_COUNT 4 //地址占4字节

code RFConfig tconf= //发射时配置字

{

15,//配置字长度15

0x50,//接收通道2数据长度80bit(10byte)

0x50,//接收通道1数据长度80bit(10byte)

0x00,0x00,0x00,0x00,0x00,//接收通道2地址最多40bit(5byte)

0x00,0xaa,0xbb,0x12,0x34,//接收通道1地址最多40bit(5byte)

0x83,//32bit地址长度,16bit crc校验

0x6f,//单通道接收

0x04//02频道发射

}

code RFConfig rconf=//接收时配置字

{

15,

0x50,

0x50,

0x00,0x00,0x00,0x00,0x00,

0x00,0xaa,0xbb,0x12,0x34,

0x83,

0x6f,

0x05//2频道接收

}

void nrf2401_on()

{

CE=0

CS=0

PWR_UP=1

delay1ms(3)

}

void nrf2401init_receiver(void)//接收初始化

{

uchar b

CE=0

CS=1

delay10us()

for(b=0b<rconf.nb++)//rconf.n=15

{

write(rconf.buf[b])

}

CE=1

CS=0

}

void nrf2401init_transmitter(void)//发射初始化

{

uchar b

CE=0

CS=1

delay10us()

for(b=0b<rconf.nb++)//rconf.n和tconf.n相等

{

write(tconf.buf[b])

}

CS=0

}

void nrf2401set_rxmode(void)//接收初始化后快速进入接收状态

{

CE=0

CS=1

delay10us()

write(rconf.buf[14])//写入命令0x05

CE=1

CS=0

}

void nrf2401set_txmode(void)//发射初始化后快速进入发射状态

{

CE=0

CS=1

delay10us()

write(tconf.buf[14])//写入命令0x04

CE=1

CS=0

}

void tx_packet(uchar m)//m=1发射数据包选table1,m=2选table2

{

uchar i

TXData[0]=0xaa//要不要补1个地址码0x00?不用,前面已设32bit地址长度,

TXData[1]=0xbb

TXData[2]=0x12

TXData[3]=0x34

if (m==1)

{

for(i=4i<14i++)

{TXData[i]=table1[i-4]}

}

else

{

for(i=4i<14i++)

{TXData[i]=table2[i-4]}

}

CS=0CE=1

delay10us()

for(i=0i<14i++)

{

write(TXData[i])

}

CE=0

}

/*void tx_packet(void)//发射数据包

{

uchar i

TXData[0]=0xaa//要不要补1个地址码0x00?不用,前面已设32bit地址长度,

TXData[1]=0xbb

TXData[2]=0x12

TXData[3]=0x34

for(i=4i<14i++)

{TXData[i]=table2[i-4]}

CS=0CE=1

delay10us()

for(i=0i<14i++)

{

write(TXData[i])

}

CE=0

}*/

void recevice_packet(void)//接收数据包

{

uchar i

for(i=0i<10i++)

{

RXData[i]=Read()

}

}

//发射方先发一个数据包,其中第5个数据(TXData[4])为0x88,然后进入接收状态,若收到的数据包第5个数是0x99,则点亮发光二极管

//接收方先进入接收状态,若收到的数据包第5个数是0x88,则点亮LED并发送一个数据包,其中第5个是0x99

void main(void)//发射方主程序

{

nrf2401_on()

nrf2401init_transmitter()

nrf2401set_txmode//进入发射状态

tx_packet(1)//发射数据包1第4个数据为0x88

nrf2401init_receiver()

nrf2401set_rxmode()//进入接收状态

while(DR1!=1)

recevice_packet()//接收数据包

diol=1//开通锁存器

if(RXData[4]==0x99)//如果收到正确遥数据0x99,则灯亮说明通信成功

{

led1=0

}

while(1)

}

/*void main(void)//接收方主程序

{

nrf2401_on()

nrf2401init_receiver()

nrf2401set_rxmode()//进入接收状态

while(DR1!=1)

recevice_packet()//接收数据包

diol=1//开通锁存器

if(RXData[4]==0x88)//如果收到正确遥数据0x88,则灯亮说明通信成功

{

led1=0

}

nrf2401init_transmitter()

nrf2401set_txmode//进入发射状态

delay1ms(10)//延时,让发送方准备好

tx_packet(2)//发射数据包2,第4个数据为0x99

while(1)

}*/


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12568931.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存