OpenEdv-开源电子网

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

关于c8t6使用24L01一发一收的速率问题

[复制链接]

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2021-10-17
在线时间
63 小时
发表于 2023-9-22 15:52:59 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 l666l 于 2023-9-22 15:52 编辑

之前遇到的接收端接收率很低的问题解决了,是有个比较占用cpu资源的函数运行打断了持续接收。现在的问题是发送端发送一个1字节的数据循环发送5000次,使用keildebug运行和逻辑分析仪分析,发送一次需要0.2526s,也就是发送速率只有20kb/s左右。

主函数

主函数

24L01Init

24L01Init

SPI_Init

SPI_Init

TX_Mode

TX_Mode
SPI2_SendB.png
Read_Reg.png
SPI2R_WB.png
Tx_PLOAD.png

最佳答案

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

就是说TX_PLOAD_WIDTH是8? 8*8*5000bit/0.2627s=约1.2Mbit/s,挺快的呀,加上前导、地址、CRC等大约占了一半,你这波特率就相当于2Mbit/s,没毛病。 不知你那20kb/s咋来的.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

3073

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7749
金钱
7749
注册时间
2020-5-11
在线时间
3220 小时
发表于 2023-9-22 15:53:00 | 显示全部楼层
本帖最后由 LcwSwust 于 2023-9-22 16:57 编辑
l666l 发表于 2023-9-22 16:28
1.j是一个全局变量的定义,是为了方便debug的时候看计数次数。
2.main函数确实没有写退出,因为这个工程 ...

就是说TX_PLOAD_WIDTH是8?
8*8*5000bit/0.2627s=约1.2Mbit/s,挺快的呀,加上前导、地址、CRC等大约占了一半,你这波特率就相当于2Mbit/s,没毛病。
不知你那20kb/s咋来的.
傲游截图20230922165147.jpg

专治疑难杂症
回复

使用道具 举报

10

主题

3073

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7749
金钱
7749
注册时间
2020-5-11
在线时间
3220 小时
发表于 2023-9-22 16:18:24 | 显示全部楼层
1.没看到对j的定义.
2.main函数不能退出,没看到后面有while(1).
3.建议用示波器测时间,在循环中翻转某个IO口便于测试。
4.不知你所说“一次”是指for循环一次还是循环全部执行完。
5.20kb/s是怎么算出来的?
专治疑难杂症
回复

使用道具 举报

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2021-10-17
在线时间
63 小时
 楼主| 发表于 2023-9-22 16:28:40 | 显示全部楼层
LcwSwust 发表于 2023-9-22 16:18
1.没看到对j的定义.
2.main函数不能退出,没看到后面有while(1).
3.建议用示波器测时间,在循环中翻转某 ...

1.j是一个全局变量的定义,是为了方便debug的时候看计数次数。
2.main函数确实没有写退出,因为这个工程就是用来测试速度的。
3.好的。
4.是指全部循环完成,也就是跳出while(j<5000)这个循环就到了断点处。
5.我在NRF.h宏定义处修改了每次发送的数据长度为8,每个数据也是u8类型的,8*8*5000bit->0.2627s
回复

使用道具 举报

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2021-10-17
在线时间
63 小时
 楼主| 发表于 2023-9-22 17:04:17 | 显示全部楼层
LcwSwust 发表于 2023-9-22 16:55
就是说TX_PLOAD_WIDTH是8?
8*8*5000bit/0.2627s=约1.2Mbit/s,挺快的呀,加上前导、地址、CRC等大约占 ...

算数都算错,我也是服了自己,谢谢大佬,一直困在自己的误区里了。
回复

使用道具 举报

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2021-10-17
在线时间
63 小时
 楼主| 发表于 2023-11-7 16:07:04 来自手机 | 显示全部楼层
LcwSwust 发表于 2023-9-22 16:18
1.没看到对j的定义.
2.main函数不能退出,没看到后面有while(1).
3.建议用示波器测时间,在循环中翻转某 ...

我现在碰到一个新的问题,请问可以加一个联系方式沟通一下吗?
回复

使用道具 举报

10

主题

3073

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7749
金钱
7749
注册时间
2020-5-11
在线时间
3220 小时
发表于 2023-11-7 16:09:28 | 显示全部楼层
l666l 发表于 2023-11-7 16:07
我现在碰到一个新的问题,请问可以加一个联系方式沟通一下吗?

说说看
专治疑难杂症
回复

使用道具 举报

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2021-10-17
在线时间
63 小时
 楼主| 发表于 2023-11-7 20:41:40 | 显示全部楼层

现在就是接收端要执行接收任务还要一个执行动作的任务,然后现在执行动作的任务好像占用太多时间,导致接收端的射频信号丢包率很高,我现在是已经把接收的函数放到了中断上去,还是会有这种现象,我现在的设想就是能不能上FreeRTOS来解决这个问题?
回复

使用道具 举报

10

主题

3073

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7749
金钱
7749
注册时间
2020-5-11
在线时间
3220 小时
发表于 2023-11-8 09:42:18 | 显示全部楼层
l666l 发表于 2023-11-7 20:41
现在就是接收端要执行接收任务还要一个执行动作的任务,然后现在执行动作的任务好像占用太多时间,导致接 ...

利用IRQ触发中断理应能解决丢包问题,不建议FreeRTOS。
上代码看看。
专治疑难杂症
回复

使用道具 举报

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2021-10-17
在线时间
63 小时
 楼主| 发表于 2023-11-8 10:27:24 | 显示全部楼层
LcwSwust 发表于 2023-11-8 09:42
利用IRQ触发中断理应能解决丢包问题,不建议FreeRTOS。
上代码看看。

工程发出来了

接收端.rar

5.58 MB, 下载次数: 1

回复

使用道具 举报

10

主题

3073

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7749
金钱
7749
注册时间
2020-5-11
在线时间
3220 小时
发表于 2023-11-8 10:48:47 | 显示全部楼层
本帖最后由 LcwSwust 于 2023-11-8 10:54 编辑

你这不是中断,是查询,查询间隔受其它事务(如printf)影响较大,可能来了两个数据包只查了一次,但读一包数据后FLUSH_RX造成其它已收到的包被清除。
建议:
1.FLUSH_RX不要使用。
2.若要查询,保证查询间隔不要超过3个数据包,缓冲区有多个包时要保证能读完(需查RX_EMPTY标志)。
3.若要用中断,IRQ脚触发单片机的引脚中断(EXTI,或其它中断),在中断里读取NRF数据,存入环形队列,主循环读取环形队列。


专治疑难杂症
回复

使用道具 举报

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2021-10-17
在线时间
63 小时
 楼主| 发表于 2023-11-8 11:26:08 | 显示全部楼层
LcwSwust 发表于 2023-11-8 10:48
你这不是中断,是查询,查询间隔受其它事务(如printf)影响较大,可能来了两个数据包只查了一次,但读一包 ...

也就是说在中断函数里只写这两条,
NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,0xff); //清除TX_DS或MAX_RT中断标志
NRF_RxPLOAD(RD_RX_PLOAD,tmp_buf,RX_PLOAD_WIDTH);//读取数据
其他的校验代码都放主函数。
那这个环形队列是什么意思呢?是这个tmp_buf的数组吗?
如果不用FLUSH_RX,我之前会发生数据堵塞的问题,也就是发三次不同的数据才会做出反应,我就是觉得fifo的缓存没清除导致的,所以加了FLUSH_RX。
回复

使用道具 举报

10

主题

3073

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7749
金钱
7749
注册时间
2020-5-11
在线时间
3220 小时
发表于 2023-11-8 11:45:07 | 显示全部楼层
l666l 发表于 2023-11-8 11:26
也就是说在中断函数里只写这两条,
NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,0xff); //清除TX_DS或MAX_ ...

环形队列很有用,强烈建议掌握。坛里、百度都有例子,也可看下我的无线图像传输程序里也有用到。
“之前会发生数据堵塞”,估计是这种情况:NRF收到了多个数据包,但只产生一个IRQ下降沿,你若只读一个包,
那其它的包就还在缓冲区中,缓冲区大小有限,多来几个包它存不下了,就会丢包,所以我说要“保证能读完(需查RX_EMPTY标志)”。
FLUSH_RX是一定不能用的。


专治疑难杂症
回复

使用道具 举报

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2021-10-17
在线时间
63 小时
 楼主| 发表于 2023-11-12 11:20:25 | 显示全部楼层
LcwSwust 发表于 2023-11-8 11:45
环形队列很有用,强烈建议掌握。坛里、百度都有例子,也可看下我的无线图像传输程序里也有用到。
“之前 ...

我加了环形队列,效果好了很多很多,但是现在出现个问题,就是环形队列的数据读取会错乱,我是每三个字节读一次,然后有些时候就会读出,第一个位置读到的数是数据包的第二个数据,我看了几次缓存数组,写入的顺序是没问题的,就是读的时候会错位,有什么解决办法吗?
回复

使用道具 举报

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2021-10-17
在线时间
63 小时
 楼主| 发表于 2023-11-12 11:23:14 | 显示全部楼层
l666l 发表于 2023-11-12 11:20
我加了环形队列,效果好了很多很多,但是现在出现个问题,就是环形队列的数据读取会错乱,我是每三个字节 ...

void RingBuf_Write(u8 data){//向缓冲区写入一个字节
        buffer.ringBuf[buffer.tailPosition] = data;//从尾部追加
//        printf("writeok\r\n");
        if(++buffer.tailPosition >= BUFFER_MAX)//尾节点偏移
                buffer.tailPosition = 0;//大于数组,最大长度归零,形成环形数组
        //如果尾部节点追到头部节点,则修改头节点偏移位置丢弃早期数据
        if(buffer.tailPosition == buffer.headPosition)
                if(++buffer.headPosition >= BUFFER_MAX)
                        buffer.headPosition=0;
}


unsigned char RingBuf_Read(u8* pData){//读取缓冲区一个字节的数据
        if(buffer.headPosition == buffer.tailPosition){//头尾相接表示缓冲区数据为空
                return 0;//读取失败返回0
        }
        else{
                *pData = buffer.ringBuf[buffer.headPosition];//如果缓冲区非空则取头结点值并偏移头结点
                if(++buffer.headPosition>=BUFFER_MAX)
                        buffer.headPosition = 0;
                return 1;//读取成功返回1
        }
}

回复

使用道具 举报

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2021-10-17
在线时间
63 小时
 楼主| 发表于 2023-11-12 11:50:12 | 显示全部楼层
l666l 发表于 2023-11-12 11:20
我加了环形队列,效果好了很多很多,但是现在出现个问题,就是环形队列的数据读取会错乱,我是每三个字节 ...

找到问题了,好像是读的速度追上了写的速度,导致读取失败,从而出现数据错乱。
回复

使用道具 举报

10

主题

3073

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7749
金钱
7749
注册时间
2020-5-11
在线时间
3220 小时
发表于 2023-11-12 13:56:13 | 显示全部楼层
l666l 发表于 2023-11-12 11:50
找到问题了,好像是读的速度追上了写的速度,导致读取失败,从而出现数据错乱。

读取前要判断队列是否为空,若为空就不读了。
专治疑难杂症
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-5-16 07:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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