OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7235|回复: 11

24L01多通道通信,只有通道0和通道1可以传输数据(论坛里的帖子都看了下,改了一下,但还是无法调通)

[复制链接]

17

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2015-1-2
在线时间
18 小时
发表于 2015-5-24 22:15:31 | 显示全部楼层 |阅读模式
5金钱
<div   style="background-color:#E8E8E8;">
[mw_shl_code=c,true]设置的地址:[/mw_shl_code]
[mw_shl_code=c,true]const u8 TX_ADDRESS[TX_ADR_WIDTH]= {0x00,0xc2,0xc2,0xc2,0xc2}; //发送地址;; //发送地址()
const u8 RX_ADDRESS[RX_ADR_WIDTH]= {0x00,0xc2,0xc2,0xc2,0xc2}; //接收地址0
const u8 RX_ADDRESS1[RX_ADR_WIDTH]={0x01,0xc2,0xc2,0xc2,0xc2}; //接收地址1
const u8 RX_ADDRESS2[RX_ADR_WIDTH]={0x02,0xc2,0xc2,0xc2,0xc2}; //接收地址2
const u8 RX_ADDRESS3[RX_ADR_WIDTH]={0x03,0xc2,0xc2,0xc2,0xc2}; //接收地址3
const u8 RX_ADDRESS4[RX_ADR_WIDTH]={0x04,0xc2,0xc2,0xc2,0xc2}; //接收地址4
const u8 RX_ADDRESS5[RX_ADR_WIDTH]={0x05,0xc2,0xc2,0xc2,0xc2}; //接收地址5[/mw_shl_code]
[mw_shl_code=c,true]接收机配置:[/mw_shl_code]
[mw_shl_code=c,true]
        <div   style="background-color:#E8E8E8;">
               
[mw_shl_code=c,true]void NRF24L01_RX_Mode(void)
{
  NRF24L01_CE=0;          
  NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);//写RX0节点地址
  NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P1,(u8*)RX_ADDRESS1,RX_ADR_WIDTH);//写RX1节点地址  
  NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P2,(u8*)RX_ADDRESS2,RX_ADR_WIDTH);//写RX2节点地址
  NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P3,(u8*)RX_ADDRESS3,RX_ADR_WIDTH);//写RX3节点地址
  NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P4,(u8*)RX_ADDRESS4,RX_ADR_WIDTH);//写RX4节点地址
  NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P5,(u8*)RX_ADDRESS5,RX_ADR_WIDTH);//写RX5节点地址

  NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x3f);    //使能通道0,1,2,3,4,5的自动应答   
  NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x3f);//使能通道0,1,2,3,4,5的接收地址           
  NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);             //设置RF通信频率                  
  NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0~5的有效数据宽度
  NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P1,RX_PLOAD_WIDTH);
  NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P2,RX_PLOAD_WIDTH);
  NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P3,RX_PLOAD_WIDTH);
  NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P4,RX_PLOAD_WIDTH);
  NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P5,RX_PLOAD_WIDTH);
  NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启   
  NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0f);//配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式
  NRF24L01_CE = 1; //CE为高,进入接收模式
}                                                 [/mw_shl_code]
发送机配置:
                <div   style="background-color:#E8E8E8;">
[mw_shl_code=c,true]void NRF24L01_TX_Mode(void)//通道2发送
{                                                                                                                 
        NRF24L01_CE=0;            
  NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)RX_ADDRESS2,TX_ADR_WIDTH);//写TX节点地址,是通道2
  NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,5); //设置RX节点地址,主要为了使能ACK          
  NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x3f);     //使能通道0~5的自动应答   
  NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x3f); //使能通道0~5的接收地址  
  NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
  NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);       //设置RF通道为40
  NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);  //设置TX发射参数,0db增益,2Mbps,低噪声增益开启   
  NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e);    //配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
        NRF24L01_CE=1;//CE为高,10us后启动发送
}[/mw_shl_code]
                </div>
<br />
        </div>
<br />
<br />
[/mw_shl_code]
</div>

最佳答案

查看完整内容[请看2#楼]

刚刚从全网各处找资料做2401的作品,也终于调通了,配置2401通道的时候,不能跳过前边的通道直接配置后边的,要一个一个的配置,可以不开不需要的通道,但是一定要配置
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2019-5-18
在线时间
13 小时
发表于 2015-5-24 22:15:32 | 显示全部楼层
刚刚从全网各处找资料做2401的作品,也终于调通了,配置2401通道的时候,不能跳过前边的通道直接配置后边的,要一个一个的配置,可以不开不需要的通道,但是一定要配置
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-5-24 23:21:10 | 显示全部楼层
帮顶。。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

12

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
326
金钱
326
注册时间
2018-5-8
在线时间
37 小时
发表于 2019-5-28 20:25:51 | 显示全部楼层
xiaoxiao白 发表于 2015-5-24 22:15
刚刚从全网各处找资料做2401的作品,也终于调通了,配置2401通道的时候,不能跳过前边的通道直接配置后边的 ...

你好,我最近一直在弄多通道组网,前不久我已经实现了点对点的数据传送,现在想弄一对多,在百度上看了两天,自己最近也改了挺多数据,还是不行,可以帮助一下吗,分享一下一对多的源代码
回复

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2019-5-18
在线时间
13 小时
发表于 2019-6-2 17:11:09 | 显示全部楼层
18877617825 发表于 2019-5-28 20:25
你好,我最近一直在弄多通道组网,前不久我已经实现了点对点的数据传送,现在想弄一对多,在百度上看了两 ...

一对多的代码没办法给你,不过通道配置可以贴一下
void NRF24L01_RX0_Mode(void)
{
    NRF24L01_CE=0;   
    NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS0,RX_ADR_WIDTH);//写P0的Rx节点地址
                NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P1,(u8*)RX_ADDRESS1,RX_ADR_WIDTH);//写P0的Rx节点地址 不用也要配置
                NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P2,(u8*)RX_ADDRESS2,1);//写P0的Rx节点地址 不用也要配置
                NRF24L01_Write_Reg(FLUSH_RX,0xff);                                                                        //清除RX FIFO寄存器

    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01);    //使能0通道的自动应答   
    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01);//使能0通道的接收地址   
    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);      //设置RF通信频率      
    NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//选择通道0的有效数据宽度      
    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启   
    NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式
    NRF24L01_CE = 1; //CE为高,进入接收模式
}


void NRF24L01_RX1_Mode(void)
{
    NRF24L01_CE=0;   
                NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS0,RX_ADR_WIDTH);//写P0的Rx节点地址 不用也要配置
    NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P1,(u8*)RX_ADDRESS1,RX_ADR_WIDTH);//写P1的Rx节点地址
                NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P2,(u8*)RX_ADDRESS2,1);//写P0的Rx节点地址 不用也要配置
                NRF24L01_Write_Reg(FLUSH_RX,0xff);                                                                        //清除RX FIFO寄存器

    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x02);    //使能所有通道的自动应答   
    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x02);//使能所有通道的接收地址   
    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);      //设置RF通信频率      
    NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P1,RX_PLOAD_WIDTH);//选择通道1的有效数据宽度        
    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启   
    NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式
    NRF24L01_CE = 1; //CE为高,进入接收模式
}

void NRF24L01_RX2_Mode(void)
{
    NRF24L01_CE=0;   
                NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS0,RX_ADR_WIDTH);//写P0的Rx节点地址 不用也要配置
    NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P1,(u8*)RX_ADDRESS1,RX_ADR_WIDTH);//写P1的Rx节点地址 不用也要配置
                NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P2,(u8*)RX_ADDRESS2,1);//写P0的Rx节点地址
                NRF24L01_Write_Reg(FLUSH_RX,0xff);                                                                        //清除RX FIFO寄存器

    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x04);    //使能所有通道的自动应答   
    NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x04);//使能所有通道的接收地址   
    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);      //设置RF通信频率      
    NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P2,RX_PLOAD_WIDTH);//选择通道1的有效数据宽度        
    NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启   
    NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式
    NRF24L01_CE = 1; //CE为高,进入接收模式
}
上边是通道0 1 2的配置,你可以参考一下, 两个2401的不同通道时可以互相通信的,比如主机上的1通道和从机上的0通道,只要基础设置都一样,就可以互相通信。
回复

使用道具 举报

12

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
326
金钱
326
注册时间
2018-5-8
在线时间
37 小时
发表于 2019-6-3 10:30:56 | 显示全部楼层
感谢,十分有用的代码

回复

使用道具 举报

3

主题

20

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2019-5-14
在线时间
11 小时
发表于 2019-7-4 15:54:51 | 显示全部楼层
18877617825 发表于 2019-6-3 10:30
感谢,十分有用的代码

同学请问你改好了么,可否看一下你的代码呢
回复

使用道具 举报

21

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
633
金钱
633
注册时间
2018-3-16
在线时间
105 小时
发表于 2019-7-18 17:12:43 | 显示全部楼层
xiaoxiao白 发表于 2019-6-2 17:11
一对多的代码没办法给你,不过通道配置可以贴一下
void NRF24L01_RX0_Mode(void)
{

请问,如果多个发送方同时发送的话,接收端产生的冲突应该怎么解决呢?
回复

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2019-5-18
在线时间
13 小时
发表于 2019-7-18 22:10:40 | 显示全部楼层
lookae 发表于 2019-7-18 17:12
请问,如果多个发送方同时发送的话,接收端产生的冲突应该怎么解决呢?

一般配置好了的话是不会产生冲突问题的,两个发送方同时发送(这里同时,但是接收端总会先接收到一个),此时接收端2401硬件的数据缓冲区会数据,如果你不把数据读出来并且把数据标志位清0的话,好像是不会更新数据的,这个我没有尝试过,你可以试试看,多看看数据手册,上边写的很清楚的
回复

使用道具 举报

21

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
633
金钱
633
注册时间
2018-3-16
在线时间
105 小时
发表于 2019-7-19 10:22:05 | 显示全部楼层
xiaoxiao白 发表于 2019-7-18 22:10
一般配置好了的话是不会产生冲突问题的,两个发送方同时发送(这里同时,但是接收端总会先接收到一个), ...

好的,谢谢!
回复

使用道具 举报

12

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
326
金钱
326
注册时间
2018-5-8
在线时间
37 小时
发表于 2019-9-9 17:20:05 | 显示全部楼层
我已经完成了,不过我的多对一是点对点的,并没有让数据同时接收
回复

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2018-9-18
在线时间
31 小时
发表于 2019-12-3 16:16:05 | 显示全部楼层
楼主你好,如果两个相同信道和地址相同的接收机放在一起,另外放一个发射机发送数据,两个接收机会互相干扰吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 22:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表