打印
[技术问答]

HC32F005 I2C问题

[复制链接]
1855|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tottionly|  楼主 | 2022-11-17 11:07 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
HC32F005, 参考hc32f005_ddl_Rev1.9.0 Lite的i2c_bl24c08_poll, 请教个问题:
如果往BL24C08写一个字节,时序是这样的:

我理解的状态跳转是从0x08 => 0x18=>0x28=>产生stop位,对吗?
如果理解正确,那么产生stop位是在哪里实现的?代码中I2C_SetFunc(I2CX,I2cStop_En)执行条件:
1. 进入0x30状态。但进入0x30的条件是收到从机NACK,这里不满足。
2. 满足u8i>u32Len。但只写了1个字节,u8i=1, u32Len=1,不满足。
en_result_t I2C_MasterWriteData(M0P_I2C_TypeDef* I2CX,uint8_t u8Addr,uint8_t *pu8Data,uint32_t u32Len)
{
    en_result_t enRet = Error;
    uint8_t u8i=0,u8State;
    I2C_SetFunc(I2CX,I2cStart_En);
    while(1)
    {
        while(0 == I2C_GetIrq(I2CX))
        {;}
        u8State = I2C_GetState(I2CX);
        switch(u8State)
        {
            case 0x08:                               ///< 已发送起始条件
                I2C_ClearFunc(I2CX,I2cStart_En);
                I2C_WriteByte(I2CX,I2C_SLAVEADDR);   ///< 从设备地址发送
                break;
            case 0x18:                               ///< 已发送SLA+W,并接收到ACK
                I2C_WriteByte(I2CX,u8Addr);          ///< 从设备内存地址发送
                break;
            case 0x28:                               ///< 上一次发送数据后接收到ACK
                I2C_WriteByte(I2CX,pu8Data[u8i++]);  ///< 继续发送数据
                break;
            case 0x20:                               ///< 上一次发送SLA+W后,收到NACK
            case 0x38:                               ///< 上一次在SLA+读或写时丢失仲裁
                I2C_SetFunc(I2CX,I2cStart_En);       ///< 当I2C总线空闲时发送起始条件
                break;
            case 0x30:                               ///< 已发送I2Cx_DATA中的数据,收到NACK,将传输一个STOP条件
                I2C_SetFunc(I2CX,I2cStop_En);        ///< 发送停止条件
                break;
            default:
                break;
        }
        if(u8i>u32Len)
        {
            I2C_SetFunc(I2CX,I2cStop_En);            ///< 此顺序不能调换,出停止条件
            I2C_ClearIrq(I2CX);
            break;
        }
        I2C_ClearIrq(I2CX);                          ///< 清除中断状态标志位
    }
    enRet = Ok;
    return enRet;
}


9363563759bca9a4f5.png (169.15 KB )

9363563759bca9a4f5.png

1920463759bf74103c.png (89.81 KB )

1920463759bf74103c.png

使用特权

评论回复
沙发
毛大人跟班| | 2022-11-17 13:48 | 只看该作者
加我聊下  877378012

使用特权

评论回复
板凳
tottionly|  楼主 | 2022-11-17 16:09 | 只看该作者
测试后发现,即使只发一个data, 0x28这个状态也会进入两次。但0x28中的 I2C_WriteByte(I2CX,pu8Data[u8i++])并非真正将数据输出到SDA上,只有I2C_ClearIrq(I2CX)动作后,总线上才有数据输出。因此是满足u8i>u32Len后,发送了I2cStop_En。

使用特权

评论回复
地板
yizushijie| | 2022-11-21 09:59 | 只看该作者
他这里是有点问题的。

使用特权

评论回复
5
fengyun2023| | 2023-4-26 11:33 | 只看该作者
请问我从设备内存地址是16位要怎么做呢?

使用特权

评论回复
6
lisn3188| | 2023-4-28 09:20 | 只看该作者
用IO模拟吧

使用特权

评论回复
7
Henryko| | 2023-5-12 23:41 | 只看该作者
可以用软件模拟的iic

使用特权

评论回复
8
Jane0| | 2023-9-22 16:54 | 只看该作者

使用特权

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

本版积分规则

9

主题

36

帖子

1

粉丝