毕设_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
| Field | Content | Description |
|---|---|---|
| Timestamp | 13:21:29.196 | Time the data packet was received |
| Length | 12 | Length of the data packet (in bytes) |
| Payload | aa 54 3a 31 35 2e 30 32 43 20 48 3a 33 36 2e 38 31 25 | Actual data content |
| RSSI | -37 | Signal 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

