【芯片驱动】2. CMT2300A配合硬件测试(灵敏度和发射功率)的软件实现

本文主要是介绍【芯片驱动】2. CMT2300A配合硬件测试(灵敏度和发射功率)的软件实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

        在开发一款无线射频产品的时候,软件是一部分,硬件也是一部分。而决定无线收发性能的,首先是硬件的匹配电路,然后才到软件部分的优化。
        一款无线射频产品,首先需要先决定是在那个频率范围内(当然是国家允许的范围内),然后硬件则需要在基于这个频点范围进行硬件的参数匹配,具体又分为发送功率匹配、天线匹配、和接收灵敏度的匹配。
        现在我们使用2300a这款无线芯片来说,除非自己的团队是射频专家,则可以自己进行无线外围电路的设计外,另外一种更加快捷的方式,就是寻找原厂技术支持,他们会给出相对较好的建议,特别是硬件设计之初,需要注意的点,绕开某个坑之类的,原厂工程师经验最为丰富。
        那么,在硬件出来之后,则需要软件配合进行一些硬件的测试。就像上面说的那三个测试一样,除开天线匹配测试(需要将产品放在实际的产品壳子内,使用网络分析仪进行匹配分析)的之外,我主要讲解如何编写测试发送功率的测试软件,以及如何编写测试接收灵敏度的测试程序。


1.发送功率匹配测试程序开发详解


 原理:

        无线射频数据发送,有一个我们俗称的发送功率,发射功率越大🈷越稳定,则说明发射的能量越大越稳定。当然,如果在发射电路上匹配一个增益放大电路的话,那么发射功率会比芯片实际设置的要大。发射功率的大小,和发射电路的匹配有关,其中还涉及到谐波、频偏等。我非硬件出身,只是略懂这些名词,具体还得请教硬件工程师。
硬件工程师则需要我们的软件配合他们测试,具体是想让我们的程序在上电后,在固定的频点一直不停的发射。软件这边的实现原理则是:使用CMOSTEK RFPDK V1.46软件生成一个指定频点的配置(如433.7MHz,具体下面会讲解),然后在程序初始化之后,直接进入TX模式,while 1死等,让无线芯片一直处于TX状态。我们需要关心射频芯片发出来的东西是什么,我们只需要关心射频芯片一直在发送数据,不停不间断的发送数据就可以来。
具体实现:
        A. 打开CMOSTEK RFPDK V1.46软件,选择2300a芯片,进行配置,这里我们使用433.7MHz,Modulation为OOK,速率为2.4Kbps,发射功率设置为芯片支持的最大功率值:20dBm,数据模式为packet包模式。具体配置如下图所示:

        需要注意的是,我们在选择速率的时候,需要查看一下频谱仪的精度,如果使用太高的速率,可能会频谱仪测试出来的数据会偏小。这是我踩过的坑,当时硬件工程已经改好匹配电路,设置了20dBm,没有增益电路,正常来说应该会出来19.2dBm左右,但是只是出来来16dBm左右,后面有经验的软件工程师修改为以上的配置,在硬件不改动的情况下,频谱仪测到的19dBm左右,才是正常。
        再说一句,在验证发射功率和接收灵敏度前,其实先应该测试spi与射频芯片是否通信上,必要的时候需要上示波器进行分析。或者根据我的前两篇相关博客进行调试,希望对你们有帮助。
        B. 完整配置表后,使用脚本将exp文件生成.h文件,在参考射频芯片的初始化demo程序进行数据初始化之后,将射频芯片切换到TX模式,然后可以写个死等的代码,此时,无线芯片就会一直处于发送状态,我们不需要关系它发什么数据。

2. 接收灵敏度测试程序开发详解


原理:
        无线射频的接收,对于射频芯片来说,就是对射频信号进行解调。射频信号经过接收电路,最终到达射频芯片,那么接收电路就需要进行对杂波的一些过滤啊,微弱数据进行放大之类的。我们不说直接使用两个模块进行收发测试的这种测试方式,因为这个不确定的因素太多。
       2300a有个数据直通模式(数据流模式),设置好频点,频偏,调制等方式后。发送方使用信号源发送0101数据,此时配置接收方(2300a)的gpio3为输出模式,将示波器接在gpio3上,示波器就可以抓到方波数据,此时肉眼就可以判断丢包是否严重,如果是规律的010101产生的方波就是连续的,如果接收差的话,看到的方波是丢数据的。

具体实现:
        A. 打开CMOSTEK RFPDK V1.46软件,选择2300a芯片,具体的配置需要根据项目具体使用那个频点,速率,频偏等参数进行配置。最重要的是将数据模式选择直通模式。如下图标红红色部分。

        B. 将exp配置文件使用脚本生成.h文件。软件部分的实现:根据官方提供的demo,对2300a无线芯片进行初始化后。需要说明的是,2300a的gpio3能在板子上引出来,方便示波器进行测试。比如说,正常我们的配置是:gpio1,gpio2默认让2300a控制天线开关,我们使用gpio3作为外部中断脚。这里因为是我们需要测试接收灵敏度,2300a收到数据后需要往外直接输出,所以我们需要将gpio3配置为输出,然后将2300a状态设置为Rx状态。至此,接收灵敏度的测试程序完成。这里我就不贴具体的代码实现了,有疑问的话欢迎交流,一起进步。


3.最后的话


        在无线产品确定后,还需要在真实的环境进行拉距离测试。官方文档上说的,直接距离以及极限的RSSI,都是在空旷环境下进行的测试,具体复杂的环境就不一样了。其实就我们接触的半年里,2300a芯片如果是同款芯片进行通信的话,理论值非常好。但是在真实的复杂环境中,抗干扰性还有待提升。我们之前是使用si4438 si4432,是比较稳定,抗干扰比较强。我们不评价好坏,只是说,选择放在适宜的产品上,将产品的效益最大化,功能满足,性能稳定是关注。
另外需要说的是(避坑):

  1. 2300a配套的demo调试版,虽然可以快速的进行数据的收发测试,但是千万不要100%相信它,目前我使用的版本,接收只能接收32个字节,之后的数据都为0;
  2. 2300a配套的demo调试版,发送也只能发送32个数据,后面的数据要么是乱码,要么是全0;
  3. 如果修改中断的产生方式,比如将下降沿产生中断改为上升沿产生中断,那么就要好好看文档,有些中断标志是需要根据极性进行取反!!!而0x68这个寄存器是不需要取反的!!!
  4. 文档中有个寄存器(0x6E)的说明和代码中的宏定义不一致,以代码中的宏定义为准;
  5. 如果在发送里有写while(1)去读寄存器标志,一定要加超时,因为2300a会出异常,整个芯片异常,此时超时后需要进行对它软件复位(2300a没有硬件复位);
  6. 接收数据的时候,要提前给2300a设置数据长度,否则会因为数据太短,很快就接收完成,而此时还没有读取中断标志而被意外清除,导致异常的情况。所以建议在接收或者发送完成后切换为接收状态时,顺便将数据长度设置长一点,比如我每次接收完后我就设置payload长度为100,这样中断标志出错的概率就少很多。

这篇关于【芯片驱动】2. CMT2300A配合硬件测试(灵敏度和发射功率)的软件实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/200192

相关文章

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

python 线程池顺序执行的方法实现

《python线程池顺序执行的方法实现》在Python中,线程池默认是并发执行任务的,但若需要实现任务的顺序执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录方案一:强制单线程(伪顺序执行)方案二:按提交顺序获取结果方案三:任务间依赖控制方案四:队列顺序消

Redis实现分布式锁全过程

《Redis实现分布式锁全过程》文章介绍Redis实现分布式锁的方法,包括使用SETNX和EXPIRE命令确保互斥性与防死锁,Redisson客户端提供的便捷接口,以及Redlock算法通过多节点共识... 目录Redis实现分布式锁1. 分布式锁的基本原理2. 使用 Redis 实现分布式锁2.1 获取锁

Linux实现查看某一端口是否开放

《Linux实现查看某一端口是否开放》文章介绍了三种检查端口6379是否开放的方法:通过lsof查看进程占用,用netstat区分TCP/UDP监听状态,以及用telnet测试远程连接可达性... 目录1、使用lsof 命令来查看端口是否开放2、使用netstat 命令来查看端口是否开放3、使用telnet