背景
芯片:stm32f103
芯片频率:72MHZ
通信协议:iic
问题:
在stm32的项目中,惯例使用软件iic,使用软件(模拟)iic时,可以参考到成熟的代码,我的需求想在一个量产的项目中移植cw2015电量计的相关功能,移植完出现了以下问题:
1、电量计无法读取电量,跟踪到是电量计写入寄存器成功了,但回读出来的寄存值全是0。当时猜想是电量计坏了;
2、即使换了一个设备地址,依旧可以通信成功,但以上的读取值依旧有问题;
解决:
拿逻辑分析仪抓取波形
简单的查询是否在线,波形只是一段持续了几百ms的低电平,并非正常的iic通信协议,也难怪能识别成功
接着查询delay_us函数
void delay_us ( u32 nus )
{
u32 temp;
SysTick->LOAD = nus * fac_us; /* 时间加载 */
SysTick->VAL = 0x00; /* 清空计数器 */
SysTick->CTRL = 0x01 ; /* 开始倒数 */
do
{
temp = SysTick->CTRL;
}
while ( ( temp & 0x01 ) && ! ( temp & ( 1 << 16 ) ) ); /* 等待时间到达 */
SysTick->CTRL = 0x00; /* 关闭计数器 */
SysTick->VAL = 0X00; /* 清空计数器 */
}
这块代码执行没有问题;
我发现例如delay_us(1) delay_us(2)...这些低延时的函数,虽是执行成功,但实际无法生成有效的波形
结果
调试发现,delay_us能够生成波形的最低延时是350us,将程序中delay_us()延时时间小于350的调用,全改过来,就可以正常通信了。
在不同的项目的结果不同,可能与芯片内部处理有关,通信异常还得抓波形分析