1.目的为降低功耗;
2.当前测试发现原因主芯片供应的12M晶振没有被关闭,强行将12M对地接后功耗降低至1mA;
3.原始功能是通过按键休眠实现低功耗,同时12M也关闭;
4.主芯片为SIRF A3;
5.尝试在相应响应休眠的程序上加入对12M使能的控制但依然无效;
求助。解决了再加分。
57 个解决方案
#1
自己先顶下。。。
#2
哈哈,这不叫散分啊。
#3
有诱惑的嫌疑。。。。。没办法。。。引高手进来。
#4
控制没作用?没控制到?没指到对应的物理地址?
#5
谢谢 xqhrs232.。。。
物理地址??
他是两个线,从主芯片里出来,XIN XOUT进12M晶振。
没指到对应的物理地址?
这个什么叫物理地址。。。。他是一个寄存器。我直接写寄存器控制的。。这样不行吗?汗。。
WRITE_BITFIELD(struct pwrclkenable, &(v_pPowerRegs->pmr_clkenable), xin,0);
这样定义的。
// define power manager registers
struct powerregs {
struct pwrctrl pmr_ctrl;
struct pwrconfig pmr_config;
struct pwrwakeup pmr_wakeup;
struct pwrsleepstatus pmr_sleepstatus;
unsigned int pmr_scratchpad;
UCHAR pad[8]; // padded 64-bits
struct pwroscstatus pmr_oscstatus;
struct pwrclkswitch pmr_clkswitch;
UCHAR pad1[4];
struct pwrpll1config pmr_pll1config;
struct pwrpll2config pmr_pll2config;
struct pwrclkenable pmr_clkenable;
struct pwroscwait pmr_oscwait; // 0x034
unsigned int pmr_stoplevel; // 0x38
unsigned int pmr_pinrelease; // 0x3c
struct pwrioclkratio pmr_ioclkratio; // 0x40
unsigned int pmr_xinratio; // 0x44
struct pwrMemCtrlbits pmr_memctrl; //0x48
struct pwrDelayCtrl0 pmr_delayctrl0; //0x4c
struct pwrDelayCtrl1 pmr_delayctrl1; //0x50
};
#6
我直接写寄存器位。
#7
怎么写的?
#8
硬件上不懂,看看两根引脚的波形正确么?
#9
一般 5mA 这个功耗 不小哦! 你的片子米用过
#10
5ma还不小?
#11
牛人。波形很漂亮的。。。= =问题是我要关掉那个波形。。。。
外话。3530耍的怎么样了
#12
已经很小了。。。哎。。。。电路设计的。。。不说了。。不做评价。高手有没有其他建议给小弟的。。。。
晶振一般怎么控制工作的。
#13
理论上。。。。。sirf A3待机功耗是微安级的。。。。。。也就是几百微安。。uA....
我把12M 欧掉了就1mA。。。。
#14
不一定是程序问题 调试时看你设置的那寄存器是否如你想改变没
若是 可能芯片的事
路过
若是 可能芯片的事
路过
#15
其他的都没问题啊。。。。我现在非常之迷茫。。。。硬件说不是硬件问题。软件又查不出来。。。。迷茫啊。。
#16
上面有写
#17
顶下。各位大侠帮忙啊
#18
看你的A3的datasheet怎么写的?如果是用的无源晶振的话,换一个有源金振(是金振,不是晶振)试验一下。
#19
我菜鸟。3430板子还没买到手,马上要去美国出差一个月,等回来再买,或者干脆在那边买小狗板了。
我的意思是你看看波形,关闭的命令发送出去没有,时序是否正确。
#20
帮顶了。
#21
其他的板子都好用就一个不好用~
那肯定是硬件的事了
那肯定是硬件的事了
#22
友情up,这个真的不会
#23
高手。。不懂。。。。
datasheet里面是这样写
Internal 12MHz and 32.768KHz oscillator (external crystal needed)
这个是属于哪个类?
不过我感觉也不是晶振的问题。其他产品上用的都是一样的东东。。。。
#24
米国。。。。厉害了。。。祝顺利。。
#25
。。。。。。老板说是软件。。我无语。
产品不同。
但是硬件设计上。。。我们没办法决定。
理论上跟硬件其实没关系。。我对比了两个产品的原理图。一个是用按键下拉,我们现在是用MCU下拉。两个其实是一样的原理。但是就是关不掉12M。
#26
俺不是很懂硬件。不过我觉得你们得首先排除是不是硬件问题,如果是的话,软件上debug一辈子也不一定能找出症结。
你要看的不是主芯片的datasheet,应该看看这颗晶振的参数,如果需要关闭它,需要按什么时序发送命令,先确保晶振得到了正确的命令。
#27
SIRF A4下对某些GPIO控制需要有特殊控制,看样子你GPIO口没有控制,如果控制到了,那你就把这个GPIO口设置成输入。那应该就会存在功耗了。
#28
SIRF A3下对某些GPIO控制需要有特殊控制技巧,看样子你的GPIO口没有控制到。如果控制到了,还有输出功耗,那你就把这个GPIO口设置成输入口。那应该就不会再存在功耗了。
#29
谢谢CQ.
有个问题。。。。12M那组晶振并不是GPIO口啊。。。我现在的问题是12M关不掉。。XIN XOUT不是GPIO。主要问题就是在12M并没有关闭导致功耗过大。这个12M有没有什么建议把它关掉。软件或者硬件问题??
#30
了解。。我再看看。谢谢啦。时序的问题倒真是个大问题。
#31
WRITE_BITFIELD(struct pwrclkenable, &(v_pPowerRegs->pmr_clkenable), xin,0);
while(1);
之后你量波形。。。。
while(1);
之后你量波形。。。。
#32
谢谢建议。我试验下
#33
不行。。诶。。还是12M有。。难道是没控制到?
#34
那就是没有控制到,能描述一下开机到while(1);之间的波形吗? 发一下这个结构体。还有A3关于这个寄存器的说明文档(我没有A4文档)
#35
我没有A3的文档
#36
发一下pwrclkenable这个结构体
#37
//Power Manager Clocks Enable Register (PWR_CLK_ENABLE) - 0x0030 write-only
struct pwrclkenable {
unsigned dsp :1; // 0,default 0; DSP core clock enable 1 : reset
unsigned rom :1; // 1,FLASH Controller clock enable; default 1
unsigned dma :1; // 2,DMA Controller clock enable
unsigned lcd :1; // 3,LCD Controller clock enable
unsigned gps :1; // 4,GPS clock enable
unsigned usb :1; // 5,USB Core clock enable
unsigned pcmcia :1; // 6,PCMCIA Core clock enable
unsigned cam :1; // 7,Camera clock enable
unsigned codec :1; // 8,CODEC clock enable
unsigned sp0 :1; // 9,UART, serial port 0,6,7 clock enable
unsigned sp1 :1; // 10,serial port 1 clock enable
unsigned sp2 :1; // 11,serial port 2 clock enable
unsigned sp3 :1; // 12,serial port 3 clock enable
unsigned sp4 :1; // 13,serial port 4 clock enable
unsigned sp5 :1; // 14,serial port 5 clock enable
unsigned ipolate :1; // 15,interpolation bolci enable
unsigned ext :1; // 16,extension port clock enable
unsigned sdio :1; // 17,SD interface clock enable
unsigned sm :1; // 18,clock output enable
unsigned copy :1; // 19,PCI copy block enable
unsigned i2c :1; // 20,
unsigned io :1; // 21,io clock enable
unsigned pci :1; // 22,pci interface clock enable
unsigned cko0 :1; // 23
unsigned cko1 :1; // 24,
unsigned can0 :1; // 25, CAN BUS 0
unsigned can1 :1; // 26, CAN BUS 1
unsigned padarb :1; // 27, pad arbitration clock enable
unsigned xin :1; // 28, XIN clock enable
unsigned xinw :1; // 29, XINW interface clock enable
unsigned ide :1; // 30, IDE
unsigned rsvd1 :1; // reserved
};
struct pwrclkenable {
unsigned dsp :1; // 0,default 0; DSP core clock enable 1 : reset
unsigned rom :1; // 1,FLASH Controller clock enable; default 1
unsigned dma :1; // 2,DMA Controller clock enable
unsigned lcd :1; // 3,LCD Controller clock enable
unsigned gps :1; // 4,GPS clock enable
unsigned usb :1; // 5,USB Core clock enable
unsigned pcmcia :1; // 6,PCMCIA Core clock enable
unsigned cam :1; // 7,Camera clock enable
unsigned codec :1; // 8,CODEC clock enable
unsigned sp0 :1; // 9,UART, serial port 0,6,7 clock enable
unsigned sp1 :1; // 10,serial port 1 clock enable
unsigned sp2 :1; // 11,serial port 2 clock enable
unsigned sp3 :1; // 12,serial port 3 clock enable
unsigned sp4 :1; // 13,serial port 4 clock enable
unsigned sp5 :1; // 14,serial port 5 clock enable
unsigned ipolate :1; // 15,interpolation bolci enable
unsigned ext :1; // 16,extension port clock enable
unsigned sdio :1; // 17,SD interface clock enable
unsigned sm :1; // 18,clock output enable
unsigned copy :1; // 19,PCI copy block enable
unsigned i2c :1; // 20,
unsigned io :1; // 21,io clock enable
unsigned pci :1; // 22,pci interface clock enable
unsigned cko0 :1; // 23
unsigned cko1 :1; // 24,
unsigned can0 :1; // 25, CAN BUS 0
unsigned can1 :1; // 26, CAN BUS 1
unsigned padarb :1; // 27, pad arbitration clock enable
unsigned xin :1; // 28, XIN clock enable
unsigned xinw :1; // 29, XINW interface clock enable
unsigned ide :1; // 30, IDE
unsigned rsvd1 :1; // reserved
};
#38
以上电就是一个标准的12M正弦波型,非常正常,我要做的是休眠的时候把12M关闭。
现在休眠我已经做了。也就是将GPIO0 拉底。系统其他部分都是休眠状态了。但是12M并没有关闭。
我也找其他的同行对了下code。没发现异常,别人的也是一样的。。。但是就是能关掉12M不知道是不是没找到还是看错了。。汗。
理论上修改的地方应该是sleep.c 或者是 off.c里面的一些函数,难道是我程序修改思路错了?
#39
我那样写的目的是看一下你是不是能控制住寄存器。
#40
目前看来不知道是没有控制到还是根本就没有执行到。。现在比较迷茫。呵呵
#41
那你在while(1)之前;增加一个条打印语句:原型RETAILMSG(1,(L"这里填入你需要输出的信息"));
#42
恩。试试看先。打印信息可能还没执行到就可能因为断电导致成了乱码或者就没有显示出来。
#43
没有打印信息。。。不知道是什么地方有问题。可能根本就是函数没跑到。。再检查下
#44
那就是一直都没有执行到这部分。。。。你看一下你的代码
#45
电路上设计一个关段,增加电路。
#46
谢谢wohoo。能不能介绍下什么电路。我不是主要做硬件的。我是软件负责,汗。。。关段是什么不懂。。
#47
code太多了。。汗。。
我现在怀疑是APM部分的问题。也就是advance power manager的问题。再查下
#48
你现在都已经知道WRITE_BITFIELD(struct pwrclkenable, &(v_pPowerRegs->pmr_clkenable), xin,0);
没有执行,怎么不再在软件部分跟下去,你把WRITE_BITFIELD(struct pwrclkenable, &(v_pPowerRegs->pmr_clkenable), xin,0);
放到休眠和关机之前,保证让他执行到。你再看波形。。。。软体能实现何必要去修改硬件?关注了一个下午了。唉。。。。我自己的驱动却还没有调试完。。。我闪人先。。。。这个问题,使用软体一定是能实现的(我在A4下做过类似的东西)。
没有执行,怎么不再在软件部分跟下去,你把WRITE_BITFIELD(struct pwrclkenable, &(v_pPowerRegs->pmr_clkenable), xin,0);
放到休眠和关机之前,保证让他执行到。你再看波形。。。。软体能实现何必要去修改硬件?关注了一个下午了。唉。。。。我自己的驱动却还没有调试完。。。我闪人先。。。。这个问题,使用软体一定是能实现的(我在A4下做过类似的东西)。
#49
这个案子硬件比较怪异。软件上也没了支持。呃。。。
主要是一个个排除下。谢谢cq了。现在找到了一些方法去处理下。
整定了就马上结贴
#50
WRITE_BITFIELD(struct pwrclkenable, &(v_pPowerRegs->pmr_clkenable), xin, 0);
已经用其他办法验证了。没有将晶振关闭。。。呵呵。比较麻烦了。。
已经用其他办法验证了。没有将晶振关闭。。。呵呵。比较麻烦了。。
#1
自己先顶下。。。
#2
哈哈,这不叫散分啊。
#3
有诱惑的嫌疑。。。。。没办法。。。引高手进来。
#4
控制没作用?没控制到?没指到对应的物理地址?
#5
谢谢 xqhrs232.。。。
物理地址??
他是两个线,从主芯片里出来,XIN XOUT进12M晶振。
没指到对应的物理地址?
这个什么叫物理地址。。。。他是一个寄存器。我直接写寄存器控制的。。这样不行吗?汗。。
WRITE_BITFIELD(struct pwrclkenable, &(v_pPowerRegs->pmr_clkenable), xin,0);
这样定义的。
// define power manager registers
struct powerregs {
struct pwrctrl pmr_ctrl;
struct pwrconfig pmr_config;
struct pwrwakeup pmr_wakeup;
struct pwrsleepstatus pmr_sleepstatus;
unsigned int pmr_scratchpad;
UCHAR pad[8]; // padded 64-bits
struct pwroscstatus pmr_oscstatus;
struct pwrclkswitch pmr_clkswitch;
UCHAR pad1[4];
struct pwrpll1config pmr_pll1config;
struct pwrpll2config pmr_pll2config;
struct pwrclkenable pmr_clkenable;
struct pwroscwait pmr_oscwait; // 0x034
unsigned int pmr_stoplevel; // 0x38
unsigned int pmr_pinrelease; // 0x3c
struct pwrioclkratio pmr_ioclkratio; // 0x40
unsigned int pmr_xinratio; // 0x44
struct pwrMemCtrlbits pmr_memctrl; //0x48
struct pwrDelayCtrl0 pmr_delayctrl0; //0x4c
struct pwrDelayCtrl1 pmr_delayctrl1; //0x50
};
#6
我直接写寄存器位。
#7
怎么写的?
#8
硬件上不懂,看看两根引脚的波形正确么?
#9
一般 5mA 这个功耗 不小哦! 你的片子米用过
#10
5ma还不小?
#11
牛人。波形很漂亮的。。。= =问题是我要关掉那个波形。。。。
外话。3530耍的怎么样了
#12
已经很小了。。。哎。。。。电路设计的。。。不说了。。不做评价。高手有没有其他建议给小弟的。。。。
晶振一般怎么控制工作的。
#13
理论上。。。。。sirf A3待机功耗是微安级的。。。。。。也就是几百微安。。uA....
我把12M 欧掉了就1mA。。。。
#14
不一定是程序问题 调试时看你设置的那寄存器是否如你想改变没
若是 可能芯片的事
路过
若是 可能芯片的事
路过
#15
其他的都没问题啊。。。。我现在非常之迷茫。。。。硬件说不是硬件问题。软件又查不出来。。。。迷茫啊。。
#16
上面有写
#17
顶下。各位大侠帮忙啊
#18
看你的A3的datasheet怎么写的?如果是用的无源晶振的话,换一个有源金振(是金振,不是晶振)试验一下。
#19
我菜鸟。3430板子还没买到手,马上要去美国出差一个月,等回来再买,或者干脆在那边买小狗板了。
我的意思是你看看波形,关闭的命令发送出去没有,时序是否正确。
#20
帮顶了。
#21
其他的板子都好用就一个不好用~
那肯定是硬件的事了
那肯定是硬件的事了
#22
友情up,这个真的不会
#23
高手。。不懂。。。。
datasheet里面是这样写
Internal 12MHz and 32.768KHz oscillator (external crystal needed)
这个是属于哪个类?
不过我感觉也不是晶振的问题。其他产品上用的都是一样的东东。。。。
#24
米国。。。。厉害了。。。祝顺利。。
#25
。。。。。。老板说是软件。。我无语。
产品不同。
但是硬件设计上。。。我们没办法决定。
理论上跟硬件其实没关系。。我对比了两个产品的原理图。一个是用按键下拉,我们现在是用MCU下拉。两个其实是一样的原理。但是就是关不掉12M。
#26
俺不是很懂硬件。不过我觉得你们得首先排除是不是硬件问题,如果是的话,软件上debug一辈子也不一定能找出症结。
你要看的不是主芯片的datasheet,应该看看这颗晶振的参数,如果需要关闭它,需要按什么时序发送命令,先确保晶振得到了正确的命令。
#27
SIRF A4下对某些GPIO控制需要有特殊控制,看样子你GPIO口没有控制,如果控制到了,那你就把这个GPIO口设置成输入。那应该就会存在功耗了。
#28
SIRF A3下对某些GPIO控制需要有特殊控制技巧,看样子你的GPIO口没有控制到。如果控制到了,还有输出功耗,那你就把这个GPIO口设置成输入口。那应该就不会再存在功耗了。
#29
谢谢CQ.
有个问题。。。。12M那组晶振并不是GPIO口啊。。。我现在的问题是12M关不掉。。XIN XOUT不是GPIO。主要问题就是在12M并没有关闭导致功耗过大。这个12M有没有什么建议把它关掉。软件或者硬件问题??
#30
了解。。我再看看。谢谢啦。时序的问题倒真是个大问题。
#31
WRITE_BITFIELD(struct pwrclkenable, &(v_pPowerRegs->pmr_clkenable), xin,0);
while(1);
之后你量波形。。。。
while(1);
之后你量波形。。。。
#32
谢谢建议。我试验下
#33
不行。。诶。。还是12M有。。难道是没控制到?
#34
那就是没有控制到,能描述一下开机到while(1);之间的波形吗? 发一下这个结构体。还有A3关于这个寄存器的说明文档(我没有A4文档)
#35
我没有A3的文档
#36
发一下pwrclkenable这个结构体
#37
//Power Manager Clocks Enable Register (PWR_CLK_ENABLE) - 0x0030 write-only
struct pwrclkenable {
unsigned dsp :1; // 0,default 0; DSP core clock enable 1 : reset
unsigned rom :1; // 1,FLASH Controller clock enable; default 1
unsigned dma :1; // 2,DMA Controller clock enable
unsigned lcd :1; // 3,LCD Controller clock enable
unsigned gps :1; // 4,GPS clock enable
unsigned usb :1; // 5,USB Core clock enable
unsigned pcmcia :1; // 6,PCMCIA Core clock enable
unsigned cam :1; // 7,Camera clock enable
unsigned codec :1; // 8,CODEC clock enable
unsigned sp0 :1; // 9,UART, serial port 0,6,7 clock enable
unsigned sp1 :1; // 10,serial port 1 clock enable
unsigned sp2 :1; // 11,serial port 2 clock enable
unsigned sp3 :1; // 12,serial port 3 clock enable
unsigned sp4 :1; // 13,serial port 4 clock enable
unsigned sp5 :1; // 14,serial port 5 clock enable
unsigned ipolate :1; // 15,interpolation bolci enable
unsigned ext :1; // 16,extension port clock enable
unsigned sdio :1; // 17,SD interface clock enable
unsigned sm :1; // 18,clock output enable
unsigned copy :1; // 19,PCI copy block enable
unsigned i2c :1; // 20,
unsigned io :1; // 21,io clock enable
unsigned pci :1; // 22,pci interface clock enable
unsigned cko0 :1; // 23
unsigned cko1 :1; // 24,
unsigned can0 :1; // 25, CAN BUS 0
unsigned can1 :1; // 26, CAN BUS 1
unsigned padarb :1; // 27, pad arbitration clock enable
unsigned xin :1; // 28, XIN clock enable
unsigned xinw :1; // 29, XINW interface clock enable
unsigned ide :1; // 30, IDE
unsigned rsvd1 :1; // reserved
};
struct pwrclkenable {
unsigned dsp :1; // 0,default 0; DSP core clock enable 1 : reset
unsigned rom :1; // 1,FLASH Controller clock enable; default 1
unsigned dma :1; // 2,DMA Controller clock enable
unsigned lcd :1; // 3,LCD Controller clock enable
unsigned gps :1; // 4,GPS clock enable
unsigned usb :1; // 5,USB Core clock enable
unsigned pcmcia :1; // 6,PCMCIA Core clock enable
unsigned cam :1; // 7,Camera clock enable
unsigned codec :1; // 8,CODEC clock enable
unsigned sp0 :1; // 9,UART, serial port 0,6,7 clock enable
unsigned sp1 :1; // 10,serial port 1 clock enable
unsigned sp2 :1; // 11,serial port 2 clock enable
unsigned sp3 :1; // 12,serial port 3 clock enable
unsigned sp4 :1; // 13,serial port 4 clock enable
unsigned sp5 :1; // 14,serial port 5 clock enable
unsigned ipolate :1; // 15,interpolation bolci enable
unsigned ext :1; // 16,extension port clock enable
unsigned sdio :1; // 17,SD interface clock enable
unsigned sm :1; // 18,clock output enable
unsigned copy :1; // 19,PCI copy block enable
unsigned i2c :1; // 20,
unsigned io :1; // 21,io clock enable
unsigned pci :1; // 22,pci interface clock enable
unsigned cko0 :1; // 23
unsigned cko1 :1; // 24,
unsigned can0 :1; // 25, CAN BUS 0
unsigned can1 :1; // 26, CAN BUS 1
unsigned padarb :1; // 27, pad arbitration clock enable
unsigned xin :1; // 28, XIN clock enable
unsigned xinw :1; // 29, XINW interface clock enable
unsigned ide :1; // 30, IDE
unsigned rsvd1 :1; // reserved
};
#38
以上电就是一个标准的12M正弦波型,非常正常,我要做的是休眠的时候把12M关闭。
现在休眠我已经做了。也就是将GPIO0 拉底。系统其他部分都是休眠状态了。但是12M并没有关闭。
我也找其他的同行对了下code。没发现异常,别人的也是一样的。。。但是就是能关掉12M不知道是不是没找到还是看错了。。汗。
理论上修改的地方应该是sleep.c 或者是 off.c里面的一些函数,难道是我程序修改思路错了?
#39
我那样写的目的是看一下你是不是能控制住寄存器。
#40
目前看来不知道是没有控制到还是根本就没有执行到。。现在比较迷茫。呵呵
#41
那你在while(1)之前;增加一个条打印语句:原型RETAILMSG(1,(L"这里填入你需要输出的信息"));
#42
恩。试试看先。打印信息可能还没执行到就可能因为断电导致成了乱码或者就没有显示出来。
#43
没有打印信息。。。不知道是什么地方有问题。可能根本就是函数没跑到。。再检查下
#44
那就是一直都没有执行到这部分。。。。你看一下你的代码
#45
电路上设计一个关段,增加电路。
#46
谢谢wohoo。能不能介绍下什么电路。我不是主要做硬件的。我是软件负责,汗。。。关段是什么不懂。。
#47
code太多了。。汗。。
我现在怀疑是APM部分的问题。也就是advance power manager的问题。再查下
#48
你现在都已经知道WRITE_BITFIELD(struct pwrclkenable, &(v_pPowerRegs->pmr_clkenable), xin,0);
没有执行,怎么不再在软件部分跟下去,你把WRITE_BITFIELD(struct pwrclkenable, &(v_pPowerRegs->pmr_clkenable), xin,0);
放到休眠和关机之前,保证让他执行到。你再看波形。。。。软体能实现何必要去修改硬件?关注了一个下午了。唉。。。。我自己的驱动却还没有调试完。。。我闪人先。。。。这个问题,使用软体一定是能实现的(我在A4下做过类似的东西)。
没有执行,怎么不再在软件部分跟下去,你把WRITE_BITFIELD(struct pwrclkenable, &(v_pPowerRegs->pmr_clkenable), xin,0);
放到休眠和关机之前,保证让他执行到。你再看波形。。。。软体能实现何必要去修改硬件?关注了一个下午了。唉。。。。我自己的驱动却还没有调试完。。。我闪人先。。。。这个问题,使用软体一定是能实现的(我在A4下做过类似的东西)。
#49
这个案子硬件比较怪异。软件上也没了支持。呃。。。
主要是一个个排除下。谢谢cq了。现在找到了一些方法去处理下。
整定了就马上结贴
#50
WRITE_BITFIELD(struct pwrclkenable, &(v_pPowerRegs->pmr_clkenable), xin, 0);
已经用其他办法验证了。没有将晶振关闭。。。呵呵。比较麻烦了。。
已经用其他办法验证了。没有将晶振关闭。。。呵呵。比较麻烦了。。