打印
[STM8]

通信时主机死机

[复制链接]
1102|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiaxw|  楼主 | 2022-7-4 20:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近使用硬件IIC通信,主机经常死在
while(I2C_SR3 & 0x02);             //等待总线空闲
此时用示波器测量DATA和CLK引脚,居然都是高电平,太诡异了。
哪位大神能给个解释?

使用特权

评论回复
沙发
jiajs| | 2022-7-4 20:47 | 只看该作者
这种循环都应加超时。

使用特权

评论回复
板凳
jiaxw|  楼主 | 2022-7-4 20:50 | 只看该作者
while(I2C_SR3 & 0x02)
     {
         i++;
         if(i > 50)
         {
             I2C_GenerateSTOP(ENABLE);
             break;
         }
     }

现在加了超时,连接还是建立不起来。串口打印出IIC_SR3寄存器值为0x02;……………………

使用特权

评论回复
地板
renyaq| | 2022-7-4 20:54 | 只看该作者
可以参考风驰的例程

使用特权

评论回复
5
jiaxw|  楼主 | 2022-7-4 20:59 | 只看该作者
加看门狗,等它死了就复位,目前只能这样了

使用特权

评论回复
6
spark周| | 2022-7-4 21:01 | 只看该作者
PDP(等离子显示面板)- 用于制造“平面”的壁式显示屏

使用特权

评论回复
7
juventus9554| | 2022-7-4 21:03 | 只看该作者

BitStatus IIC_BUSY(void)
{
         BitStatus bit_status;

       bit_status=(I2C->SR3&0X02)>>1;
          if(bit_status==1)                                    //忙
           {
             iic_bucy_count++;
         if(iic_bucy_count>5)                    //计算忙的次数
            I2C->CR2|=0X80;                                //软件复位
         if(iic_bucy_count>100)                    //计算忙的次数
           {
             I2C->CR1&=~0X01;                     // PE  off i2C
                    iic_bucy_count=0;
           }
         return 1;


这样可以解决一直处于总线已经为高电平   ,还为忙的情况  ;

使用特权

评论回复
8
pengf| | 2022-7-4 21:06 | 只看该作者
在这里有个问题:我发现用镊子触碰数据线 会引起 读寄存器忙标志为空闲,测总线上都为高电平。但就是发不出来起始位 (起始位寄存器SB=0);试过通过软件复位 和关IIC都未能解决,,这时用镊子触碰时钟又可以正常通信了。     懂的答一下。谢谢

使用特权

评论回复
9
lizye| | 2022-7-4 21:08 | 只看该作者
不会是受干扰了吧

使用特权

评论回复
10
chuxh| | 2022-7-4 21:10 | 只看该作者

I2C总线上是要有上拉电阻的。
楼主是怎么解决的呢?分享一下呗

使用特权

评论回复
11
shimx| | 2022-7-4 21:13 | 只看该作者
加超时判断

使用特权

评论回复
12
lizye| | 2022-7-4 21:15 | 只看该作者

楼主能不能告诉我一下,到底是什么问题了?我和你遇到了一样的问题

使用特权

评论回复
13
weifeng90| | 2022-7-4 21:16 | 只看该作者
用的哪个ST型号,IIC从设备是什么芯片?

使用特权

评论回复
14
pengf| | 2022-7-4 21:17 | 只看该作者
据说ST的II2C就是有bug的,模拟试了吗?

使用特权

评论回复
15
wyjie| | 2022-7-4 21:20 | 只看该作者

BitStatus IIC_BUSY(void)
{
         BitStatus bit_status;

       bit_status=(I2C->SR3&0X02)>>1;
          if(bit_status==1)                                    //忙
           {
             iic_bucy_count++;
         if(iic_bucy_count>5)                    //计算忙的次数
            I2C->CR2|=0X80;                                //软件复位
         if(iic_bucy_count>100)                    //计算忙的次数
           {
             I2C->CR1&=~0X01;                     // PE  off i2C
                    iic_bucy_count=0;
           }
         return 1;


这样可以解决一直处于总线已经为高电平   ,还为忙的情况  ;

使用特权

评论回复
16
jiahy| | 2022-7-4 21:23 | 只看该作者
缓存爆满 了吧

使用特权

评论回复
17
lizye| | 2022-7-4 21:25 | 只看该作者
有没有可能是配置问题?

使用特权

评论回复
18
午夜粪车| | 2022-7-4 21:30 | 只看该作者
用普通的io口模拟试试

使用特权

评论回复
19
dengdc| | 2022-7-4 21:32 | 只看该作者
感觉使用IIC 主机,是一件有风险的事情。。。

使用特权

评论回复
20
juventus9554| | 2022-7-4 21:34 | 只看该作者
上拉电阻的问题吧,像是驱动能力不够的问题导致的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

825

主题

9762

帖子

4

粉丝