OpenEdv-开源电子网

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

NRF24L01 问题。。自动应答和不自动应答的区别。。我自动应答怎么就不行呢。程序是移植原子哥的。

[复制链接]

5

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2012-11-30
在线时间
1 小时
发表于 2014-7-13 17:06:44 | 显示全部楼层 |阅读模式
5金钱
自检能通过,但是设置发送模式,就是不行。。<br />
<br />
但是直接把自动应答给使能了,显示就是发射成功,但是接收不到。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2012-11-30
在线时间
1 小时
 楼主| 发表于 2014-7-13 17:07:02 | 显示全部楼层
回复

使用道具 举报

5

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2012-11-30
在线时间
1 小时
 楼主| 发表于 2014-7-13 17:12:14 | 显示全部楼层
<div   style="background-color:#E8E8E8;">
[mw_shl_code=c,true]工作模式设置函数:[/mw_shl_code]
[mw_shl_code=c,true]void NRF24L01_TX_Mode(void)
{                                                                                                                 
        NRF24L01_CE_Reset;
       
        NRF24L01_Write_Buf(NRF24L01_Command_WRITE_RESISTER + NRF24L01_Register_TX_ADDR ,(unsigned char*)TX_ADDRESS,TX_ADR_WIDTH);//写TX节点地址
        NRF24L01_Write_Buf(NRF24L01_Command_WRITE_RESISTER + NRF24L01_Register_RX_ADDR_P0 ,(unsigned char*)RX_ADDRESS,RX_ADR_WIDTH); //设置TX节点地址,主要为了使能ACK          
       
        NRF24L01_Write_Register(NRF24L01_Command_WRITE_RESISTER + NRF24L01_Register_EEAA ,0x00);     //使能通道0的自动应答   
        NRF24L01_Write_Register(NRF24L01_Command_WRITE_RESISTER + NRF24L01_Register_EN_RXADDR ,0x01); //使能通道0的接收地址  
        NRF24L01_Write_Register(NRF24L01_Command_WRITE_RESISTER + NRF24L01_Register_SETUP_RETR ,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次
        NRF24L01_Write_Register(NRF24L01_Command_WRITE_RESISTER + NRF24L01_Register_RF_CH ,40);       //设置RF通道为40
        NRF24L01_Write_Register(NRF24L01_Command_WRITE_RESISTER + NRF24L01_Register_RF_SETUP ,0x0f);  //设置TX发射参数,0db增益,2Mbps,低噪声增益开启   
        NRF24L01_Write_Register(NRF24L01_Command_WRITE_RESISTER + NRF24L01_Register_CONFIG ,0x0e);    //配置基本工作模式的参数WR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
       
        NRF24L01_CE_Set;//CE为高,10us后启动发送
       
        delay_us(20);
}[/mw_shl_code]
</div>
<br />
<br />
<br />
<div   style="background-color:#E8E8E8;">
[mw_shl_code=c,true]发送函数:[/mw_shl_code]
[mw_shl_code=c,true]//启动NRF24L01发送一次数据
//txbuf:待发送数据首地址
//返回值:发送完成状况
unsigned char NRF24L01_TxPacket(unsigned char *txbuf)
{
        unsigned char sta;
//        SPI_InitTypeDef SPI_InitStructure;
//       
//        //设置SPI1的速率   
//        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
//        SPI_Init(SPI1,&amp;SPI_InitStructure);       
//        SPI_Cmd(SPI1,ENABLE); //使能SPI1
       
        NRF24L01_CE_Reset;
        NRF24L01_Write_Buf(NRF24L01_Command_WRITE_RX_PAYLOAD ,txbuf,TX_PLOAD_WIDTH);//写数据到TX BUF  32个字节
        NRF24L01_CE_Set;//启动发送
       
        while(NRF24L01_IRQ != 0);//等待发送完成
//        while(CheckACK());       
       
        sta = NRF24L01_Read_Register( NRF24L01_Register_STATUS );  //读取状态寄存器的值          
       
//        USART_SendData(USART1,sta);
       
        NRF24L01_Write_Register(NRF24L01_Command_WRITE_RESISTER + NRF24L01_Register_STATUS,sta); //清除TX_DS或MAX_RT中断标志
       
        if(sta &amp; MAX_TX)//达到最大重发次数
        {
                NRF24L01_Write_Register(NRF24L01_Command_FLUSH_TX,0xff);//清除TX FIFO寄存器
                return MAX_TX;
        }
       
        if(sta &amp; TX_OK)//发送完成
        {
                return TX_OK;
        }
       
        return 0xff;//其他原因发送失败
}
[/mw_shl_code]
</div>
<br />
<div   style="background-color:#E8E8E8;">
[mw_shl_code=c,true]主函数:[/mw_shl_code]
[mw_shl_code=c,true]int main(void)
{        
       
        RCC_Configuration();   //用外部的晶振 来产生时钟
        Usart_Configuration();
    Systick_configuration();
        NRF24L01_Init();
        delay_ms(100);
       
        printf(" Hello..\r\n");
        printf("SPI Test--NRF24L01 Test...\r\n");
        printf("两个嘴巴笑\r\n");
        printf("2014-07-13\r\n\r\n");
        delay_ms(1000);
       
        while(NRF24L01_Check())
        {
                printf("NRF24L01 Check Failed!\r\n");
                printf("两个嘴巴笑\r\n");
                printf("2014-07-13\r\n\r\n");
                delay_ms(1000);
        }
       
        printf("NRF24L01 Check Success!\r\n");
        printf("两个嘴巴笑\r\n");
        printf("2014-07-13\r\n\r\n");
       
        delay_ms(1000);
       
       
        while(1)
        {
                NRF24L01_TX_Mode();
                if(NRF24L01_TxPacket(buff) == TX_OK)
                {
                        printf("NRF24L01 Send Success!\r\n");
                        printf("两个嘴巴笑\r\n");
                        printf("2014-07-13\r\n\r\n");
                        delay_ms(100);
                }
                else
                {
                        printf("NRF24L01 Send Failed!\r\n");
                        printf("两个嘴巴笑\r\n");
                        printf("2014-07-13\r\n\r\n");
                        delay_ms(1000);
                }
        }

}
[/mw_shl_code]
</div>
<br />
运行结果:但是在另外一块战舰的板子上接收不到数据。<br />

<br />
<br />
回复

使用道具 举报

5

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2012-11-30
在线时间
1 小时
 楼主| 发表于 2014-7-13 17:14:19 | 显示全部楼层
如果使用自动应答的话,程序一直在检测IRQ的引脚这里死等。。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-7-13 23:15:19 | 显示全部楼层
NRF24L01_TX_Mode();
<br>这句话,放到while1之外去...
<br>放里面,&nbsp;是个奇葩.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2012-11-30
在线时间
1 小时
 楼主| 发表于 2014-7-14 19:01:53 | 显示全部楼层
回复【5楼】正点原子:
<br>---------------------------------
<br>我原来就是放在while(1)外面的,但是还是一样的效果。。。是不是和自动应答有关系。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-7-14 23:04:03 | 显示全部楼层
回复【6楼】两个嘴巴笑110:
<br>---------------------------------
<br>你这是开启了自动应答。
<br>只要两边都开启了,就无所谓啊
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2012-11-30
在线时间
1 小时
 楼主| 发表于 2014-7-14 23:12:26 | 显示全部楼层
回复【7楼】正点原子:
<br>---------------------------------
<br>我想做那种有源射频卡,可以这样做么?我只管发,
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-7-17 23:59:59 | 显示全部楼层
回复【8楼】两个嘴巴笑110:
<br>---------------------------------
<br>可以,但是要禁止自动应答
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

110

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2013-9-16
在线时间
0 小时
发表于 2014-12-25 10:27:27 | 显示全部楼层
您好,你用过无线吗,最新推荐WLK01L39无线应用首选-隔墙效果极佳
<br>样品75折体验:http://item.taobao.com/item.htm?id=36264057764
<br>选购3个WLK01L39以上即可免费获取测试板:http://item.taobao.com/item.htm?id=40102876157批量更优惠
<br>WLK01L39开发包资料百度网盘下载连接:http://pan.baidu.com/s/1Go9YI
<br>无线数据传输方面的有空看看,欢迎交流
<br>
<br>基本工作原理:
<br>模块平时处于接收状态,一旦收到数据,就把收到的数据通过UART输出,这时你可以用单片机来个中断接收函数啊,把数据读取存储,
<br>发送数据的时候把要发的数据通过UART送给模块,他就自动发送,发送完毕,自动切换到接收模式
<br>
<br>====================================================================
<br>例如跳频多点通讯,
<br>====================================================================
<br>例如
<br>当主机为WLK01L39模块,且主机节点A频率值为470MHZ(470000转换为16进制为:0x07&nbsp;0x2B&nbsp;0xF0),
<br>&nbsp;
<br>从机B频率参数:471MHZ(0x07&nbsp;0x2f&nbsp;0xD8)&nbsp;,从机C频率参数:472MHZ(0x07&nbsp;0x33&nbsp;0xC0)
<br>主机可以通过切换频率参数来分别和B&nbsp;C节点通讯,方法如下
<br>&nbsp;
<br>第一步-&gt;&nbsp;设置电平SETA=1&nbsp;SETB=1&nbsp;进入参数设置模式
<br>第二步-&gt;&nbsp;0xFF&nbsp;0x56&nbsp;0xAE&nbsp;0x35&nbsp;0xA9&nbsp;0x55&nbsp;0x9F&nbsp;0x00&nbsp;0x03&nbsp;0x07&nbsp;0x2f&nbsp;0xD8
<br>第三步-&gt;&nbsp;等待返回0x24&nbsp;0x24&nbsp;0x24&nbsp;0x07&nbsp;0x2f&nbsp;0xD8&nbsp;后再设置电平SETA=0&nbsp;SETB=0&nbsp;进入正常收发模式
<br>第四步-&gt;&nbsp;输入要传的数据即可将数据传输给B节点
<br>&nbsp;
<br>&nbsp;
<br>第五步-&gt;&nbsp;设置电平SETA=1&nbsp;SETB=1&nbsp;进入参数设置模式
<br>第六步-&gt;&nbsp;0xFF&nbsp;0x56&nbsp;0xAE&nbsp;0x35&nbsp;0xA9&nbsp;0x55&nbsp;0x9F&nbsp;0x00&nbsp;0x03&nbsp;0x07&nbsp;0x33&nbsp;0xC0
<br>第七步-&gt;&nbsp;等待返回0x24&nbsp;0x24&nbsp;0x24&nbsp;0x07&nbsp;0x33&nbsp;0xC0后再设置电平SETA=0&nbsp;SETB=0&nbsp;进入正常收发模式
<br>第八步-&gt;&nbsp;输入要传的数据即可将数据传输给C节点
<br>&nbsp;
<br>更多节点以此类推即可
<br>&nbsp;
<br>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
<br>例如变址多点通讯,
<br>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
<br>&nbsp;
<br>例如
<br>当主机为WLK01L39模块,
<br>主机A本机地址1:0x01,本机地址2:0x01,
<br>从机B本机地址1:0x02&nbsp;,本机地址2:0x01&nbsp;,
<br>从机C本机地址1:0x03,本机地址2:0x01&nbsp;,&nbsp;&nbsp;
<br>主机可以通过切换目标地址参数来分别和B&nbsp;C节点通讯,因为在频率一样的前提下
<br>只有主机的目标地址和从机的本机地址一致时,对应从机才能与其建立通讯,并接收数据方法如下
<br>&nbsp;
<br>第一步-&gt;&nbsp;设置电平SETA=1&nbsp;SETB=1&nbsp;进入参数设置模式
<br>第二步-&gt;&nbsp;0xFF&nbsp;0x56&nbsp;0xAE&nbsp;0x35&nbsp;0xA9&nbsp;0x55&nbsp;0x8E&nbsp;0x00&nbsp;0x01&nbsp;0x02&nbsp;
<br>第三步-&gt;&nbsp;等待返回0x24&nbsp;0x24&nbsp;0x24&nbsp;&nbsp;0x02&nbsp;后再&nbsp;设置电平SETA=0&nbsp;SETB=0&nbsp;进入正常收发模式
<br>第四步-&gt;&nbsp;输入要传的数据即可将数据传输给B节点
<br>&nbsp;
<br>&nbsp;
<br>第五步-&gt;&nbsp;设置电平SETA=1&nbsp;SETB=1&nbsp;进入参数设置模式
<br>第六步-&gt;&nbsp;0xFF&nbsp;0x56&nbsp;0xAE&nbsp;0x35&nbsp;0xA9&nbsp;0x55&nbsp;0x8E&nbsp;0x00&nbsp;0x01&nbsp;0x03
<br>第七步-&gt;&nbsp;等待返回0x24&nbsp;0x24&nbsp;0x24&nbsp;&nbsp;0x03&nbsp;后再设置电平SETA=0&nbsp;SETB=0&nbsp;进入正常收发模式
<br>第八步-&gt;&nbsp;输入要传的数据即可将数据传输给C节点
<br>&nbsp;
<br>更多节点以此类推即可
<br>&nbsp;
<br>###################################################################
<br>多点通讯还有一种最简单的方式,就是点名通讯
<br>###################################################################
<br>1.主机和从机的参数都完全一样
<br>2.都处于正常收发模式
<br>3.当主机A发0x01(该指令可自定义),
<br>&nbsp;&nbsp;当从机B和从机C都收到0x01,
<br>&nbsp;&nbsp;从机B视0x01为上传数据命令,立刻发射要上传数据,然后主机A会收到B上传数据,而从机C视0x01为无效指令,不发送数据
<br>&nbsp;&nbsp;当主机A发0x02(该指令可自定义),
<br>&nbsp;&nbsp;当从机B和从机C都收到0x01,
<br>&nbsp;&nbsp;从机C视0x02为上传数据指令,立刻发射要上传数据,然后主机A会收到C上传数据,而从机B视0x02为无效指令,不发送数据
<br>更多节点以此类推即可
<br>------------------
<br>NRF905&nbsp;RF903&nbsp;CC1100&nbsp;CC2500&nbsp;CC1020&nbsp;NRF2401&nbsp;NRF24L01&nbsp;无线数传芯片/模块性能汇总及应用指南
<br>你好,我们是无线制造供应商,欢迎交流
<br>QQ:35625400&nbsp;&nbsp;&nbsp;&nbsp;MSN:ll88mm88@hotmail.com&nbsp;
<br>HONE:13704018223&nbsp;&nbsp;&nbsp;陈工
RFinchina 团队欢迎无线方面的技术交流 QQ 474882985
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-4-19
在线时间
4 小时
发表于 2016-5-28 10:18:50 | 显示全部楼层
if(NRF24L01_TxPacket(buff) == TX_OK)  ;什么意思,特别是TX_ok
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 08:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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