学习实践

毕设_1:CC1310 sub-1GHz的无线传感器网络节点设计

在假期中,每天上午都在图书馆,学习Coursera的IoT Communications相关课程,因为课上所学习的内容与毕设相关度高,而且资源丰富(特别是理论方面),课程安排合理,老师讲课深入浅出,整理很多的笔记,其中有很多不错的图表可以借鉴,基础概念的介绍,可以用于论文。https://www.coursera.org/learn/iot-communications/home

参考了IT相关原理图(有很多可以简化设计的地方),结合自己对于电路的理解,自主设计了基于CC1310模块的原理图与PCB图,进行了布局优化,改进了元器件参数,使其更加紧凑。

按照原理图的元件参数,在淘宝上选购了特定信号的芯片和元器件,使用中国供应商生产的相关芯片和元器件,对于IT公司的推荐的元器件进行了国产化替代。(基本为贴片)

之后自己核对布线,元器件布局规则,之后递交PCB文件给立创EDA厂家制作,从生产到收到PCB一般为两天,之后借助Hot Plate (热板)和Soldering Iron (焊铁),焊接了两块基于CC1310的射频PCB板,进行了相关防静电操作。

由于下图U3和U10的芯片非常小,引脚很小而且很接近,在焊接的时候出现了很多问题。焊接时,先焊接电源升压相关部分(3V-3.3V),之后使用电压表测试预留的test point,输入3V电源是否可以升压为3.3V,检测是否有焊接问题,之后就不断排查问题和试错。最终实现了相关要求。

由于买的是现成模块,内部有厂家烧入的原始固件,通过厂家提供的文件进行了两个模块之间通信测试,最终可以成功通信,由此可以确定元器件的焊接没有问题。

完成了硬件部分,接下来就是软件部分。

之前只使用过STM32F103和STM32F407系列的芯片,现在换为了TI的CC1310系类。虽然都是ARM Cortex-M架构,可以参考之前学习的内容。但是编译工具和之前有很大的不同,之前主要使用keil V5,STLINK仿真烧录器和串口工具,现在需要使用TI相关工具(CCS 20.0.2 Flash Programmer 2 SmartRF Studio 7 TI System Configuration Tool等)和参考文档。

我就制定和安排学习计划。先学习CC1310芯片内容部架构,特别学会了区分基于CC1310F128RSM芯片的自制模块和基于CC1310F128RGZ(官方CC1310 launchpad)的不同,本质为芯片封装的大小和GPIO数量的不同,因为TI提供example和demo是基于CC1310 launchpad中的CC1310F128RGZ芯片,但是CCS IDE中的芯片型号选择只可以选择到CC1310F128,具体的引脚数量(GPIO数量)没有明确区分。launchpad板载外设,比如LED和button等等在官方提供的初始化配置代码中都有明确的规定(GPIO和LED,Button有明确映射关系),如果使用自助模块的芯片,就会导致板载外设资源初始化配置出错,从而一直陷入在while(1)语句中。

如图中的函数(使用cJTAG 调试在Debug中发现的问题)。总的来说就是板载资源初始化GPIO分配的问题。

解决方法:1. 打开板级引脚配置文件(通常是 CC1310_LAUNCHXL.c)。2. 找到 BoardGpioInitTable 定义,进行相应的修改。

例程烧录部分遇到的问题:在厂家烧录的固件时,将芯片模块设置为锁定,导致了cJTAG 接口被禁用。因为蓝色模块(类似于最小系统板)是现成购买的(考虑了硬件和运费的成本问题和SMT手动焊接时间问题)。

我排查了一下内容:

JTAG/cJTAG 调试接口选择问题:分析了2-pin cJTAG(缩减版)和标准 4-pin JTAG。最终确定了是2-pin cJTAG

XDS110调试器配置问题(固件版本问题)

硬件电路问题,原理图烧录模块设计问题或者焊接问题

XDS110 USB Debug Probe的固件需要升级

芯片模块有锁定设置,导致了cJTAG 接口被禁用

在Flash Programmer 2中进行了forced mass erase(强制大量擦除)

具体深入了解了CC1310芯片手册,特别是PHY的IEEE 802.15.4g和wireless M-bus(专为能源计量的协议)运行的层级。对于一些特定专业性的问题,就主要参考了IEEE官网信息。

寻找了TI相关培训资源和YouTube各种教程资源

CC1310软件速成之:https://edu.21ic.com/m/video/1944.html

CC1310硬件射频从设计到成型:https://edu.21ic.com/m/video/1939.html

TI RTOS入门:https://www.ti.com.cn/zh-cn/video/series/getting-started-ti-rtos.html?utm_source=chatgpt.com

安装了TI的各种工具:smart RF 7、simplelink CC13X0 SDK、Sensor Controller Studio和CCS IDE。系统了解了各种工具的功能和如何使用工具链构建自己的项目。

收藏下载了各种TI的文档资源和相关示例代码,看书和资料,初步了解了射频天线工作原理,无线通信的的基本原理。

在Coursera中系统学习了IoT Communications,对于433 MHz频率和总距离 𝐷=75m,在第一 Fresnel 区域的半径为约 3.60 米。

第三周

参考TIDA-01477(支持低于 1GHz 技术和传感器到云网络的温湿度传感器节点参考设计),面向澳洲大型农场的无线传感器网络设计,自主扩展了纽扣电池、升压模块、433MHz的棒状天线和温湿度传感器芯片等等;裁剪了很多冗余的功能,使模块整体运行达到了精简高效的状态。自主设计出了功耗低,成本低、体积小、重量轻、可靠性高的模块,未来还可以将成品模块直接设计在绿色的PCB板上(目前是试验品)。

完成了”按键中断翻转电平点灯操作”整一套流程,了解并且熟悉了TI开发CC1310系类芯片的各种工具链,软件包、编译环境和TI各种英文设计手册和参考文档的查找整理学习。深入学习了TI相关的射频电路的硬件设计、天线相关参数设计和芯片引脚的配置,CC1310的TI-RTOS代码实现底层原理,寄存器操作,物理引脚映射,工程文件的各种的相互链接,编译器编译代码,再烧录进芯片的底层原理实现,芯片启动的汇编文件,设置堆栈和进入主程序的过程等等。

正式开始进行基于CC1310无线传感器网络项目软件开发。

系统复习了嵌入式(ARM架构的Cortex M4)相关知识:

复习了C语言重要知识:结构体,指针等等

熟悉了CCS编译环境和工具,特别是XDS110和CCS联动调试,更加熟悉了软件代码的调试思路(如何设置断点,如何步进等等),由于TI的CC1310芯片的示例代码很庞杂不仅在工程中使用了很多.c/.h文件,很多多余的宏定义,很多用不到的初始化函数,而且调用了很多TI drivers中的drivelib各种.h和.c文件(底层文件,存放寄存器结构体的操作,很多初始化判断语句),有很多用不到的外设配置(SD  外部flash等等),刚刚入门时,不熟悉C语言结构体指针等等语法,理解起来比较困难。特别是寄存器配置流程和开发相关功能(按键中断翻转电平点灯操作,串口配置和使能相关寄存器操作)。很关键的一点:它的示例代码是基于CC1310F128RGZ芯片的官方提供的launchpad开发板,我使用的是CC1310F128RSM芯片,不同封装和引脚配置,需要删除多余引脚号,而且芯片引脚外接的元器件的方式不同,比如说开关和LED的上拉下拉方式不同,需要修改相关寄存器的结构体指针。

在调试代码过程遇到了很多问题,但是我积极参考了TI网站和相关论坛对于CC1310系列的硬件和软件调试分析,结合和自己对于代码相关内容的熟悉度,快速调试排查了相关问题。

通过调试的暂停功能,可以确定程序陷入了哪一些函数的死循环中(初始化配置不通过的后果)。

再进一步通过设置断点和步进,可以具体排查出是那个判断语句的问题。

如图所示,函数卡在了PIN_remove函数中

PIN_remove函数,具体是没有通过第一个判断,直接到了PIN_NO_ACCESS。

看出了它是一个结构体函数,从而对它进行go to definition操作或者references操作可以看出它定义了一个extFlashPinState,这个就是外部flash,是不需要使用的功能,所以要将其注释掉,当将其使用到的部分注释之后,程序就可以运行了!

在TI示例代码的基础上,自主设计了一个类似于printf()函数的调试打印方式。

第四周

这周学习主题为TI RTOS,系统学习了RTOS的基础功能,和相对于裸机的优势。我本来想在CC1310中使用FreeRTOS的,但是CC1310目前不支持FreeRTOS,我只能参考FreeRTOS学习TI RTOS,在YouTube中找到了为数不多的优质相关度高的资源,而后学习了如何在CCS中构建测试环境(各种调试功能,比如Runtime Object view、RTOS Analyzer等等),学习了如何使用CCS在RTOS的工程中创建不同的任务,配置不同优先级,安排各个任务的运行时间片,使用CCS集成的sysconfig工具通过GUI自定义各种参数,配置相关代码。

学习记录:

空闲任务idle:进入低功耗,去内存碎片

串口发送,只可以每个任务只可以使用特定的一个串口,需要互斥量

任务调度是RTOS的核心

阻塞:是对于特定对象,比如等待需要的数据。

熟练使用了SmartRF工具配置无线通信的频段,信道,调制方式等等。

测量无线环境噪声(使用433MHz, 50 kbps,2-GFSK, 25 kHz deviation)

之后测试了两个模块之间的通信,(433MHz, 50 kbps,2-GFSK, 25 kHz deviation)距离为10cm。

思考了使用树莓派通过 UART 串口与 CC1310 通信,然后让 CC1310 通过 433MHz 无线广播 OTA 更新所有 CC1310 设备!(进阶项目)

全面学习物联网发展和主流通信协议方法,主要分为(依靠运营商的方案和偏远地区不依靠运营商的方案)。

详细了解了MQTT协议,CoAP等等和web协议的异同。

搜索了很多CC1310论文,顶刊中有很多方法值得借鉴学习。

学习coursesa的物联网课程

在YouTube上视频学习,通过代码直观体现了RTOS的具体流程,从零开始敲代码,手把手教学。

第五周

测试了一个基于TI RTOS和EasyLink功能,可以通过串口使用AT指令控制CC1310的通信频段,功率,速率等等。这个代码应该就是我之前刚刚到手的厂家烧录的基础源代码!我跑通了这个代码,并且测试了相关功能。它有丰富的预定义功能和扩展功能,完全可以自定义修改。

学习了解了CCS和XDS110的高级功能:Energytrace、RTOS analyzer等等。因为烧录软件不是官方的,所以有些功能无法使用。

Execution Analysis:分析每个task(thread)运行时间。

EasyLink AT Command Interface

论坛学习,参考相关问题。

通过I2C获取温湿度数据。一开始测试了那一块PCB板,通过各种测试和调试都无法解决湿度信息为0%的问题,之后换了另一块PCB板突然解决了这个问题。我就发现了是因为那个温湿度芯片HDC2010没有焊接好!因为它只有1mm*1mm,很难焊接!

在农田环境(阴雨天),实地测试了CC1310模块的通信性能

左图为发送端,右图为接收端(连接电脑,分析数据包)。

原始数据帧(没有经过数据处理)。只是简单测试了一下,进行可行性分析,之后可以测试更多的数据。

分析了各种模式下的功耗!

发送的温湿度数据包!结合ASCII表分析!

13:21:29.196 | 12 | aa 54 3a 31 35 2e 30 32 43 20 48 3a 33 36 2e 38 31 25 | -37


Field Analysis

FieldContentDescription
Timestamp13:21:29.196Time the data packet was received
Length12Length of the data packet (in bytes)
Payloadaa 54 3a 31 35 2e 30 32 43 20 48 3a 33 36 2e 38 31 25Actual data content
RSSI-37Signal strength, unit: dBm

Parsed Data: <T:15.02C H:36.81%>

实现了系统的基本功能:通过CC1310的I2C协议获取HDC2010的温湿度信息!通过无线(433MHz, 50 kbps, 2-GFSK, 25 kHz deviation)发送数据信息给另一个CC1310模块,通过串口发送数据给树莓派,再通过MQTT协议上传到我的服务器。

通过笔记本电脑的MQTT软件,查看是否可以通过MQTT Broker正常发布和订阅的主题

Topic: sensor/temperature_humidity QoS: 0

Author

wwq136@163.com
I am a junior majoring in Measurement and Control Technology and Instrumentation, with a passion for exploration and innovation. I have participated in various competitions, such as the Electronic Design Competition and Intelligent Vehicle Competition, and have contributed to national innovation projects, including the development of a fruit-picking robot. I possess strong embedded systems skills, working with platforms like STM32, Arduino, Raspberry Pi, and Jetson Nano, alongside proficiency in C/C++ and Python programming. My interests lie in the intersection of robotics and artificial intelligence, particularly in areas like computer vision (CV) and natural language processing (NLP), with a focus on machine learning. I am constantly learning AI-related technologies and exploring ways to integrate them into practical applications, aspiring to develop digital twins incorporating AI. I use Ubuntu 22.04 both on WSL2 for Windows and on my server. Currently, I am preparing for the IELTS, aiming for a 7.0 score, with a current score of 6.5. My future academic goal is to study at a top 50 QS university in Australia, such as UNSW Sydney, the country’s top-ranked university for engineering. Post-graduation, I plan to pursue entrepreneurship, focusing on local AI model deployment, particularly in healthcare. In addition to my technical pursuits, I am fascinated by Western culture, history, and philosophy, and I look forward to returning to Europe to further explore these areas.
Total post: 54

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注