pc端用usb转串口链接nrf24l01 和51单片机上的nrf24l01通信

pc端用usb转串口链接nrf24l01 和51单片机上的nrf24l01通信,第1张

这个应该是遇到了一些调试方面的问题,给出一下建议:

1、先不连接串口,排查是否是无线收发间出的问题,直接让发送端给接收端发送数,在发送端发送完成后,写一个点灯的程序,在接收端的中断里面写一个点灯的程序,这样可以判断到就无线通讯是否正常;

2、在上一条正常的情况下,看下是否串口发送数据是否有错,可以先将USB转串口线的收发端短接,形成回环模式,通过串口调试助手看回环数据是否正确;

3、nrf24l01通讯距离大约在50米左右,适当调整距离,收发端不用同一个电源供电尝试一下;

4、如果上述方式未能解决问题,那就要看接收发送端的配置代码,这种情况下,既有可能是配置不正确。

是SPI接口吧,就是将相应接口连接起来就行,这是发送的,如果想加按键,可在主函数接收前指定一个I/O口用于按键设置,

#include <reg52h>

#include <intrinsh>

#include <apih>

//

#define uchar unsigned char

#define TX_ADR_WIDTH 5 // 5字节宽度的发送/接收地址

#define TX_PLOAD_WIDTH 4 // 数据通道有效数据宽度

uchar code TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01}; // 定义一个静态发送地址

//uchar code RX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x02};

uchar RX_BUF[TX_PLOAD_WIDTH];

uchar TX_BUF[TX_PLOAD_WIDTH] = {0x22,0x34,0x56,0x78};

uchar flag;

uchar DATA = 0x01;

uchar bdata sta;

sbit RX_DR = sta^6;

sbit TX_DS = sta^5;

sbit MAX_RT = sta^4;

//

/

函数: init_io()

描述:初始化IO

//

void init_io(void)

{

CE = 0; // 待机

CSN = 1; // SPI禁止

SCK = 0; // SPI时钟置低

IRQ = 1; // 中断复位

}

//

/

函数:delay_ms()

描述:延迟x毫秒

//

void delay_ms(uchar x)

{

uchar i, j;

i = 0;

for(i=0; i<x; i++)

{

j = 250;

while(--j);

j = 250;

while(--j);

}

}

//

/

函数:SPI_RW()

描述:根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01读出一字节

//

uchar SPI_RW(uchar byte)

{

uchar i;

for(i=0; i<8; i++) // 循环8次

{

MOSI = (byte & 0x80); // byte最高位输出到MOSI

byte <<= 1; // 低一位移位到最高位

SCK = 1; // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据

byte |= MISO; // 读MISO到byte最低位

SCK = 0; // SCK置低

}

return(byte); // 返回读出的一字节

}

//

/

函数:SPI_RW_Reg()

描述:写数据value到reg寄存器

//

uchar SPI_RW_Reg(uchar reg, uchar value)

{

uchar status;

CSN = 0; // CSN置低,开始传输数据

status = SPI_RW(reg); // 选择寄存器,同时返回状态字

SPI_RW(value); // 然后写数据到该寄存器

CSN = 1; // CSN拉高,结束数据传输

return(status); // 返回状态寄存器

}

//

/

函数:SPI_Write_Buf()

描述:把pBuf缓存中的数据写入到nRF24L01,通常用来写入发射通道数据或接收/发送地址

//

uchar SPI_Write_Buf(uchar reg, uchar pBuf, uchar bytes)

{

uchar status, i;

CSN = 0; // CSN置低,开始传输数据

status = SPI_RW(reg); // 选择寄存器,同时返回状态字

for(i=0; i<bytes; i++)

SPI_RW(pBuf[i]); // 逐个字节写入nRF24L01

CSN = 1; // CSN拉高,结束数据传输

return(status); // 返回状态寄存器

}

//

/

函数:TX_Mode()

描述:这个函数设置nRF24L01为发送模式,(CE=1持续至少10us),130us后启动发射,数据发送结束后,发送模块自动转入接收模式等待应答信号。

//

void TX_Mode(uchar BUF)

{

CE = 0;

SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写入发送地址

SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 为了应答接收设备,接收通道0地址和发送地址相同

SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH); // 写数据包到TX FIFO

SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 使能接收通道0自动应答

SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0

SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0); // 自动重发延时等待250us+86us,自动重发10次

SPI_RW_Reg(WRITE_REG + RF_CH, 40); // 选择射频通道0x40

SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x01); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益

SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // CRC使能,16位CRC校验,上电

CE = 1;

}

//

/

函数:Check_ACK()

描述:检查接收设备有无接收到数据包,设定没有收到应答信号是否重发

//

uchar Check_ACK(bit clear)

{

while(IRQ);

sta = SPI_RW(NOP); // 返回状态寄存器

if(MAX_RT)

if(clear) // 是否清除TX FIFO,没有清除在复位MAX_RT中断标志后重发

SPI_RW(FLUSH_TX);

SPI_RW_Reg(WRITE_REG + STATUS, sta); // 清除TX_DS或MAX_RT中断标志

IRQ = 1;

if(TX_DS)

return(0x00);

else

return(0xff);

}

//

/

函数:main()

描述:主函数

//

void main(void)

{

init_io();

while(1)

{

TX_Mode(TX_BUF);

Check_ACK(1);

delay_ms(1000);

}

}

//

我这里有24L01完整的代码和一个配套使用资料,这是我在电子设计大赛中使用过的,资料也是当时参考的,个人觉得写的很精辟很简练。 程序也是试验过的,备注比较完整,相信您参考资料对应您的具体情况稍作修改即可使用了。 如果还有什么问题,欢迎随时交流。 祝您的问题早日得到解决~~

参考资料:

>

以上就是关于pc端用usb转串口链接nrf24l01 和51单片机上的nrf24l01通信全部的内容,包括:pc端用usb转串口链接nrf24l01 和51单片机上的nrf24l01通信、51单片机有sip怎样控制nRF24L01无线模块、2.4G无线通信NRF24L01与C51单片机程序问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9291708.html

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

发表评论

登录后才能评论

评论列表(0条)

保存