起因
最近刚好在玩STM32 Arduino 的板子, 使用U8G2驱动库驱动SSD1306 i2c 的屏幕 ,开始调试一切顺利,
直到后面我无意间,碰到了i2c总线, 突然卡住了, 这也引起了我的好奇心, 一直以来使用STM32f103这颗芯片几年了, 从来没有使用过STM32得硬件I2C通讯,一直听别人说,STM32的硬件I2C垃圾,会卡死,我一直不信,现在我真碰到了, 捂脸~~, 我也是一个死脑筋的人.
找到线索
我百思不得其解,于是我仿真看了一下硬件,确实是卡死在 I2C通讯上,说实话定位没有花好久,1个小时,捂脸~~, 原来是 I2C通讯的时候屏幕的I2C把SDA数据线拉低了, 一开始我也在百度找到有人说 ,模拟I2C给一个时钟脉冲, 我试了下 好像可以,又好像不可以, 具体是因为我使用镊子把SDA脚对地短路,SDA 和 SCL短接在一起试图让它卡死, 不过好像好了一点,大概代码是这样的
pinMode(PB10,OUTPUT);
while(digitalRead(PB11)){
digitalWrite(PB10,HIGH);
delayMicroseconds(1);
digitalWrite(PB10,LOW);
delay(1);
}
i2cinit();
进一步 探索
上述方法确实能解决一部分问题但是 还是有一点会卡死 , 奔着死磕到底的精神,我又又又 去百度了[捂脸]~~, 终于又找到一个方法,不过和上述方法类似 ,
pinMode(PB10,OUTPUT);
for(int i = 0 ; i < 16 ; i ++){
digitalWrite(PB10,LOW);
delayMicroseconds(2);
digitalWrite(PB10,HIGH);
delayMicroseconds(2);
}
Wire.begin();
不过这种方法确实让我感觉更好一点,当然要感谢 我们优快云的大佬, 提供的思路;链接我贴在下面,
感谢,Hardware 大佬分享
https://blog.youkuaiyun.com/helaisun/article/details/107745934;
总结
遇到问题不要慌,先喝杯茶压压惊!