打印

GD32f303 iic从机问题请求帮忙解决

[复制链接]
1091|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
金戈骑士|  楼主 | 2022-5-23 16:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
iic从机中断中stop事件中断移植没法触发到,波形用逻辑分析仪抓取了看起来是没问题的。请问是哪里出问题了?

static int slaveI2c1Enable(struct slaveI2cBus *bus, unsigned int slaveAddr, int bEnable)
{
    if (!bEnable)
    {
        i2c_disable(I2C1);
        rcu_periph_clock_disable(RCU_I2C1);
    }
    else
    {
        /* enable GPIOB clock */
        rcu_periph_clock_enable(RCU_GPIOB);
        /* enable I2C1 clock */
        rcu_periph_clock_enable(RCU_I2C1);

        /* connect PB10 to I2C1_SCL */
        /* connect PB11 to I2C1_SDA */
        gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_10 | GPIO_PIN_11);

        /* I2C clock configure */
        i2c_clock_config(I2C1, 100000, I2C_DTCY_2);
        /* I2C address configure */
        i2c_mode_addr_config(I2C1, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, slaveAddr);
        /* enable I2C1 */
        i2c_enable(I2C1);
        /* enable acknowledge */
        i2c_ack_config(I2C1, I2C_ACK_ENABLE);

        /* enable the I2C1 interrupt */
        nvic_priority_group_set(NVIC_PRIGROUP_PRE1_SUB3);
        nvic_irq_enable(I2C1_EV_IRQn, 0, 1);
        nvic_irq_enable(I2C1_ER_IRQn, 0, 2);

        i2c_interrupt_enable(I2C1, I2C_INT_ERR);
        i2c_interrupt_enable(I2C1, I2C_INT_BUF);
        i2c_interrupt_enable(I2C1, I2C_INT_EV);
    }

    return 0;
}

void I2C1_EV_IRQHandler(void)
{

    if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_ADDSEND))
    {
        /* clear the ADDSEND bit */
        i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_ADDSEND);

        if (i2c1.start)
            i2c1.start(&i2c1);
    }
    else if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_RBNE))
    {
        /* if reception data register is not empty ,I2C1 will read a data from I2C_DATA */
        if (i2c1.rx)
            i2c1.rx(&i2c1, i2c_data_receive(I2C1));
    }
    else if ((i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_TBE)) && (!i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_AERR)))
    {
        /* send a data byte */
        unsigned char txValue = i2c1.txData ? (unsigned char)i2c1.txData(&i2c1) : 0x00;
        i2c_data_transmit(I2C1, txValue);
    }
    else if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_STPDET))
    {
        /* clear the STPDET bit */
        i2c_enable(I2C1);

        if (i2c1.stop)
            i2c1.stop(&i2c1);
    }
}

void I2C1_ER_IRQHandler(void)
{
    /* no acknowledge received */
    if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_AERR))
        i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_AERR);

    /* SMBus alert */
    if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_SMBALT))
        i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_SMBALT);

    /* bus timeout in SMBus mode */
    if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_SMBTO))
        i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_SMBTO);

    /* over-run or under-run when SCL stretch is disabled */
    if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_OUERR))
        i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_OUERR);

    /* arbitration lost */
    if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_LOSTARB))
        i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_LOSTARB);

    /* bus error */
    if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_BERR))
        i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_BERR);

    /* CRC value doesn't match */
    if (i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_PECERR))
        i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_PECERR);
}

使用特权

评论回复
沙发
金戈骑士|  楼主 | 2022-5-23 16:08 | 只看该作者
项目是使用iic从里来进行数据的收发,以stop事件来判断一次i2c读取流程结束,可是现在其余中断事件进入正常,就只有stop事件中断没有进入过,各位大佬帮忙看看

使用特权

评论回复
板凳
lvben5d| | 2022-5-24 10:34 | 只看该作者
本帖最后由 lvben5d 于 2022-5-24 12:29 编辑

官网例程 I2C做slave 看看 是否可以找到相关信息,stop中断标志位 估计就没触发吧, 如果开了stop中断的前提下, 从机模式下监测到STOP结束位 STPDET  可以看看硬件波形出来了,是否你程序硬防 没有置位!

使用特权

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

本版积分规则

2

主题

11

帖子

0

粉丝