搜索
查看: 2405|回复: 4

[求助] STM8L I2C程序第二次数据通信失败的问题

[复制链接]

该用户从未签到

1

主题

5

帖子

0

蝴蝶豆

新手上路

最后登录
2018-6-22
发表于 2017-6-21 10:23:56 | 显示全部楼层 |阅读模式
在主机速度设置为100kbps的情况下,程序调时发现相同的数据连续从主控发给从机,第一次通信能成功,第二次通信时设备地址可正常发送,从机也有应答,但当第一 byte 数据发送完成后,主机收不到从机的应答信号。 这时的SCL,SDA线被拉低。程序使用的官方SALVE示例代码,主机设备使用的是纬图的USB-I2C设备。 当把主机速度降至5kbps的情况下,通讯正常。

回复

使用道具 举报

  • TA的每日心情
    开心
    2017-12-6 11:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    49

    主题

    3724

    帖子

    429

    蝴蝶豆

    论坛元老

    最后登录
    2021-8-7
    发表于 2017-6-21 11:46:46 | 显示全部楼层
    最大的可能是从机的手册没看明白。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    5

    帖子

    0

    蝴蝶豆

    新手上路

    最后登录
    2018-6-22
     楼主| 发表于 2017-6-21 13:12:18 | 显示全部楼层
    toofree 发表于 2017-6-21 11:46
    最大的可能是从机的手册没看明白。

    出错的时候 代码执行到了 官方写的switch case 里的 default 里 查了下状态寄存器SR1 发现 RXNE 和STOPF 同时被置成1了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    5

    帖子

    0

    蝴蝶豆

    新手上路

    最后登录
    2018-6-22
     楼主| 发表于 2017-6-21 16:35:49 | 显示全部楼层

    希望这个回答能帮助到大家。我也遇到相同的问题。
    在这几天的努力下主要发现两个问题1.在传输过程中,特别当速度快的时候,当从机处于接收状态时, 有些时候,SR1寄存器中RXNE和STOPF两个状态位同时被置1,不知道这种情况是不是被允许的,然而官方给的示例代码里没有对这种状态进行处理,导致I2C传输失败;当从机处于发送状态时,SR1寄存器中BTF和TXE两个状态位同时被置1,相同的,官方给的示例代码里没有对这种状态进行处理,导致I2C传输失败。
    下面是官方给的中断中的示例代码,其中default中的内容为我修改的内容,主要是对传输过程中,SR1寄存器中有两个状态位同时被置的处理。经修改后,能正常通信。但是不知道是不是真的是这个问题,希望大虾们拍砖。
    void bsp_i2c_slave_received_for_isr(void){
            //static uint8_t a=0;
            /* Read SR2 register to get I2C error */
            if ((I2C->SR2) != 0)
            {
            /* Clears SR2 register */
            I2C->SR2 = 0;

            }
            i2c_slave.Event = I2C_GetLastEvent();
            switch (i2c_slave.Event)
            {
              /******* Slave transmitter ******/
              /* check on EV1 */
            case I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED:
              i2c_slave.Tx_Idx = 0;
              break;

              /* check on EV3 */
            case I2C_EVENT_SLAVE_BYTE_TRANSMITTING:
              /* Transmit data */
              I2C_SendData(i2c_slave.Slave_Buffer_Rx[i2c_slave.Tx_Idx++]);
              break;
              /******* Slave receiver **********/
              /* check on EV1*/
            case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED:
              break;

              /* Check on EV2*/
            case I2C_EVENT_SLAVE_BYTE_RECEIVED:
              i2c_slave.Slave_Buffer_Rx[i2c_slave.Rx_Idx++] = I2C_ReceiveData();
             
              break;

              /* Check on EV4 */
            case (I2C_EVENT_SLAVE_STOP_DETECTED):
                            /* write to CR2 to clear STOPF flag */
                            I2C->CR2 |= I2C_CR2_ACK;

              break;

            default:
              if ((I2C->SR1&0x40) != 0)
              {
              /* Clears SR2 register */
                i2c_slave.Slave_Buffer_Rx[i2c_slave.Rx_Idx++] = I2C_ReceiveData();

              }
              if ((I2C->SR1&0x04) != 0)
              {
              /* Clears SR2 register */
                I2C_SendData(i2c_slave.Slave_Buffer_Rx[i2c_slave.Tx_Idx++]);

              }
              break;
            }
            
    }
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    18

    帖子

    2

    蝴蝶豆

    初级会员

    最后登录
    2020-7-31
    发表于 2019-12-27 13:09:32 | 显示全部楼层
    昨天调STM8L的时候也发现这种现象。结合你的分析,我理解了前辈优化I2C的方法了!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

    GMT+8, 2024-5-6 13:13 , Processed in 1.157424 second(s), 34 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表