打印

GD32F450的硬件I2C主模式数据接收异常(问题已解决)

[复制链接]
414|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
muzierli|  楼主 | 2023-8-24 11:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 muzierli 于 2023-8-25 14:24 编辑

  8.25今天修改代码,意外读取到按键接口的数据,原因待分析,静待更新,心情好转,把握机会查代码去了。另外说明下硬件设计,这是一个I2C0模块用在两组IO端口上(PB6,7和PB8,9),因为用了两片AW9523,这个芯片的地址配置决定IO口的复位状态,所以由于地址配置重复的问题,分开两个线路做的,有一组平时基本不用,就是初始化和有需要时用于配置串口工作模式的,所以存在端口切换的问题。读取代码没有问题,问题应该还是在配置上,最终问题找到了,原因是端口配置,没有释放原端口与I2C模块的链接,读取到的数据是两个端口信号竞争的结果,写因为是输出没发现问题,但实际上也应该对另一片进行了操作,还要检查下,否则两片扩展芯片的数据就会乱。从这次问题来看说明只要你愿意,一个AF模块可以挂到好几个端口上,在功能不冲突的条件下可以做多路输入或输出,无时差。此问题完结。
8.24的内容如下:
硬件I2C,读取爱华AW9523灯+IO扩展,读的数总是0x00,测量波形应该是0xFF,读流程能走完就是取到的数不对,写数据正常,有没遇到类似问题的。
读代码如下:
unsigned char i2c0read(unsigned char slaveAddr,  unsigned char addr)
{
                unsigned char data;
        
    /* wait until I2C bus is idle */
    while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY));
    /* send a start condition to I2C bus */
    i2c_start_on_bus(I2C0);
    /* wait until SBSEND bit is set */
    while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND));
    /* send slave address to I2C bus */
    i2c_master_addressing(I2C0, slaveAddr, I2C_TRANSMITTER);
    /* wait until ADDSEND bit is set */
    while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND));
                /* clear ADDSEND bit */
    i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
                /* wait until the transmit data buffer is empty */
    while(!i2c_flag_get(I2C0, I2C_FLAG_TBE));
                /* register address transmission */
    i2c_data_transmit(I2C0, addr);
           /* wait until the TBE bit is set */
    while(!i2c_flag_get(I2C0, I2C_FLAG_TBE));
                /* send a restart condition to I2C bus */
          i2c_start_on_bus(I2C0);
    /* wait until SBSEND bit is set */
    while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND));
    /* send slave address to I2C bus */
    i2c_master_addressing(I2C0, slaveAddr, I2C_RECEIVER);
    /* wait until ADDSEND bit is set */
    while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND));
                /* N=1,reset ACKEN bit before clearing ADDRSEND bit */
    i2c_ack_config(I2C0, I2C_ACK_DISABLE);
                /* clear ADDSEND bit */
    i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND);
               
    /* wait until the RBNE bit is set */
    while(!i2c_flag_get(I2C0, I2C_FLAG_RBNE));
    /* read a data from I2C_DATA */
                data = i2c_data_receive(I2C0);
                /* send a stop condition to I2C bus */
    i2c_stop_on_bus(I2C0);
    /* wait until stop condition generate */
    while(I2C_CTL0(I2C0) & I2C_CTL0_STOP);
    /* enable acknowledge */
    i2c_ack_config(I2C0, I2C_ACK_ENABLE);
        
                return data;
}

使用特权

评论回复
沙发
Addition| | 2023-8-24 15:01 | 只看该作者
其实并不推荐使用硬件I2C

使用特权

评论回复
板凳
muzierli|  楼主 | 2023-8-24 16:23 | 只看该作者
本帖最后由 muzierli 于 2023-8-25 14:25 编辑

硬件I2C的意义就是给程序员找麻烦,但你花了钱不用它,心里又不爽,还想上个DMA的,都费劲。

使用特权

评论回复
地板
huwr| | 2023-8-24 19:43 | 只看该作者
这就是所谓的鸡肋

使用特权

评论回复
5
Undshing| | 2023-9-27 22:53 | 只看该作者
想用DMA吗

使用特权

评论回复
6
AloneKaven| | 2023-9-29 22:28 | 只看该作者
为什么硬件iic会有这种问题呢

使用特权

评论回复
7
AloneKaven| | 2023-9-29 22:28 | 只看该作者
这么多年就没有修复吗

使用特权

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

本版积分规则

2

主题

9

帖子

0

粉丝