OpenEdv-开源电子网

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

有一个想法 不知道行不行 恳请大佬指点

[复制链接]

15

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2023-5-13
在线时间
28 小时
发表于 2024-8-23 11:31:21 | 显示全部楼层 |阅读模式
1金钱
我想做一个无线采集的设备,目前卡在了无线传输这边,正在探索使用NRF24L01发送。但如果说采集的数据量大,无法实时的发送,使用STM32能否实现边存储边发送的操作呢?我想的是用W25Q64芯片作为一个缓存区,同时存储和发送,这样可行吗?但缓存区也有可能会满,所以我就想问问大家有没有好想法?

最佳答案

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

建议自己造工具,比如买个USB转TTL模块(芯片CH340、CH341、FT232等,波特率可达到2M )(或自己画板子,用CH340N-SOP8,较简单); 再做个STM32F103驱动NRF24L01的板子,引出USART,就好了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

3280

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8182
金钱
8182
注册时间
2020-5-11
在线时间
3694 小时
发表于 2024-8-23 11:31:22 | 显示全部楼层
启林 发表于 2024-8-24 09:10
大佬 你好 我这边使用电脑接收数据,用了一个NRF24L01转串口的工具 发现NRF通过串口传入电脑的波特率最大 ...

建议自己造工具,比如买个USB转TTL模块(芯片CH340、CH341、FT232等,波特率可达到2M )(或自己画板子,用CH340N-SOP8,较简单);
再做个STM32F103驱动NRF24L01的板子,引出USART,就好了。


专治疑难杂症
回复

使用道具 举报

10

主题

3280

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8182
金钱
8182
注册时间
2020-5-11
在线时间
3694 小时
发表于 2024-8-23 11:48:50 | 显示全部楼层
一秒采集产生多少字节数据? 总共需要传输多少字节数据?
FLASH有擦写次数限制,倒是有SPI接口的RAM可以考虑一下.
专治疑难杂症
回复

使用道具 举报

15

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2023-5-13
在线时间
28 小时
 楼主| 发表于 2024-8-23 14:43:23 | 显示全部楼层
LcwSwust 发表于 2024-8-23 11:48
一秒采集产生多少字节数据? 总共需要传输多少字节数据?
FLASH有擦写次数限制,倒是有SPI接口的RAM可以考虑 ...

单通道一秒钟12000字节,有可能会有5个通道 也就是60000个字节左右
回复

使用道具 举报

10

主题

3280

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8182
金钱
8182
注册时间
2020-5-11
在线时间
3694 小时
发表于 2024-8-23 14:53:49 | 显示全部楼层
启林 发表于 2024-8-23 14:43
单通道一秒钟12000字节,有可能会有5个通道 也就是60000个字节左右

60000,才60K字节,不怕。NRF24L01最高2M的空中波特率,也就是差不多每秒可传输200K字节,能满足实时发送的需求。

专治疑难杂症
回复

使用道具 举报

15

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2023-5-13
在线时间
28 小时
 楼主| 发表于 2024-8-23 15:51:53 | 显示全部楼层
LcwSwust 发表于 2024-8-23 14:53
60000,才60K字节,不怕。NRF24L01最高2M的空中波特率,也就是差不多每秒可传输200K字节,能满足实时发送 ...

好 我试一下 谢谢您
回复

使用道具 举报

1

主题

192

帖子

0

精华

高级会员

Rank: 4

积分
596
金钱
596
注册时间
2014-4-14
在线时间
104 小时
发表于 2024-8-23 17:34:44 | 显示全部楼层
串行FLASH的写入速度很慢的,一页256个字节写入要0.4~3mS,加上操作FLASH的写命令之类的时间姑且算平均1.5mS吧,每2个字节要11.7uS,STM32AD采样速率起码1M,每1uS就有2个字节过来,你算算看FLASH的速度存得过来么?
回复

使用道具 举报

15

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2023-5-13
在线时间
28 小时
 楼主| 发表于 2024-8-24 09:10:34 | 显示全部楼层
LcwSwust 发表于 2024-8-23 14:53
60000,才60K字节,不怕。NRF24L01最高2M的空中波特率,也就是差不多每秒可传输200K字节,能满足实时发送 ...

大佬 你好 我这边使用电脑接收数据,用了一个NRF24L01转串口的工具 发现NRF通过串口传入电脑的波特率最大是115200 这个速率会限制数据的显示,请问这个往电脑里面传输数据,应该怎么改进好呢?
回复

使用道具 举报

15

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2023-5-13
在线时间
28 小时
 楼主| 发表于 2024-8-24 15:13:03 | 显示全部楼层
LcwSwust 发表于 2024-8-24 09:30
建议自己造工具,比如买个USB转TTL模块(芯片CH340、CH341、FT232等,波特率可达到2M )(或自己画板子, ...

好的 感谢大佬!
回复

使用道具 举报

15

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2023-5-13
在线时间
28 小时
 楼主| 发表于 2024-8-25 11:48:14 | 显示全部楼层
LcwSwust 发表于 2024-8-24 09:30
建议自己造工具,比如买个USB转TTL模块(芯片CH340、CH341、FT232等,波特率可达到2M )(或自己画板子, ...

大佬 您好 现在NRF024L01的程序已经调通了 我需要将自己采集的电压数据 通过这个模块发送,但是中间的数据类型 不知道怎么转换 能麻烦指点一下吗?
//ADC转换电压通DMA传输给内存SRAM
extern __IO uint16_t ADC_ConvertedValue[1];
//局部变量
float ADC_Value_Two[1];

int main(void)
{
        ALL_init();
       
        u8 data[2] = {1,125};
       
        while(1)
  {
                NRF24L01_Send(data);
                delay_ms(50);

        }
}
回复

使用道具 举报

10

主题

3280

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8182
金钱
8182
注册时间
2020-5-11
在线时间
3694 小时
发表于 2024-8-25 14:19:30 | 显示全部楼层
启林 发表于 2024-8-25 11:48
大佬 您好 现在NRF024L01的程序已经调通了 我需要将自己采集的电压数据 通过这个模块发送,但是中间的数 ...

1.位运算:
data[0]=ADC_ConvertedValue[0]>>8;//取高8位
data[1]=ADC_ConvertedValue[0];//取低8位
2.指针强制类型转换:
NRF24L01_Send((U8 *)ADC_ConvertedValue);//注意大端、小端

傲游截图20240825141853.png
专治疑难杂症
回复

使用道具 举报

15

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2023-5-13
在线时间
28 小时
 楼主| 发表于 2024-8-25 14:46:40 | 显示全部楼层
LcwSwust 发表于 2024-8-25 14:19
1.位运算:
data[0]=ADC_ConvertedValue[0]>>8;//取高8位
data[1]=ADC_ConvertedValue[0];//取低8位

非常感谢您 我试一下 很感谢
回复

使用道具 举报

15

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2023-5-13
在线时间
28 小时
 楼主| 发表于 2024-8-27 10:06:16 | 显示全部楼层
LcwSwust 发表于 2024-8-25 14:19
1.位运算:
data[0]=ADC_ConvertedValue[0]>>8;//取高8位
data[1]=ADC_ConvertedValue[0];//取低8位

大佬 你好 现在我把发送和接收的数据已经调试通了,传输的数据宽度为32字节,但还是遇到了传输速率的问题,我发送端设置的是1秒发送1000次采集的数据,但是实测了一下 发现接收的数据是在80-90个之间,请问这是什么原因 该怎么提高呢?
  1. //发送代码
  2. int main(void)
  3. {
  4.         ALL_init();
  5.        
  6.         u8 TxBuffer[2];
  7.        
  8.         while(1)
  9.   {
  10.                 if(flagTime) //设置采集1s
  11.                 {
  12.                         if(flag)   //定义采样率
  13.                         {
  14.                                  flag=0;
  15.                                  TxBuffer[0] = ADC_ConvertedValue[0]&0xFF;           //取低8位
  16.                                  TxBuffer[1] = (ADC_ConvertedValue[0] >> 8) & 0xFF;  // 取高8位               
  17.                                
  18.                                  NRF24L01_Send(TxBuffer);
  19.                          }               
  20.                 }
  21.         }
  22. }
复制代码
  1. //接收代码
  2. int main(void)
  3. {
  4.         ALL_init();
  5.        
  6.         u8 RxBuffer[2];
  7.   u16 receivedValue;  // 用于存储组合后的16位数据
  8.         //OLED_ShowString(1, 4, "Acc Test!");       
  9.         while(1)
  10.   {
  11.                 if(NRF24L01_Receive(RxBuffer) ==0)
  12.                 {                                               
  13.                         receivedValue = (u16)((RxBuffer[1] << 8) | RxBuffer[0]);                                               
  14.                         printf("%d\r\n",receivedValue);
  15.     }                   
  16.         }
  17. }
复制代码
  1. //发送模式配置函数
  2. void NRF24L01_TX_Mode(void)
  3. {                                                                                                                 
  4.           NRF_W_CE(0);                                                            //进入待机模式 可以改变模块属性

  5.           NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,5);      //配置TX地址
  6.           NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,5);   //配置RX地址:目的为了使能自动应答       
  7.           NRF_W_Reg(NRF_WRITE_REG+EN_AA,0x01);                              //开启自动应答   
  8.           NRF_W_Reg(NRF_WRITE_REG+EN_RXADDR,0x01);                                 //使能通道0接收地址 EN_RXADDR寄存器 0x01表示仅启用通道0
  9.           NRF_W_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);                         //设置自动重发间隔 586us
  10.           NRF_W_Reg(NRF_WRITE_REG+RF_CH,0);                                 //设置通信频率2.4G RF_CH 2.4GHz
  11.           NRF_W_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);                           //设置TX发射参数:0dBm增益,2Mbps 低噪声增益开启
  12.           NRF_W_Reg(NRF_WRITE_REG+CONFIG,0x0e);                             //设置工作模式:0x0e为发射模式
  13.        
  14.                 NRF_W_CE(1);                                                      //启动发送
  15. }

  16. //接收模式配置函数
  17. void NRF24L01_RX_Mode(void)
  18. {
  19.                 NRF_W_CE(0);
  20.        
  21.           NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,5);
  22.           NRF_W_Reg(NRF_WRITE_REG+EN_AA,0x01);
  23.                 NRF_W_Reg(NRF_WRITE_REG+EN_RXADDR,0x01);         
  24.                 NRF_W_Reg(NRF_WRITE_REG+RF_CH,0);
  25.                 NRF_W_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);
  26.           NRF_W_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);       
  27.           NRF_W_Reg(NRF_WRITE_REG+CONFIG, 0x0f);               
  28.        
  29.           NRF_W_CE(1);
  30. }
复制代码

回复

使用道具 举报

10

主题

3280

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8182
金钱
8182
注册时间
2020-5-11
在线时间
3694 小时
发表于 2024-8-27 10:16:34 | 显示全部楼层
启林 发表于 2024-8-27 10:06
大佬 你好 现在我把发送和接收的数据已经调试通了,传输的数据宽度为32字节,但还是遇到了传输速率的问题 ...

"32字节"在哪体现的?
NRF24L01_Send、NRF24L01_Receive怎么实现的?
专治疑难杂症
回复

使用道具 举报

15

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2023-5-13
在线时间
28 小时
 楼主| 发表于 2024-8-27 10:21:23 | 显示全部楼层
LcwSwust 发表于 2024-8-27 10:16
"32字节"在哪体现的?
NRF24L01_Send、NRF24L01_Receive怎么实现的?

感谢大佬的解答 这是发送和接收的代码
  1. // 启动NRF24L01发送数据
  2. u8 NRF24L01_Send(u8 *txbuf)
  3. {
  4.         u8 sta;
  5.        
  6.         NRF_W_CE(0);
  7.         NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);     //写数据到发送缓存区 32个字节
  8.         NRF_W_CE(1);                                  //启动发送          
  9.        
  10.         sta=NRF_R_Reg(STATUS);                        //读取状态寄存器的值          
  11.        
  12.         NRF_W_Reg(NRF_WRITE_REG+STATUS,sta);          //清除中断标志
  13.        
  14.         if(sta&MAX_TX)                                //达到最大重发次数
  15.         {
  16.                 NRF_W_Reg(FLUSH_TX,0xff);                   //清除TX FIFO寄存器
  17.                 return MAX_TX;
  18.         }
  19.         if(sta&TX_OK)                                 //发送完成
  20.         {
  21.                 return TX_OK;
  22.         }
  23.         return 0;                                     //发送失败
  24. }

  25. // 启动NRF24L01接收数据
  26. u8 NRF24L01_Receive(u8 *rxbuf)
  27. {
  28.         u8 sta;                                                                              
  29.          
  30.         sta=NRF_R_Reg(STATUS);                        //读取状态寄存器            
  31.         NRF_W_Reg(NRF_WRITE_REG+STATUS,sta);          //清除中断标志
  32.         if(sta&RX_OK)                                 //接收到数据
  33.         {
  34.                 NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//读取数据
  35.                 NRF_W_Reg(FLUSH_RX,0xff);                 //清除RX FIFO寄存器
  36.                 return 0;
  37.         }          
  38.         return 1;
  39. }
复制代码


回复

使用道具 举报

10

主题

3280

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8182
金钱
8182
注册时间
2020-5-11
在线时间
3694 小时
发表于 2024-8-27 10:52:34 | 显示全部楼层
本帖最后由 LcwSwust 于 2024-8-27 10:55 编辑
启林 发表于 2024-8-27 10:21
感谢大佬的解答 这是发送和接收的代码

发送和接收函数传递的buffer只有2字节,但函数内部用这个指针访问了32字节,这是BUG,可能引起死机或其它变量被修改。
另,不要开启自动重发、自动应答,否则频繁切换收发模式占用过多时间;
发送不必等待发送完成,改为TXFIFO未满就可以往里写数据,CE一直置高,可连续发送多个32字节的包;
接收不要清RXFIFO,只要RXFIFO有数据就可以读出来,以免连续收到多个包时被清除。

详细代码可看看我做的无线图像传输。
专治疑难杂症
回复

使用道具 举报

15

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2023-5-13
在线时间
28 小时
 楼主| 发表于 2024-8-27 11:03:19 | 显示全部楼层
LcwSwust 发表于 2024-8-27 10:52
发送和接收函数传递的buffer只有2字节,但函数内部用这个指针访问了32字节,这是BUG,可能引起死机或其它 ...

您好 请问您的代码 我该从哪里获得呢?我想拜读一下
回复

使用道具 举报

10

主题

3280

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8182
金钱
8182
注册时间
2020-5-11
在线时间
3694 小时
发表于 2024-8-27 11:09:31 | 显示全部楼层
启林 发表于 2024-8-27 11:03
您好 请问您的代码 我该从哪里获得呢?我想拜读一下

点我头像下方“主题”上方的数字,
或点击头像后在弹出的网页里点“主题”。
论坛的搜索功能也可以搜到。
论坛的功能还是要多多摸索一下啊喂。
专治疑难杂症
回复

使用道具 举报

15

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2023-5-13
在线时间
28 小时
 楼主| 发表于 2024-8-27 14:56:10 | 显示全部楼层
LcwSwust 发表于 2024-8-27 11:09
点我头像下方“主题”上方的数字,
或点击头像后在弹出的网页里点“主题”。
论坛的搜索功能也可以搜到 ...

收到 谢谢大佬 已经下载了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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