前言

前一阵子,因为项目需要设计低功耗无线传输方案,做物联网的传感器数据采集设备,在调试的时候,遇到很多坑,故记录并分享。单片机平台对比过STM8、MSP430、STC8051、STM32最后确定MSP430的功耗最低,切性能符合要求,因此选择MSP430单片机平台,无线方面因为之前我用过SI4432芯片做数据收发,而且这款芯片待机电流只有400nA,最低可降到10nA。所以最终确定使用MSP430+SI4432的方案作为设备端的方案。
在调试的过程中,确实遇到挺多问题的,如下逐一记录并分析,提供解决方案。

MSP430的VLO时钟精度问题

MSP430的内部时钟系统一般有DCO和VLO,DCO可以调节频率,可以配置成16MHz,使MSP430的CPU达到全速运行的状态,但是功耗相对较大;使用而VLO时钟的功耗较小,不到1uA。
官方手册的寄存器手册上说明VLO时钟范围是4KHz到20KHz,典型值12KHz,实际测试这个频率误差大,随时间变化也很大,如果用来给定时器提供时钟的话,会导致定时时间误差很大。本人实测,在室温28摄氏度时用手指给单片机加热,VLO频率会改变大致1KHz左右,为了解决这个问题,TI官方出了一个库,通过DCO时钟来计算VLO时钟的频率,从而矫正定时器的定时时间。
如下:Using the VLO Library
文档中提供库的下载地址,下载后把asm文件和.h文件加入工程中即可。按照例程在代码中调用。
我在项目中也有引入这个库,直接调用会引起如下问题:

  1. 会修改TIM_A的的工作状态,因为这个库会用到定时器A来计算VLO的频率,而使用后没有把TIM_A复原,因此会改变定时器A的状态。
  2. 会改变IO口的输出输入模式,原因同上。

解决方案有两个:

  1. 在调用VLO库之前保存相关寄存器的值,调用后把值重新赋给对应的寄存器。
  2. 在调用之后重新初始化相关的外设。

MSP430硬件SPI的时钟问题

问题发现

(注:我用的是MSP430的G系列,用的是USI接口)
MSP430本身是有带硬件SPI功能的,USI模块或者USCI都可以配置成SPI接口,但是网上很少人会用硬件SPI,我也咨询过几个之前做过MSP430的SPI 功能开发的朋友,他们都说不好用,然后就推荐我用软件SPI。但是考虑到功耗速度即功耗,如果能用硬件SPI的话,速度上会比软件SPI快很多,也能更低功耗一点(虽然只有一点点,但是秉着能省就省的原则,还是想把这点功耗抠下来)。因此想先调试下硬件SPI。
刚开始调试,我一般会采用先用低频率的时钟来调试,这样出问题的话也能用示波器看到波形,因此用的是默认的DCO时钟(1.1MHz)配合128分频作为SPI时钟,再把相关的寄存器配置一下,一顿操作后,短接MOSI和MISO引脚,数据收发都没问题,原以为可以完美收工了,可以当我用到SI4432上的时候。。。。。。
由于SI4432的SPI接口最大支持10MHz的时钟,因此MSP430的SMCLK设置为16MHz的DCO的时候,需要把时钟二分频才能给SPI使用,就在把原来的测试代码改成2分频,然后进行测试,读取SI4432的寄存器0x00,这里面放着器件码,如果没问题的话会读取到0x08。但是无论怎么调试就是读不到这个值,后来把DCO的频率调回默认的1.1MHz,分频系数仍然用2分频,用示波器查看波形,0x08这个数据的波形是有出来的,但是MSP430无论如何都读不到这个值。所以这里就有问题了。

调试分析

在官方出的LanchPad上调试相同的SPI代码,短接MISO和MOSI,发送数据为0xAA,无论如何都收不到正确的数据。后来又用示波器看波形,发现发送的0xAA数据波形不对!!!!如下图:

(上面是SPI时钟信号,下面是MOSI输出信号)
很明显,收发的数据是0xAA,中间红色方框这里应该要有一个低电平,这里却没有,而且数据延迟了一个时钟周期(对比下面正常的图片),说明是SPI数据发送有异常。如果接收正常的话,应该收到0x75(MSB字节序),而调试发现接收数据也不是这个值,因此SPI的数据收发都有异常。
回想之前调试的时候,我用的是128的分频值,因此这里把分频值再次改回128试试,又正常了(如下图),因此基本可以确定是时钟分频引起的问题。

经过调试,基本确定USI作为硬件SPI接口至少要使用4分频以上的分频系数才不会导致SPI传输出问题。

MSP430的Flash时钟问题

项目中,使用MSP430内置的Information Memory存储设备的配置数据,防止掉电丢失。
然而在实际使用时,发现会出现写出错的问题,例如:

  • 待写数据明明是0x0B,调试的时候而执行写操作之后,写到flash里的数据是0x1B或者是其他的
  • 明明是超0x1002地址写1个字节的数据,却连着0x1001和0x1003两个地址的数据全发生改变
    在调试时着实浪费了点时间。后来发现还是flash时钟的问题,flash时钟是SMCLK经2分频之后给Flash用的,如果把这个分频系数调高点,读写flash就不会有问题,例如调成4分频或者8分频,读写Flash就正常。
    因此,这应该还是MSP430的时钟Bug。
    因此实际使用时,还是建议跟SPI一样,使用4分频以上的分频系数

使用CR2032给SI4432供电问题

无线通信使用的是SI4432方案,在软硬件联调结束后,使用USB供电时设备工作基本稳定,但是一换到CR2032电池供电时,设备就表现得极不稳定,主要是在发送几次数据之后,接收端就再也收不到设备端的数据,这时如果重启设备又可以通信,因此判断是设备端的问题。但是之前使用USB供电时就很正常。
结合我个人之前调试SI4432的经验,判断极有可能是SI4432死机导致的。SI4432这款芯片如果供电电路没设计好,或者电源电压过低,极有可能会死机。
由于之前的逻辑是设备休眠时,SI4432进入待机模式(官方手册宣称待机模式只需要400nA的电流供维持寄存器的值,实际测试下来差不多跟手册相符)MSP430进入LPM3,保留VLO时钟。因此MSP430跟SI4432都是需要长时间待机的。如果SI4432死机,那么如果MSP430没有及时监测到就会导致设备表现为死机状态,需要重启才能使用。
基于以上分析,后来设计为SI4432不用时,拉高SDN引脚,使SI4432处于关闭状态(官方手册说关闭状态的供电电流只有10nA)。每次要用SI4432时,都重新初始化SI4432的寄存器,这样降低设备待机功耗,又提升设备稳定性。
经过上述操作后,实际测试待机供电电流约500nA,且不会因为SI4432的稳定性对设备整体稳定性造成影响。

其他低功耗应用建议

  • delay函数:使用延时函数前,一定要将DCO设置为最低的100KHz,或者直接关闭DCO时钟转二使用VLO时钟供CPU工作,因为延时时间时没有意义的等待,没必要用16MHz的时钟去做这种事,使用低频时钟可以降低功耗(蚊子再小也是肉,抠到极致了)。

MSP430+SI4432物联网设备调试踩坑记相关推荐

  1. android小程序_小程序踩坑记

    小程序踩坑记 希望这个文章能尽量记录下小程序的那些坑,避免开发者们浪费自己的生命来定位到底是自己代码导致的还是啥神秘的字节跳变原因. 前记 小程序大多数坑是同一套代码在不同平台上表现不一致导致的,微信 ...

  2. Spark踩坑记——数据库(Hbase+Mysql)转

    转自:http://www.cnblogs.com/xlturing/p/spark.html 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库 ...

  3. Vue + TypeScript + Element 搭建简洁时尚的博客网站及踩坑记

    前言 本文讲解如何在 Vue 项目中使用 TypeScript 来搭建并开发项目,并在此过程中踩过的坑 . TypeScript 具有类型系统,且是 JavaScript 的超集,TypeScript ...

  4. spug上线服务踩坑记

    spug是一款优秀的自动化运维平台,  这让我们想自动化又向前迈了一步. 在过程中遇到的问题,记录在这里供各位看官参考. 目录 一.远程执行命令问题 二.软连接的问题 三.jdk 版本问题 四.ssh ...

  5. 安装sql server踩坑记【sql2000程序安装配置服务器失败】

    安装sql server踩坑记 安装程序配置服务器失败.参考服务器错误日志和 C:\WINDOWS\sqlstp.log 了解更多信息. 在C:\Program Files\Microsoft SQL ...

  6. android 重新编译内核,[原创]华为内核重新编译踩坑记

    华为内核重新编译踩坑记 前几天有朋友找我帮他跟一个加密,由于js太乱了,想从app入手,于是打算用frida脱壳,结果发现报错 Failed to attach: remote_write PTRAC ...

  7. 口罩、安全帽识别比赛踩坑记(二) 比赛流程及 SSD / YOLO V3 两版本实现

    本篇文章主要对比赛流程中的各个环节进行展开说明,并对笔者践行过的代码及更改的地方进行记录.如哪里有侵权请联系笔者进行删除.另外在这里对比赛举办方表示感谢 ~ ~ 其中开源代码会在整理后放在github ...

  8. 移动端踩坑记---------ios下输入法遮挡input

    移动端踩坑记---ios下输入法遮挡input   最近项目中遇到了一个比较严重移动端IOS下的Fixed兼容问题,网上也有很多人躺在这个问题上了,现在开始详细讨论一下这个问题.   现在我们先来看一 ...

  9. python从入门到实践django看不懂_Python编程:从入门到实践踩坑记 Django

    <>踩坑记 Django Django Python 19.1.1.5 模板new_topic 做完书上的步骤后,对主题添加页面经行测试,但是浏览器显示 服务器异常. 个人采用的开发环境是 ...

  10. 东八区转为0时区_踩坑记 | Flink 天级别窗口中存在的时区问题

    ❝ 本系列每篇文章都是从一些实际的 case 出发,分析一些生产环境中经常会遇到的问题,抛砖引玉,以帮助小伙伴们解决一些实际问题.本文介绍 Flink 时间以及时区问题,分析了在天级别的窗口时会遇到的 ...

最新文章

  1. jQuery EasyUI动态添加控件或者ajax加载页面后不能自动渲染问题的解决方法
  2. 258. Add Digits
  3. Python数据结构与算法(第四天)
  4. 全国计算机等级考试题库二级C操作题100套(第58套)
  5. C++ Primer 第五版 第6章 6.7——函数指针阅读笔记
  6. JS中setInterval、setTimeout不能传递带参数的函数的解决方法
  7. java flash 压缩_Java和flash通信中数据的zlib压缩与解压缩
  8. ATA接口寄存器描写叙述
  9. STLink MID Keli Debug下载程序时候出现cannot access target shutting down debug session的解决
  10. 去空格 html,javascript怎么去空格?
  11. logit和logistic模型
  12. 【清单】边角知识清单
  13. 2020计算机科学第五轮评估,第五轮学科评估启动,这些非“双一流”建设高校可能获得A+学科...
  14. 从软件工程师到IT猎头:我的一点经历和感触 (转)
  15. 《Microsoft SQL Server入门教程》第03篇 示例数据库和示例表
  16. 云服务PaaS、SaaS、IaaS
  17. 带头结点的单链表删除操作 (10 分)
  18. Linux基础第一篇
  19. 报名|2020 PostgreSQL亚洲大会系列专场一:培训机构公益专场
  20. 我的警长 灵宝西所第一警务区 陈静

热门文章

  1. 企业权限管理系统之AdminLTE的基本介绍(一)
  2. 网易云再度升级!用Python爬取下载(一:思路)
  3. jtag接口_一份很好的JTAG完全解读资料
  4. 信号与系统:希尔伯特变换
  5. 一个完整的html代码是什么,html是什么?一个完整的html代码告诉你(完整实例版)...
  6. DnsJumper下载
  7. Cat 6 的网线确实不好做
  8. Keil MDK5使用
  9. Java开发必备软件安装大全(建议学生党初学Java开发收藏)
  10. 这就是为什么上帝和魔鬼都喜欢数学......