data/attach/1907/fehc4er1b5f3aete50bofks20ogxzjm1.jpgdata/attach/1907/c7d0sh94028u09na12t16sreunouqmcb.jpg
Freescale MMPF0100是一款可编程电源管理芯片,可提供4-6路电压降压转换器,六路通用可编程电压输出。控制接口为I2C接口。
Features:
• Four to six buck converters, depending on configuration
• Single/Dual phase/ parallel options
• DDR termination tracking mode option
• Boost regulator to 5.0 V output
• Six general purpose linear regualtors
• Programmable output voltage, sequence, and timing
• OTP (One Time Programmable) memory for device configuration
• Coin cell charger and RTC supply
• DDR termination reference voltage
• Power control logic with processor interface and event detection
• I2C control
• Individually programmable ON, OFF, and Standby modes
我的应用需求是使用这款电源芯片实现长按能够关机功能。查看芯片手册,看到这样一个状态转换图:
也就说要实现从on状态到off状态,需要图中红 {MOD}圈圈所标示的条件。电源按钮设计的是按下PWRON=0,没按的情况下PWRON=1。在默认配置情况下,PWRON_CFG位为0,所以电源开关按下就关机,但松开就开机,不能实现长按关机的功能。要实现长按电源开关关机的功能,需要实现图中红 {MOD}圈圈标示的下面一种配置。首先要确保PWRON_CFG位为1。
查看寄存器列表,如下图。
看到有PWRON_CFG位的寄存器竟有三个,傻眼了,不知道配置哪一个。不管了,全部配置为1。通过i2c tools配置寄存器,发现配不进去。回头仔细查看下手册,原来这几个寄存器属于Extend page 1 寄存器。关于这些扩展寄存器,手册有如下说明。
The register map is comprised of thirty-two pages, and its address and data fields are each eight bits wide. Only the first two
pages can be accessed. On each page, registers 0 to 0x7F are referred to as
'functional', and registers 0x80 to 0xFF as
'extended'. On each page, the functional registers are the same, but the extended registers are different.To access registers on
Extended Page 1, one must first write 0x01 to the page register at address 0x7F, and to access registersExtended Page 2,
one
must first write 0x02 to the page register at address 0x7F. To access the
Functional Page from one of the extended pages, no
write to the page register is necessary.
原来地址0x00 - 0x7f 寄存器属于功能寄存器,可直接访问;地址0x80 - 0xff 寄存器属于扩展寄存器,需要设置page number后才能访问,设置不通page number后扩展寄存器的功能是不同的。意思是说要读写Extend page 1 寄存器,需要在功能寄存器 0x7f 里写入page number 0x01后才能访问。尝试一下设置page number以后,果然可以设置E0 、 E1 、E2三个寄存器。在设置过程中,偶然发现原来E3寄存器值是由E0
、 E1 、E2三个寄存器异或后得到的。于是猜测,要配置PWRON_CFG位为1,只需配置E0 、 E1 、E2三个寄存器的PWRON_CFG位异或为1即可。也就说要么三个全配置为1,要么其中一个为1,其余两个为0。后经验证,的确是这样。
配置完PWRON_CFG位以后,检查SWxOMODE位,一共有六个寄存器有这个位,但默认全是0,所以不用配置。剩下的就是要配置PWRONRSTEN位为1。查看手册,0x1b寄存器有该位,在bit1。这个寄存器属于功能寄存器,可以直接操作。设置完之后,长按电源按钮,关机了,松开之后又开机了。显然跟设置之前一模一样。
这到底是什么情况?完全按照手册设置了,怎么不生效呢?怀疑是PWRON_CFG位的设置可能有问题,毕竟三个寄存器,随便设置一个,还是全部设置,都只是猜测。没有办法,只有发邮件询问FAE。结果FAE回复的内容跟我在手册上看到的一样,只是强调了一句,要进入TBB模式,设置寄存器才能生效。并且还附带了一个芯片编程手册,这个手册比之前的datasheet管用多了,最终能调出来,这个手册帮了大忙。因为FAE本身没有试验过,所以具体他也不清楚,只是发过来手册让我自己去试验。
TBB模式是什么,看编程手册是说
TBB模式时, VDDOTP引脚要接GND;TBB_POR要设置为1;
让硬件检查了,这个引脚是接地的。TBB_POR也设置了,但是配置就是不生效啊,实在不懂为什么。我想肯定是对TBB模式理解的不够深入,于是重新看编程手册。认知读了一下,发现以下内容:
The TBBOTP registers are located within the Extended Page 1 of the MMPF0100 register map.During a power-up, the TBBOTP registers behave as follows:
• The contents of the TBBOTP registers are initialized to zero when a valid VIN is first applied.
• The values that are then loaded into the TBBOTP registers depend on the setting of the VDDOTP pin, and
on the value of the TBB_POR, and the FUSE_POR_XOR bits. Refer to Table 1.
• If VDDOTP = VCOREDIG (1.5 V), the TBBOTP values are loaded from ROM.
• If VDDOTP = 0 V, TBB_POR = 0 and FUSE_POR_XOR = 1; the TBBOTP values are loaded from the fuses.
• If VDDOTP = 0, TBB_POR = 0 and FUSE_POR_XOR=0; the TBBOTP registers remain initialized at zero.
• The initial value of TBB_POR is always “0”, only when VDDOTP = 0 V and TBB_POR is set to “1”, are the
values from the TBBOTP registers maintained and not loaded from a different source.
之前只注意到要使TBBOTP寄存器生效,要使VDDOTP=0V且TBB_POR=1,但是没有注意上面紫 {MOD}字体的内容:“During a power-up”,这是不是说TBBOTP寄存器生效要有power up的过程,也就是说有上下电的操作。于是重新配置下寄存器,然后拔掉电源,重新插上,板子居然不启动了,这就说明设置终于生效了。因为按照上面的状态机,这种配置PWRON_CFG位为1的情况下,off状态要到on状态,要按下按钮,使PWRON=0。按下按钮,成功开机;开机完了以后,按住电源按钮4s,成功关机了。
长按关机这个功能本身并不算很复杂,但是这个调试过程却费了一番周折。从一开始认为很简单的电源芯片,只需要配置寄存器就可实现功能,到最终花了三四天时间,并且还通过FAE来帮忙解决问题,说明了一个问题,任何一个简单功能都必须要认真对待,只有认知对待才能够挖掘到深入的东西,学习到新知识。