OpenEdv-开源电子网

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

原子哥,十万火急啊。一块探索者STM32F4+2块NRF24L01自发自收怎么就是收不到呢?

[复制链接]

2

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-11-13
在线时间
0 小时
发表于 2015-11-13 21:27:08 | 显示全部楼层 |阅读模式
5金钱
打算一块探索者STM32F4+2块NRF24L01自发自收,应该是可以实现的吧?只将PG10(FSMC_NE3)拉高了(关掉了SRAM),不知道还有没有其他冲突。现在两个NRF都可以Check(两个Check当然是分开的了)通过,发送端的NRF可以发,但是接收端的NRF就是收不到。<br />
<br />
先说一下现在的情况:<br />
硬件:<br />
①一块探索者STM32F4<br />
②两块NRF24L01模块(找别人试过可以收发)<br />
<br />
连接:<br />
①一块NRF(后称TX_NRF)插开发板的专用接口,作发送<br />
②一块NRF(后称RX_NRF)作接收,用杜邦线将模块与IO口连接起来,连接如下:<br />
1.PG3作IRQ,PG5作CSN,PG7作CE<br />
2.使用PC10~12复用为SPI3<br />
<br />
查了开发板的专用接口的原理图和PCB板图,知道了NRF模块每个脚的功能,所以<span>RX_NRF的连接如下:<br />

</span><br />

<br />

<br />
软件:<br />
①复制原子大哥的24l01.c为RX_NRF24L01.c。里面的RX_NRF24L01_Init负责初始化RX_NRF。<br />
②<span>24l01.c的<span>NRF24L01_Init改名为TX_<span>NRF24L01_Init</span></span>。另外还取消了SPI1_Init函数,直接<span>在</span><span>_NRF24L01_Init</span>里一次过初始化完。<br />
③所有IO的速度都调低为25MHz,SPI预分频值设置为SPI_BaudRatePrescaler_8<br />
④在spi.h和spi.c里增加SPI3_ReadWriteByte函数的声明和定义<br />
⑤main.c去掉了led.h和key.h的使用,并删除了<span>全部</span>led和key的应用代码<br />
<br />
main函数(部分,所有省略号的注释都是省略了代码):<br />
</span><span>
<div   style="background-color:#E8E8E8;">
[mw_shl_code=c,true]int main(void)
{
// ……这部分代码先省略了
TX_NRF24L01_Init();   //初始化NRF24L01
RX_NRF24L01_Init();   //初始化NRF24L01

        POINT_COLOR=RED;        //设置字体为红色

while(TX_NRF24L01_Check())
{
// ……这部分代码先省略了
}

delay_ms(400);
while(RX_NRF24L01_Check())
{
// ……这部分代码先省略了
}

// 初始化mode=0,进入发送模式
mode = 0;

// 生成要发送的字符串
// ……这部分代码先省略了

// 发送端初始化为发送状态
TX_NRF24L01_TX_Mode();
// 接收端初始化为接收状态
RX_NRF24L01_RX_Mode();

&nbsp;&nbsp;while(1)
&nbsp;&nbsp;{          
&nbsp;&nbsp;&nbsp;&nbsp;if(mode==0)//TX模式
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// ...
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{          
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(TX_NRF24L01_TxPacket(tmp_buf)==TX_OK)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//……
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mode = 1;        // 发送成功改变模式
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{          
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LCD_Fill(0,110,lcddev.width,170+16*3,WHITE);//清空显示          
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LCD_ShowString(30,110,lcddev.width-1,32,16,"Send Failed");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay_ms(500);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;else//RX模式
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LCD_ShowString(30,170,200,16,16,"RX_Mode");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{                  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(RX_NRF24L01_RxPacket(tmp_buf)==0) //一旦接收到信息,则显示出来.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//……
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//mode = 0;        // 读取成功就改变模式
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//……
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mode = 0;        // 读取失败就改变模式
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;}
}[/mw_shl_code]
</div>
完整的代码在附件,要重新生成哦(为了减少体积把OBJ里面的都删了)<br />
原子大神,拜托了,能看看吗?有空的话还可以自己拿两个模块搭来试试,看看我的代码到底为什么收不到呢?</span>

自发自收无线通信.rar

497.72 KB, 下载次数: 750

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

使用道具 举报

557

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-11-13
在线时间
0 小时
 楼主| 发表于 2015-11-13 21:50:29 | 显示全部楼层
回复【2楼】正点原子:
<br>---------------------------------
<br>怎么叫单独测试呢?单独收是没办法测试的了,单独发送STATUS是有发送成功标志位了
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-11-13
在线时间
0 小时
 楼主| 发表于 2015-11-13 21:51:59 | 显示全部楼层
在第三张图可以看到代码的显示,发送应该是成功的,只是接收就是失败了。
<br>
<br>软件补充一点:⑥收发都关闭了自动应答
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-11-13
在线时间
0 小时
 楼主| 发表于 2015-11-13 22:48:21 | 显示全部楼层
发现一个问题,RX_NRF的CE使用了PG7,与TX_NRF的CSN重复了,改成PG1。但是还是一样的失败
回复

使用道具 举报

12

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
245
金钱
245
注册时间
2014-5-26
在线时间
42 小时
发表于 2015-11-15 18:18:10 | 显示全部楼层
呵呵,孩子,无线芯片自收自发是不能实现的,收发分别是两种模式,所以想测试成功必须有两个模块
回复

使用道具 举报

557

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165060
金钱
165060
注册时间
2010-12-1
在线时间
2103 小时
发表于 2015-11-15 23:44:32 | 显示全部楼层
回复【3楼】几罗星人:
<br>---------------------------------
<br>就是单做发送模式
<br>或者单做接收模式
<br>测试下
<br>
<br>这个测试需要2个开发板
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-11-13
在线时间
0 小时
 楼主| 发表于 2015-11-17 10:44:08 | 显示全部楼层
回复【6楼】Khan:
<br>---------------------------------
<br>我有两个NRF24L01模块,自发自收我指的是数据从一块STM32出去,送到发送端NRF,接收端NRF收到,送回同一块STM32。自发自收是对STM32而言的
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-11-13
在线时间
0 小时
 楼主| 发表于 2015-11-17 10:47:46 | 显示全部楼层
回复【7楼】正点原子:
<br>---------------------------------
<br>实在是没有两块开发板怎么办?总不能为了一个无线通信实验买两块开发板吧,你是赚了,我们亏大了。我有两个模块,就真的不能在一块开发板上做?按我在5楼说的:STM32——&gt;NRF发送&nbsp;-----&gt;&nbsp;NRF接收——&gt;同一块STM32
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-11-13
在线时间
0 小时
 楼主| 发表于 2015-11-17 10:50:32 | 显示全部楼层
回复【7楼】正点原子:
<br>---------------------------------
<br>不知道我这样做算不算是单独测试发送。发送端的自动应答我关掉了,然后进入发送模式,发送一个数据,STATUS寄存器的发送成功位置1了。这算不算是确保了发送是成功的呢?如果不算,为什么,NRF的STATUS寄存器的发送成功位置1了实际却没发送成功是什么情况?
回复

使用道具 举报

557

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165060
金钱
165060
注册时间
2010-12-1
在线时间
2103 小时
发表于 2015-11-17 22:37:02 | 显示全部楼层
回复【10楼】几罗星人:
<br>---------------------------------
<br>关闭自动应答了的话,任何情况都不能保证百分百发送成功.
<br>所以一般需要自己做协议,等待从机ACK,来确定发送OK
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2015-11-13
在线时间
0 小时
 楼主| 发表于 2015-11-18 19:05:42 | 显示全部楼层
回复【11楼】正点原子:
<br>---------------------------------
<br>哦,这样啊。之前打开的时候,就是发送失败。不过,如果关闭了自动应答就成功,开启了就失败,那能说明发送端工作正常,出问题的只是接收端吗?
回复

使用道具 举报

12

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
245
金钱
245
注册时间
2014-5-26
在线时间
42 小时
发表于 2015-11-19 22:35:46 | 显示全部楼层
建议买多一块小型的STM32开发板,核心板就可以,二三十块而已
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-7-2 17:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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