记录一个调试插曲
来源:互联网 发布:大数据思维 编辑:程序博客网 时间: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:问题要尽量定位,这个定位在思维定视时很难,这时你还是需要上面的,出去缓缓,让思维放开。
- 记录一个调试插曲
- 一个生活插曲
- 今天的一个插曲
- 记录一个html调试语句
- 插曲
- 插曲
- 我学习上的一个小插曲
- 关于 narrator.dll 的一个小插曲
- Linux 2.6.39-rc3的一个插曲
- Linux 2.6.39-rc3的一个插曲
- 记录一个PL/SQL调试语句
- 线程调试,关于《FreeImage使用中的小插曲》!
- 2012年10月26日 BUG调试小插曲
- mapX记录插曲-制作背景透明的bmp图片
- 对象指针创建时的一个小插曲
- mahout数据承载之FileDataModel的一个小插曲
- 十月份英语学习——出现了一个小插曲
- go语言学习道路(插曲)-一个疑惑的问题
- HDU1827-传递的最小花费
- 安全行车就靠它 教你维护汽车制动系统
- 继续畅通工程【最小生成树】
- CSS3 RGBA
- Longest Ordered Subsequence(POJ-2533)
- 记录一个调试插曲
- Kotlin的一点学习资源
- 算法--倒序打印链表--java
- hadoop伪分布式配置
- 手机移动端选择插件 mobileSelect.js
- python字符串查找之 find和index方法
- 【Leetcode】190. 7. reverse bits, integer
- stl string和vector
- 深入浅出RxJava_05[转换操作&数学运算]