您的位置:首页 > 其它

WinCE设备电池电量采集问题

2014-07-20 16:19 232 查看
这次WinCE操作系统桌面电池图标始终显示小插头图标,表示系统正在使用交流电供电,未使用电池。导致这种现象产生的最表面原因是WinCE电源管理器没有检测到有电池存在。

1 为什么没有检测到电池存在?

电池模块是通过IIC总线与主板通信。电源模块作为IIC总线的从设备,上层主板作为主设备。主设备通过IIC请求从设备信息,并返回信息给WinCE的电源管理器。这里最重要的问题是IIC总线的通信协议有没有用程序正确表达!可以通过研究研华最后一次提供的驱动源码来回答这个问题,在驱动源码中,可以清晰的看见,研华已经将关于IIC的操作封装成了方便调用的函数,如IICOpen(),IICSetSlaveAddress(),IICRead()等,研华为什么要封装好这些函数,因为在主板上使用了三路IIC,检测电池信息只是用到了其中一路,其他设备也用到了IIC总线,所以它们也需要IIC的这些操作函数。所以可以知道我们不必把关注点放在IIC的通信协议上。

第二个原因,也是我现在最怀疑可能出问题的地方是:从设备的地址不正确。和电池提供方沟通的过程中,它们提供了好几个IIC地址,最后一次给的是0b 0001011。也就是16进制的0xB。关于地址,这里有一个非常微妙的细节。它们提供的地址是7位的,第8位根据是读还是写表现不同,如果是读,第8位应该是0,如果是写,第8位应该是1。微妙就微妙在,不管你是读还是写,你都是传进去0xB,而不是0b 0001 0110或者0b 0001 0111。因为最后一位不用你去写,程序会根据你是读还是写自动补齐这一位。所以这里可能是导致IIC没通信上的最可能原因。因为从设备地址搞错了,地址错了,它们肯定就联系不上了。

2 为什么会有这样的总结,因为我们借了一块好的电池,打算用他们的电池试一下,研究所说它们电池地址是0x34,而我们用这个地址去读,怎么也读不出来,用0x68反而能读出来。后来跟卫国斌交流后,他解释说,0x68是0x34左移一位的结果,也就是相当于在0x34的末尾加一个0,而这个0也就是表示读。

综合这一切,我总结出,我们也可能是这个原因导致IIC没有通信上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: