0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

stm32+cc1101无线接收数据不稳定? 浅谈stm32+cc1101的低功耗

ss 作者:工程师谭军 2018-09-06 10:49 次阅读

本文主要是关于stm32+cc1101的相关介绍,并着重对stm32+cc1101的数据传输及其低功耗进行了详尽的阐述。

stm32+cc1101无线接收数据不稳定

发出侧向命令

检查TXFIFO中的字节数,

如果超过0,那么Flush TXFIFO

用数据填充TXFIFO

发出STX命令,就是这样。

现在,您可以调用MARCSTATE(重复地和快速地)查看内部状态机通过发送数据的不同步骤。

RX侧:

发出侧向命令

检查RXFIFO中的字节数,

如果超过0,那么Flush RXFIFO

发布SRX命令,就是这样。

现在,您可以调用MARCSTATE(重复地和快速地)查看内部状态机通过发送数据的不同步骤。

stm32+cc1101无线接收数据不稳定? 浅谈stm32+cc1101的低功耗

浅谈stm32+cc1101的低功耗

电路设计上,只用到了一个LED、串口1、一个模拟SPI、一个中断线、一个读卡芯片RESET线,硬件上就只剩下这么点东西了,这个时候我采用的是待机模式,使用的是读卡芯片的中断接PA0唤醒STM32,在此之前要先使得读卡芯片进入低功耗、然后STM32进入低功耗,这一步完成了,貌似没什么问题,功耗确实从几十mA骤降到3mA左右,开始还挺满意的,但是测试厂商提供的样板,功耗却只有几十uA,有点郁闷了。为什么会这样?反复查看硬件、程序,都找不出原因,而且这个时候的工作效果很烂,根本就不能唤醒,所以我就怀疑是读卡芯片一端低功耗有问题,因为我将PA0脚直接短接VCC,这样就可以产生一个边沿触发STM32唤醒了,但是用读卡芯片无法唤醒,所以我怀疑是读卡芯片的RESET脚电平不对,经检查,确实是因为RESET脚加了上拉电阻,读卡芯片是高电平复位,在STM32进入待机后,管脚全都浮空了,导致RESET被拉高,一直在复位;我去掉上拉电阻,觉得很有希望解决问题了,但是测试结果是:有时候能唤醒,有时候不能,我仔细一想难道是因为STM32待机后管脚电平不确定,导致读卡芯片RESET脚电平不定,而工作不正常,看样子只有换用其他方案了。后面确实验证了我的想法,使用STOP模式后,唤醒问题引刃而解。

就在关键时刻,芯片原厂火种送炭,送来急需的技术支持资料,一个包含低功耗源代码,赶紧拿过来测试,先研读下代码,使用的是STOP模式,而不是待机模式,使用的是任意外部中断唤醒,功耗低制40uA,这个时候就相当激动啊,赶快下载测试啊,结果功耗确实降了,但还是有1mA,更人家一比多了几十倍啊。。。

我第一反应是硬件不对,经过测试修改,首先找到第一个原因,读卡芯片RESET管脚上拉电阻又给焊上去了。。.,拆掉后功耗骤降到几百uA,还是不行。。 测试过程中,为了去掉LDO的干扰,整板采用3.3V供电,但是后面经过测试,LDO的功耗其实也只有5uA不到,这LDO功耗值得赞一个;虽然结果还是没达到预期,但是看到了希望,胜利就在眼前啊。

为此我反复看了技术支持提供的程序,发现他们的STM32的所有管脚都的设置都有所考究:(因为公司保密原则,代码中删除掉了关于该读卡芯片的前缀信息等)

GPIO_InitTypeDef GPIO_InitStructure;

/* GPIOA Periph clock enable */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

/* GPIOB Periph clock enable */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

/* GPIOC Periph clock enable */

//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

//####################################################

//USART1 Port Set

//TXD

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOA, &GPIO_InitStructure);

//RXD

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA, &GPIO_InitStructure);

//RST output pushpull mode

GPIO_InitStructure.GPIO_Pin = TRST;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(PORT1, &GPIO_InitStructure);

//IRQ input pull-up mode

GPIO_InitStructure.GPIO_Pin = TIRQ;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(PORT1, &GPIO_InitStructure);

//MISO input pull-up mode

GPIO_InitStructure.GPIO_Pin = MISO;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(PORT2, &GPIO_InitStructure);

//NSS,SCK,MOSI output pushpull mode

GPIO_InitStructure.GPIO_Pin = (NSS|SCK|MOSI);

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(PORT2, &GPIO_InitStructure);

//############################################################################

//TEST Port set

//TESTO input pushpull mode

GPIO_InitStructure.GPIO_Pin = TESTO;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(TEST_PORT, &GPIO_InitStructure);

//############################################################################

//TEST Port set

//TESTI output pushpull mode

GPIO_InitStructure.GPIO_Pin = TESTI;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(TEST_PORT, &GPIO_InitStructure);

//############################################################################

//LED Port Set

//LED output pushpull mode

GPIO_InitStructure.GPIO_Pin = LED;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(LED_PORT, &GPIO_InitStructure);

//############################################################

GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_8|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_15);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;

GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;

GPIO_Init(GPIOC, &GPIO_InitStructure);

首先,想MOSI、SCK、CS、LED、RST这些管脚应该设置为推挽输出,TXD设置为复用输出,而IRQ、RXD、MISO设置浮空输入,什么都没接的管脚全都设置为下拉输入,而TESTI、TESO我一直不解是什么东东,开始就没管,而开始的时候MISO我也没怎么注意,设置成上拉输入(而不是浮空输入),反正大部分按照厂家提供的参考,我并没有照搬,测试效果一样,但功耗确是还有80-90uA,期间我找了好久没找到原因,给技术支持一看,原来是因为MISO没有设置成浮空输入,我是设置成了上拉输入,上拉电阻一直在消耗大约40uA的电流。。。 好吧,这是自己不够细心导致的,以后做低功耗的项目管脚配置是个大问题,不能再这么马虎了!!! 我将MISO设置成浮空输入之后,最低功耗还是有40+,离10uA的最低功耗还有段距离,到底是为什么呢?最后我发现

,该读卡芯片有个TESTIN/TESTOUT管脚,是用来测试用的,出厂后也就用不上了,我也一直以为这两个脚确实没什么用,就没接;可是我发现厂家提供的样板居然接了这两个脚,但是厂商也没说这两个脚接或不接会影响功耗啊,抱着试一试的心态,我我把TESTIN/TESTOUT两个管脚接到单片机上进行相应的配置,接下来是见证奇迹的时刻了,功耗居然真的、真的降到10uA了。。。。。。。。。。。 此处省略n个字

这时候真的很激动,真的很想骂人啊,坑爹的厂家,为什么不给提示说这两个脚不接单片机会消耗电流呢?(也许是文档里面提到了,但是几百页的文档,还是全英文的,一堆堆的文字,我再看一遍,确实没有提到这两个管脚会有漏电流。)

项目就这样完工了,中间最重要的是技术支持的强力支持,不然项目不能完工了,这个项目低功耗STM32方面难度不高,主要是读卡芯片上面的低功耗调试起来问题很多,还是人家原厂的出马才解决了问题,因为众多原因,不能公布该芯片的资料,包括该芯片怎么进入低功耗也无法公开,所以抱歉~~。

关于STM32进入低功耗,我简单的总结了一下:

1.管脚设置,这个很关键,还是跟你电路有关系,外加上拉、下拉电阻切记不能随便加

2.STM32的systick clock、DMA、TIM什么的,能关就全都关掉,STM32低功耗很简单,关键是外围电路功耗是关键

3.选择一个低功耗的LDO,这个项目用到的LDO功耗就很不错,静态功耗10uA都不到。

4.确定STM32设置没问题,进入低功耗有好几种情况可以选择(睡眠、停机、待机),我还是推荐选择STOP模式,这个我觉的比较好是因为可以任意外部中断都可以唤醒,而且管脚可以保留之前的设置,进入停机模式的代码使用库函数自带的,就一句:

PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);

意思是,在进入停机模式之前,也关掉电压调节器,进一步降低功耗,使用WFI指令(任意中断唤醒),但是经过测试,使用WFE(任事件唤醒)指令效果、功耗一模一样。

最后一步是从STOP模式怎么恢复了,恢复其实也很简单,外部中断来了会进入中断函数,然后STM32就被唤醒,唤醒还要做一些工作,需要开启外部晶振(当然你也可以选择使用内部自带振荡器)、开启你需要的外设等等。

结语

关于stm32+cc1101的相关介绍就到这了,如有不足之处欢迎指正。

相关阅读推荐:基于STM32F103RB和CC1101的无线数传模块设计相关阅读推荐:基于STM32的可遥控智能跟随小车的设计与实现

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2270

    文章

    10895

    浏览量

    355734
  • CC1101
    +关注

    关注

    4

    文章

    36

    浏览量

    23140
收藏 人收藏

    评论

    相关推荐

    无线通讯模块 cc1101无线模块

    SPI 遥控模块 无线模块概述芯威科技VT-CC1101-433M基于TI Chipcon的CC1101无线收发芯片设计,是一款完整的、体积小巧的、
    发表于 08-07 17:37

    CC1101组网与假死问题

    ,什么原因?关于MSP430与CC1101低功耗问题为什么CC1101信道出现串扰现象?STM32+CC1101组网问题请教
    发表于 08-29 17:45

    浅谈无线射频CC1101芯片的特点与CC1100的区别

    用于极低功耗RF应用。其主要针对工业、科研和医疗(ISM)以及短距离无线通信设备(SRD)。CC1101可提供对数据包处理、数据缓冲、突发传
    发表于 11-17 10:57

    CC1101低功耗RF无线射频芯片

    CC1101[1] 是一款低于1GHz设计旨在用于极低功耗RF应用。其主要针对工业、科研和医疗(ISM)以及短距离无线通信设备(SRD)。CC1101可提供对
    发表于 11-18 11:20

    cc1101数据手册

    cc1101数据手册,此数据手册为ti最新版本。
    发表于 02-17 17:11 16次下载

    CC1101无线模块如何使用_cc1101无线模块的程序及使用介绍

    CC1101无线模块是采用TI公司的CC1101芯片制作的模块,一般是工作在433M。长沙云宝电子科技有限公司的生产的CC1101无线模块比
    发表于 04-12 15:29 1.8w次阅读

    CC1101 低功耗(低于 1GHz)射频收发器

    电子发烧友网为你提供TI(ti)CC1101相关产品参数、数据手册,更有CC1101的引脚图、接线图、封装手册、中文资料、英文资料,CC1101真值表,
    发表于 11-02 19:33
    <b class='flag-5'>CC1101</b> <b class='flag-5'>低功耗</b>(低于 1GHz)射频收发器

    无线芯片CC1100和CC1101的区别 浅谈CC1101芯片的特点

    CC1101 [1] 是一款低于1GHz设计旨在用于极低功耗RF应用。其主要针对工业、科研和医疗(ISM)以及短距离无线通信设备(SRD)。
    发表于 09-06 09:43 1w次阅读

    CC1101工作原理 基于与STM32CC1101接口移植

    CC1101 [1] 是一款低于1GHz设计旨在用于极低功耗RF应用。其主要针对工业、科研和医疗(ISM)以及短距离无线通信设备(SRD)。
    的头像 发表于 09-06 14:45 2.1w次阅读
    <b class='flag-5'>CC1101</b>工作原理 基于与<b class='flag-5'>STM32</b>的<b class='flag-5'>CC1101</b>接口移植

    浅谈CC1101驱动在STM32F103的移植

    最后,TI驱动里提供的是轮询的方式收发数据,对于初期来说,首先需要实现CC1101的工作,编译调试移植到STM32上的CC1101驱动代码,看见数据
    的头像 发表于 09-06 15:18 7814次阅读
    <b class='flag-5'>浅谈</b><b class='flag-5'>CC1101</b>驱动在<b class='flag-5'>STM32</b>F103的移植

    cc1101低功耗设计方案 CC1101收发驱动程序

    CC1101是一款低于1GHz设计旨在用于极低功耗RF应用。其主要针对工业、科研和医疗(ISM)以及短距离无线通信设备(SRD)。
    发表于 09-06 15:30 5261次阅读

    cc1101无线模块

    CC1101无线模块是采用TI公司的CC1101芯片制作的模块,一般是工作在433M。长沙云宝电子科技有限公司的生产的CC1101无线模块比
    的头像 发表于 03-09 12:42 2599次阅读
    <b class='flag-5'>cc1101</b><b class='flag-5'>无线</b>模块

    无线射频芯片CC1101的特点和区别

    本文主要是关于无线芯片CC1100和CC1101的相关介绍,并着重对无线芯片CC1100和CC1101
    发表于 03-09 12:44 1411次阅读

    无线射频芯片CC1101的特点和区别

    本文主要是关于无线芯片CC1100和CC1101的相关介绍,并着重对无线芯片CC1100和CC1101
    的头像 发表于 03-09 18:28 2302次阅读

    【芯选择】CC1101芯片的模块实例

    CC1101芯片CC1101是一款低于1GHz设计旨在用于极低功耗RF应用。其主要针对工业、科研和医疗(ISM)以及短距离无线通信设备(SRD)。C
    的头像 发表于 12-02 09:51 1378次阅读
    【芯选择】<b class='flag-5'>CC1101</b>芯片的模块实例