打印

求I2C中断的例子,同时支持收、发。芯片是GD32F305RE

[复制链接]
727|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
changys000|  楼主 | 2020-9-9 17:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


大家好!

项目中需要把I2C0做为slave,在中断中实现收发。把固件库Example中收、发两个中断例程放到一起,并没有正常工作。
不能多次读,读一次I2C就挂了。多次写正常

求一个能工作的例程!

下面是我用的代码



uint8_t g_offset, g_val = 0x35;
uint8_t g_Rx_Buf[160], g_cnt;

void I2C0_EventIRQ_Handler(void)
{
        static uint8_t cnt = 0;
        uint8_t dat_rx, dat_tx;

    if(i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_ADDSEND)){
        /* clear the ADDSEND bit */
        i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_ADDSEND);
    }else if(i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_RBNE)){
        /* if reception data register is not empty ,I2C0 will read a data from I2C_DATA */
        dat_rx= i2c_data_receive(I2C0);                // master Tx, slave Rx
               
    } else if(i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_STPDET)){
        /* clear the STPDET bit */
        i2c_enable(I2C0);
        } else if((i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_TBE))&&(!i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_AERR))){
        /* send a data byte */
                dat_tx = g_val;
        i2c_data_transmit(I2C0, g_val++);        // slave Tx, master Rx
    }
}


使用特权

评论回复
评论
yeku 2021-4-27 16:44 回复TA
一模一样的问题, 我的MCU是GD32E230C 
沙发
嵌入小菜菜| | 2020-9-10 08:41 | 只看该作者
。断点 单步 走不了 头痛啊

使用特权

评论回复
板凳
明天真的好| | 2020-9-17 19:19 | 只看该作者
项目中需要把I2C0做为slave,在中断中实现收发。把固件库Example中收、发两个中断例程放到一起,并没有正常工作。

使用特权

评论回复
地板
名字是啥样| | 2020-9-18 09:12 | 只看该作者
里面的例子可以参考别的单片机的例子,然后进行移植,I2C最好用模拟的,没有任何可怀疑的地方。

使用特权

评论回复
评论
yeku 2021-4-27 16:38 回复TA
解决了吗?我遇到同样的问题。 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝