OpenEdv-开源电子网

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

关于SPI无线模块NRF24L01通讯问题

[复制链接]

3

主题

4

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2017-8-17
在线时间
6 小时
发表于 2018-9-7 22:32:53 | 显示全部楼层 |阅读模式
1金钱
关于SPI无线模块通讯问题
1.官方给的实例源码中直接在while循环里面接收数据,而且不是一个字节一个字节的接收,直接接收一个packet(其实最终还是一个字节一个字节接收)。NRF24L01_RxPacket(RX_Buf)==0
1.1怎么能保证这句接收包的代码执行时恰好有消息到达呢?
可能您会说,没有收到消息就跳过呗,下一个循环再收,(示例的意思好像就是这个)
1.2怎么保证这句接收代码执行时消息恰巧刚刚到达呢?
一个数据包32个字节,假如当发送方发了20个字节的时候,接收方的while循环才执行到NRF24L01_RxPacket,这20个字节怎么办?   丢掉还是在哪里等着呢?
1.3写着写着好像明白点什么;无线模块在检测到数据包到来时会触发(无线模块的)中断,然后自主的接收数据包,接收后存储在一个缓存区,然后等着stm32再来读取,如果在下一个数据包到来之前没有被读取,那么新包将覆盖旧包。这样理解对吗?
1.4 如果1.3我理解的没什么大问题,为了及时接收无线模块中的数据,我是否可以在无线模块中断的同时触发外部中断,然后在外部中断中把无线模块接收到的数据包搬运到stm32的变量存储?
1.5根据NRF24L01介绍得知,该模块每次最多传输32个字节,再多字节则需要多次传输,如果我每次包发送的数据长度不一样,接收端怎么办呢? 比如发送端每个包5个字节、32个字节……然后我是否应该每一次都读32个字节,当读到5字节包的时候会出现什么问题?,我该怎么判断当前读到的数据包是几字节包呢
请大佬指教,谢谢

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-9-8 01:38:45 | 显示全部楼层
你可以试试,实际测试。
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-9-8 08:53:17 | 显示全部楼层
1、
1.1 的确是的,没有接收到消息的时候NRF24L01_RxPacket(RX_Buf)返回1,条件不成立,跳过此步;然后又重新进入while循环体,再次进行相同的操作。可以参考源代码:

[mw_shl_code=c,true]u8 NRF24L01_RxPacket(u8 *rxbuf)
{
        u8 sta;                                                                              
        SPI1_SetSpeed(SPI_BaudRatePrescaler_8);
        sta=NRF24L01_Read_Reg(STATUS);  
        NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta);
        //如果接收工作已经完成
        if(sta&RX_OK)
        {
                NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);
                NRF24L01_Write_Reg(FLUSH_RX,0xff);
                return 0; //返回0
        }          
        return 1;//如果接收工作没有完成那么返回1
}        [/mw_shl_code]

1.2 程序从来就没有保证这一点。原因看下一条。
1.3 你的理解是正确的,不过注意这不是无线模块的中断,其内部有相关检测的电路是处于一直在工作的状态。可以参考NRF24L01的数据手册:
2018-09-08 08:35:25屏幕截图.png

2018-09-08 08:43:07屏幕截图.png

2018-09-08 08:43:36屏幕截图.png

2018-09-08 08:44:19屏幕截图.png

2018-09-08 08:46:01屏幕截图.png
根据FIFO的规则,理论上应该不会发生新包覆盖旧包的情况。但是实际是不是这样,我也没有进行过测试。
1.4 可以的,IRQ引脚的设计就是为了这个目的,详细配置请参考数据手册。
1.5 这个情况不能直接发,你没有传送足够的字节的时候,TX FIFO中只有后面若干字节是你要发送的数据,前面几个字节还都是上一次发送的数据,当启用发送后发送出去的32个字节将只有后面几个字节是你真正要发送的数据。
解决这个问题需要自己定义一个小协议。最基本的,最大每个数据包需要32字节,完全可以将其中的第一个字节用于表示整个32字节数据包中有效数据的长度,然后后面跟着的是有效载荷的字节,剩余的没有用到的字节就全填充0x00或者0xff(随意什么都行)。这样接收端在接收到一个数据包后,先判断第一个字节是否是合法的数据包有效载荷长度(1~31),如果是则读取指定个的字节后将其他内容丢弃,否则则说明数据包在生成或者是在传输过程中出现了错误(概率几乎不可能,NRF24L01本身有着非常好的校验机制),该数据包应当丢弃。

其实楼主的大部分问题都可以通过阅读数据手册解决:

nRF24L01_datasheet.pdf (452.02 KB, 下载次数: 39)
十六进制带我飞。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-7 22:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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