社区导航

 

搜索
查看: 1764|回复: 27

[蓝牙BLE] STEVAL-IDB007V1不处理DIO0~DIO3时电流不稳定的问题原因

  [复制链接]

6247

TA的帖子

10

TA的资源

版主

Rank: 6Rank: 6

发表于 2018-3-16 10:26 | 显示全部楼层 |阅读模式
在挑战赛的开发过程中遇到一个问题
如果BlueNRG-1进入休眠模式时不对外部IO做处理的话电流会高低变化很不稳定
高的时候能过到几毫安,低的时候9uA左右
正常情况下BlueNRG-1休眠后加上传感器的待机电流总电流应该在10uA以下为正常
以前遇到过类似问题是其它单片机由于单片机未使用的I/O没有做处理产生
这次开始怀疑也是单片机I/O的问题,后来经过分析发现问题出现在LSM6DS3而不是BlueNRG-1
测试的过程是非常痛苦的断断续续我花了很多天才算找到原因
为了找到STEVAL-IDB007V1这块板子的这个问题我甚至都好几次怀疑自己是不是年纪大了,不适合再干这行了
不过还好,不管走了多少弯路花了多少时间,最后这部分问题总算找到了
测试的过程中在STEVAL-IDB007V1上留下很多“硬伤”
包括割线和打孔(因为4层板有的走线在内层,需要打孔将走线割断)
image001.jpg
image002.jpg
下边是我在查找原因时做的记录
断断续续花了很多天时间,当时大脑一片混乱,整理后一些地方还是很乱

开始我使用下边的拓扑来测量开发板的电流
image003.jpg
在LSM6DS3、LPS25HB处于掉电状态,BlueNRG-1处于休眠模式时
高的时候能过到几毫安,低的时候9uA左右
image004.png
分析后确定需要将DIO0~DIO3这4个引脚都做处理(找到问题后把板子割断的线都恢复后又发现DIO1不需要处理,DIO1不处理时为高电平),上拉或者下拉才能使电流稳定下来
下面是其它I/O悬空,指定I/O接地时的电流变化
image005.png
image006.png
image007.png
在原理图里看到DIO0~DIO3主要和LSM6DS3连接,对应为SPI的CS,SCLK,SDI,SDO
除了DIO0~DIO3可以看到BlueNRG-1的DIO12也是和LSM6DS3直连的,如果问题出在LSM6DS3为什么DIO12就不需要处理呢?
image008.png
通过分析Gerbre文件找到传感器的供电路线
image009.png
通过切断PCB上的走线断开传感器的供电与VBLUE的连接
image010.jpg
image011.jpg
测量VBLUE网络的电流还是有变化,最高为600uA左右,最低还是9uA
image012.png
和下边这个没断传感器电源的变化比起来已经好一些了
image013.jpg
LPS25HB和LSM6DS3在PowerDown模式下的电流加起来应该有6.5uA左右,切断传感器的供电后空闲电流还是9uA左右,为什么电流没有降下来呢?
测量传感器电源(已经断开的传感器分部的网络我们给它取名叫VBLUE_SENSOR),会有2.5V左右的电压(这个数值是在不断变化的),这个供电又是哪来的?
image014.png
测量DIO12为0V,测量DIO4、DIO5(LPS25HB的SCL和SDA)等于VBLUE_SENSOR电压
测量DIO0、DIO2、DIO3为0V,测量DIO1等于VBLUE_SENSOR电压
再检查看到断开的VBLUE_SNEOSR还和U10连接
image015.png
原理图中SPI还同时和STG3692通过0欧电阻连接
分析了一下应该不是这个原因,因为断开VBLUE_SENSOR电源时会有的2.5V电压
主要怀疑对象是DIO1和DIO4、DIO5,这里没有能给这3个I/O提供供电的地方
后来查看实物图,对应的电阻并没有焊接
可以肯定问题和STG3692无关
image016.jpg
再看原理图找到一个可疑对象PUSH2,I2C2_DATA通过一个上拉电阻和这边的VBLUE连接,测量了一下R54两端的电压,一端为3.3V一端为2.xV
因为官方提供的原理图不能通过网络标号检索,我一搬通过BlueNRG-1, BlueNRG-2 development kits en.DM00298232.pdf文档检索网络标号
遗憾的是手册里的Figure 29: STEVAL-IDB007V1 buttons and LEDs是以图片的形式提供的,无法通过网络标号检索到,所以它经常会被遗漏掉
image017.png
下一步断开R54和VBLUE的连接,再测量电压,断开后R54两端都是2.xV了,电不是通过R54来的?
image018.png
按住开发板上的复位键再测量DIO1、DIO4、DIO5和VBLUE_SENSOR电压都变成0V,松开上电后又会恢复到2.xV
打开示波器测量DIO4和DIO5的电压,只看到电压正好随电流的增加而降低,还是找不出原因
image019.jpg
image020.jpg
直接给VBLUE1供电,同时将RESETN拉到VDD,电流600 uA
image021.jpg
将VBLUE_SENSOR与GND连接,空闲电流为47uA左右
image022.jpg
DIO05、DIO04分别与GND短接时电流为126.7uA,同时将DIO5和DIO4连接到GND时的电流为75uA
image023.jpg
DIO1与GND短接后的电流为249uA
image024.jpg
VBLUE_SENSOR连接GND、VBLUE和空闲时的电流情况
image025.png
VBLUE_SENSOR接GND上电流42uA左右,唤醒再休眠后电流无变化
如果传感器的电流基本都通过VBLUE_SENSOR网络获取,VBLUE_SENSOR接地时的电流为42uA,断开VBLUE_SENSOR时传感器能从VBLUE_SENSOR网络获得的电流也不会超过42uA才对
image026.jpg
GPIO1接GND,电流248uA左右,唤醒再休眠电流会升高
image027.jpg
将GPIO1接GND时电流为248uA,不断开GPIO1与GND的连接,同时再将BLUE_SENSOR与GND连接,这时电流会降到42uA
将GPIO1接GND时VBLUE_SENSOR的电压为1.5V,再将DIO4或DIO5接GND,VBLUE_SENSOR的电压为0.5V
最后用万用表测量DIO11时不小心将它和U10的pin5短路,发现电流一下跳到600uA
image028.png
DIO11和U10的pin5短路时的电流情况
image029.jpg
再测试发现如果将U10的pin4(BlueNRG-1的DIO11)与GND连接电流为42uA,将pin5与GND连接电流无变化为9uA,同时将pin4和pin5连接到GND电流为42uA
但只要断开与GND的连接只让pin4与pin5短接电流就会达到600uA
如果把VBLUE_SENSOR与GND连接,电流为42uA,再短接U10的pin4和pin5电流无变化
使用万用表测量VBLUE_SENSOR到GND的电流为43uA,VBLUE整体电流消耗为45.75uA,测量U10的pin4到GND的电流为48uA,VBLUE整体电流消耗为43.95
用万用表测试U10的pin4电压高于VBLUE_SENSOR电压
VBLUE_SENSOR与GND短接在VBLUE_SENSOR
image030.jpg
image031.jpg
后来在BlueNRG-1的数据手册里找到DIO11的说明
image032.jpg
image033.jpg
DIO11在休眠状态下为上接模式
image034.jpg
image035.jpg
上拉电阻为81KhOM对应40uA
查看ST2378E的数据手册看到它的每一个I/O都通过上拉9K上拉电阻接在VL上
image036.jpg
这解释了VBLUE_SENSOR的电压是怎么来的
电流通过81K的上拉电阻从BlueNRG-1的VDD流向DIO11,再通过ST2378E的9K上拉电阻流向VBLUE_SENSOR
image037.jpg
IO11的上拉电阻虽然可以通过代码禁止
不过在进入低功耗模式后又会恢复上拉功能
  /** Init Structure */
  GPIO_StructInit(&GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Input;
  GPIO_InitStructure.GPIO_Pull = DISABLE;
  GPIO_InitStructure.GPIO_HighPwr = DISABLE;
  GPIO_Init(&GPIO_InitStructure);
断开U10的VDD后电流降到正常状态,平均电流为752nA,这才应该是不接传感器时BlueNRG-1应该有的休眠电流
image038.jpg
image039.jpg
image040.jpg
同时测量VBLUE和VBLUE_SENSOR的电流能看到电流主要都消耗VBLUE_SENSOR电源网络上了
image041.png
image042.jpg -
VBLUE_SENSOR的电源网络上有2颗传感器,分别是LSM6DS3和LPS25HB,从对引脚的配置情况来看电流应该是LSM6DS3消耗的,因为LPS25HB只连接了I2C引脚
为了验证这种判断需要把LSM6DS3和LPS25HB的电源断开,从GERBER文件可以看到LSM6DS3和LPS25HB的电源是通过中间的GND(绿色)和PWR(青色)层连接的
如果想断开连接就需要在指定位置打孔来破坏内层连接
image043.jpg
下边是打孔后的PCB板
image044.jpg
去掉LSM6DS3后VBLUE和VBLUE_SENSOR的电流情况,可以看到2个电源网络的电流都降下来了
image045.jpg
到这里STEVAL-IDB007V1在BlueNRG-1休眠时的电流不稳定的问题算是找到了,问题出在LSM6DS3那里
具体LSM6DS3为什么会出现这个问题,因为LSM6DS3在STEVAL-IDB007V1上的的pin2和pin3直接与地连接无法断开
我准备在网上买了一块LSM6DS3的开发板用来测试,希望能找到原因
另外还一个问题是VBLUE_SENSOR在通过DIO11供电时能够从DIO11那里获得的最大电流为40uA左右,可是为什么从VBLUE那里造成的电流消耗却能达到600uA呢?


来源:EEWorld ST传感器与低功耗无线技术论坛板块,转载请附上链接
虾扯蛋


回复

使用道具 举报

604

TA的帖子

103

TA的资源

纯净的硅(中级)

Rank: 5Rank: 5

发表于 2018-3-16 12:12 | 显示全部楼层
本帖最后由 gs001588 于 2018-3-16 12:14 编辑

littleshrimp版主研究得太细了,寻根究底。
我当时只想着SPI_CS必须接高,担心片选有效的话,传感器的SPI输出线上会上数据。其它的就没多想了,SPI_CLK、SPI_IN、SPI_OUT全接低了。也许SPI_IN都不需要处理。
IO12的内部上拉到是注意到了,但是都没看LSM6DS3的INT1是什么电平有效,有没有开启,想着只要传感器关闭后,不产生中断就不会对这个管脚有影响。现在想想实属不应该,得向版主学习。


回复

使用道具 举报

5

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-3-16 15:19 | 显示全部楼层
楼主厉害,那个显示波形的软件是什么软件?看起来效果不错

点评

Simplicity Studio,配合silabs的单片机开发板可以实现电流测量 主控是使用STM32F103单片机实现的,有兴趣也可以自己DIY一个  详情 回复 发表于 2018-3-19 12:52


回复

使用道具 举报

6247

TA的帖子

10

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2018-3-19 12:52 | 显示全部楼层
suwei337008 发表于 2018-3-16 15:19
楼主厉害,那个显示波形的软件是什么软件?看起来效果不错

Simplicity Studio,配合silabs的单片机开发板可以实现电流测量
主控是使用STM32F103单片机实现的,有兴趣也可以自己DIY一个
虾扯蛋


回复

使用道具 举报

29

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-8-12 11:55 | 显示全部楼层

楼主威武,有个问题请教一下,有没有深入研究过唤醒后引脚配置问题。

我设备用IO1 IO2 1O3 来控制一个共阳极的三色灯,1秒广播一次 。

我看资料显示广播也能唤醒单片机 

实测 没次唤醒后灯都会微弱闪一下 ,用示波器也看到了瞬间的低电平,程序睡眠后和醒来没有其他事件的话我是不会操作IO口的。

这种现象我感觉是唤醒后单片机接管IO 引起的。

我后来换了共阴极LED 灯的闪烁现象没了。

但是不知道具体原因

点评

是三个引脚都有瞬时低电平还是个别引脚有?  详情 回复 发表于 2019-8-12 12:39


回复

使用道具 举报

6247

TA的帖子

10

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2019-8-12 12:39 来自手机 | 显示全部楼层
baixiukai 发表于 2019-8-12 11:55
楼主威武,有个问题请教一下,有没有深入研究过唤醒后引脚配置问题。

我设备用IO1 IO2 1O3 来控制一个共 ...

是三个引脚都有瞬时低电平还是个别引脚有?

点评

是这个几个睡眠后配置成高电平的都有这个现象  详情 回复 发表于 2019-8-12 14:12
现在测试看,是这样的,IO0-IO10, 我睡眠后若果配置成高电平,唤醒后就会有瞬间拉低的过程。   我放了个图片  这是这几个引脚的情况  1秒广播一次 ,就会发现引脚1秒瞬间拉低一下恢复高  详情 回复 发表于 2019-8-12 14:06


回复

使用道具 举报

29

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-8-12 14:06 | 显示全部楼层
littleshrimp 发表于 2019-8-12 12:39 是三个引脚都有瞬时低电平还是个别引脚有?

现在测试看,是这样的,IO0-IO10,

我睡眠后若果配置成高电平,唤醒后就会有瞬间拉低的过程。

 

我放了个图片  这是这几个引脚的情况 

1秒广播一次 ,就会发现引脚1秒瞬间拉低一下恢复高电平。

 

BSZW.png


回复

使用道具 举报

29

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-8-12 14:12 | 显示全部楼层
littleshrimp 发表于 2019-8-12 12:39 是三个引脚都有瞬时低电平还是个别引脚有?

是这个几个睡眠后配置成高电平的都有这个现象

点评

我使用官方的BLE_Beacon例程做了一下你说的实验 广播间隔1S,先初始化DIO6输出模式,上拉,输出高电平 然后在主循环“BlueNRG_Sleep(SLEEPMODE_NOTIMER, 0, 0);”的后边加一句翻转DIO6的代码  详情 回复 发表于 2019-8-12 16:28


回复

使用道具 举报

6247

TA的帖子

10

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2019-8-12 16:28 | 显示全部楼层
baixiukai 发表于 2019-8-12 14:12 是这个几个睡眠后配置成高电平的都有这个现象

我使用官方的BLE_Beacon例程做了一下你说的实验

广播间隔1S,先初始化DIO6输出模式,上拉,输出高电平

然后在主循环“BlueNRG_Sleep(SLEEPMODE_NOTIMER, 0, 0);”的后边加一句翻转DIO6的代码

QQ图片20190812162741.png

用示波器可以看到每1秒翻转一次

然后注释掉主循环的翻转代码用示波器观察DIO6始终为高电平,没有跳变

QQ图片20190812162652.png

 

QQ图片20190812162752.png

 

测试工程

BLE_Beacon.rar (32.65 KB, 下载次数: 2)

点评

万分感谢。 很无奈,是不是跟配置有关系呢? 我主程序 都屏蔽掉了。 [attachimg]427681[/attachimg] 结果引脚状态是这样的 [attachimg]427679[/attachimg] 1秒一次的广播间隔,引脚配置 [attachimg  详情 回复 发表于 2019-8-12 17:47
虾扯蛋


回复

使用道具 举报

29

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-8-12 17:47 | 显示全部楼层
本帖最后由 baixiukai 于 2019-8-13 10:44 编辑

上次的回复格式有问题占的篇幅太长了,我删除了

image.png
image.png
image.png
image.png
image.png

点评

从你示波器上看是高电平脉冲,你把led配置成上拉了  详情 回复 发表于 2019-8-13 09:43


回复

使用道具 举报

6247

TA的帖子

10

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2019-8-13 09:43 | 显示全部楼层
baixiukai 发表于 2019-8-12 17:47 littleshrimp 发表于 2019-8-12 16:28 我使用官方的BLE_Beacon例程做了一下你说的实验 广播间隔1S,先初 ...

从你示波器上看是高电平脉冲,你把led配置成上拉了

点评

实际测试 这个高电平的信号持续大概2.7ms左右。  详情 回复 发表于 2019-8-13 10:45
虾扯蛋


回复

使用道具 举报

29

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-8-13 10:45 | 显示全部楼层
littleshrimp 发表于 2019-8-13 09:43 从你示波器上看是高电平脉冲,你把led配置成上拉了

实际测试 这个高电平的信号持续大概2.7ms左右。

点评

你把GPIO_Pull = ENABLE去掉,测试一个没有连接其它电路的GPIO看下  详情 回复 发表于 2019-8-13 10:48


回复

使用道具 举报

6247

TA的帖子

10

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2019-8-13 10:48 | 显示全部楼层
baixiukai 发表于 2019-8-13 10:45 实际测试 这个高电平的信号持续大概2.7ms左右。

你把GPIO_Pull = ENABLE去掉,测试一个没有连接其它电路的GPIO看下

虾扯蛋


回复

使用道具 举报

29

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-8-13 11:10 | 显示全部楼层
littleshrimp 发表于 2019-8-13 10:48 你把GPIO_Pull = ENABLE去掉,测试一个没有连接其它电路的GPIO看下

版主感谢这两天的帮助,能加一下微 信吗,15215326245.。最近啊搞一个项目,功耗和异常问题比较多。感觉看资料也和配置的差不多就是实际现象着实让人难以接收



回复

使用道具 举报

29

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-8-19 14:20 | 显示全部楼层

其他脚悬空也试了,电平确实也是跳变,广播就跳变。你发的beacon例程 引脚状态应该不对,睡眠后IO6不能正常保持住原来的高或者低电平。睡眠后是高阻态。

点评

开始的时候我想使用外部电阻做上下拉 后来在不使用外部电阻时没有出现你遇到的那个问题就没理测试 如果没有接电阻都不会出现你的问题,这个问题就和电阻应该没有关系     要不你用BLE_Beac  详情 回复 发表于 3 天前


回复

使用道具 举报

6247

TA的帖子

10

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2019-8-19 21:08 | 显示全部楼层
baixiukai 发表于 2019-8-19 14:20 其他脚悬空也试了,电平确实也是跳变,广播就跳变。你发的beacon例程 引脚状态应该不对,睡眠后IO6不能正常 ...

开始的时候我想使用外部电阻做上下拉

后来在不使用外部电阻时没有出现你遇到的那个问题就没理测试

如果没有接电阻都不会出现你的问题,这个问题就和电阻应该没有关系

 

 

要不你用BLE_Beacon例程改一下,能复现你遇到的问题,然后我按照你的方法测试一下,帮你找找原因

点评

[attachimg]428737[/attachimg]测试IO配置 [attachimg]428738[/attachimg]修改广播间隔 [attachimg]428739[/attachimg]主函数配置 [attachimg]428740[/attachimg] 实际测试1秒一次的引脚波动,这是我用  详情 回复 发表于 前天 11:55
我利用开发板实测是这样的 [attachimg]428730[/attachimg]利用Beacon例程修改的 。 [attachimg]428731[/attachimg]添加IO配置代码 [attachimg]428732[/attachimg]修改广播间隔 [attachimg]428733[/attac  详情 回复 发表于 前天 11:52
虾扯蛋


回复

使用道具 举报

29

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-8-20 11:52 | 显示全部楼层
littleshrimp 发表于 2019-8-19 21:08 开始的时候我想使用外部电阻做上下拉 后来在不使用外部电阻时没有出现你遇到的那个问题就没理测试 ...

我利用开发板实测是这样的

利用Beacon例程修改的 。

添加IO配置代码

修改广播间隔

主程序加入测试代码

image.png 实测放大后是这个波形。感觉怪怪的。

 

BLE_Beacon_b.zip

3.08 MB, 下载次数: 1

点评

我试了一下你这个代码 while里有一句“GPIO_ToggleBits(GPIO_Pin_6);” 把它注释掉DIO6就会一直低电平  详情 回复 发表于 前天 16:54


回复

使用道具 举报

29

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-8-20 11:55 | 显示全部楼层
littleshrimp 发表于 2019-8-19 21:08 开始的时候我想使用外部电阻做上下拉 后来在不使用外部电阻时没有出现你遇到的那个问题就没理测试 ...

image.png 测试IO配置

image.png 修改广播间隔

image.png 主函数配置

image.png

实际测试1秒一次的引脚波动,这是我用开发板测试的结果



回复

使用道具 举报

840

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-8-20 12:59 | 显示全部楼层
其他脚悬空也试了,电平确实也是跳变,广播就跳变

点评

你也试了?我好像发现一个规律,就是IO0到1O8和IO14睡眠前配置成输出低电平,广播唤醒后就不跳变 IO9-IO11内部有上拉睡眠前要配置成高电平,唤醒后部跳变。 但是一直没找到相关的确切说明  详情 回复 发表于 前天 13:20


回复

使用道具 举报

29

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-8-20 13:20 | 显示全部楼层
zhuyebb 发表于 2019-8-20 12:59 其他脚悬空也试了,电平确实也是跳变,广播就跳变

你也试了?我好像发现一个规律,就是IO0到1O8和IO14睡眠前配置成输出低电平,广播唤醒后就不跳变

IO9-IO11内部有上拉睡眠前要配置成高电平,唤醒后部跳变。

但是一直没找到相关的确切说明



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /3 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-8-22 23:43 , Processed in 0.520699 second(s), 17 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表