记录一个调试插曲

来源:互联网 发布:大数据思维 编辑:程序博客网 时间:2024/06/10 07:01

手边有两个最小系统的stm32f103和stm32f407,也不算极小系统吧,就是网上买的100以内的那种系统,外围除了串口没啥芯片,管脚全部外引。由于是小系统基本只有很少的,如启动板子,亮盏led的例子。


需要做的是驱动一个i2c设备。

网上下,论坛找,一番纠缠,顺利驱动了stm32f407的i2c,但是f103的不行。f103的代码当然也是来自网上同型号的开发板的,但那些往往都是有外围的开发板。

反正我试下来不行,怎么搞也不行,一行一行都对照了也不行,

这阶段做的尝试有:网上下载各开发板的例程,对照i2c的配置,不行,怀疑i2c1不好,那换i2c2,也不行,看到还有管脚映射,发现默认确实为i2c,不需要改,pb10,pb11靠vcc,gnd,怀疑干扰,也不对,怀疑板子有问题。。。

还拿逻辑分析仪测试,发现sda下降触发时,更本无法触发。这个阶段其实问题没有定位,是i2c配置问题还是i2c操作问题。


这是其实你需要离开座位,喝杯茶,抽根烟,来盘王者荣耀,外面去转一圈。倒不是说你再回来就能找到问题所在。


而是当我再回来时,我跳过了i2c的配置部分,查看了i2c的操作部分,发现在等待i2c空闲的时候是超时退出的,也就是说scl或sda没有空闲。

嘿嘿,再回来是至少对故障聚焦了一点了。好着就是突破口,为啥i2c是busy状态呢?


好,从i2c的配置前后,全程查看sda和scl的电位,发现i2c配置前后,scl、sda一直是低电位,这就有问题了,这种最小板的引脚上不会有上下拉电阻,怎么会出现这种情况呢?

好开始怀疑i2c配置引脚时的高点电位问题,这时候,推挽 开漏进入视线,没有为啥,既然没有外围上下拉电阻估计也就和推挽 开漏有关,反正至少目前只找的到和他们相关,再去回忆看推挽 开漏定义,不去看原理图了,直接看网上定义:

推挽输出:可以输出高,低电平,连接数字器件;

开漏输出:输出端相当于三极管的集电极.要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内).

ok,好像到点了,最小系统就是因为外围没有上下拉电阻,似乎应该要配为推挽,而我下的例程基本都是有外围的开发板的例程,这些开发板外围丰富,估计正对i2c的引脚估计都是有上下拉的(问题就在这里,我没看到这些网上下载的例程配套的开发板原理图),所以网下的例程都配置为开漏。而f407之所以成功是因为:下到的正好是正确配置的,而且407和103的配置不同没法行行对比。

好了,改成推挽,发现sda,scl受控了,OK了。。。


然而还没结束,真接上i2c设备后逻辑分析仪发现从机不ack,也不知道为啥,上面测试时为了排除从机设备影响,我都是直接只接了逻辑分析仪,所以没发现问题。但是很快怀疑配置推挽后从机无法控制sda了,sda被主机强行钳住了,不然为啥那么多例程都是开漏呢,简单查了下网上资料,看到sda配置开漏时上拉,阻值2.2k吧,于是马上焊了了个1k的电阻上拉,再测试,终于实际ok了。f407因为能够配置开漏时还能不钳住sda所以好像不用上拉电阻,f103只能配置推挽,开漏。。。




教训:

1:遇到你连续做了很多半天,一天努力的问题是,你要做的不是愤怒的继续搞,而是离开位置,感叹一下,这个问题很屌,我要喘口气,缓一缓,请出去玩一会儿在来。

2:问题要尽量定位,这个定位在思维定视时很难,这时你还是需要上面的,出去缓缓,让思维放开。




0 0
原创粉丝点击