打印
[技术问答]

HC32F4A0硬件I2C问题

[复制链接]
1652|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
T3rra|  楼主 | 2024-10-24 09:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
参考的是官网下载的DDL2.2.0库里的I2C轮询例程,在I2C主机模式接收长度为1字节数据的情况下,为什么发I2C设备接收地址之前需要先发一个NACK呢?如果不发这个NACK就会返回Timeout错误,并且不上电复位就没有办法正常收发数据,各个和I2C相关的操作返回值都是Timeout错误,重新烧写也不会恢复,需要芯片断电再上电其他操作才正常。

下面这个是官方库的接收代码

/** 主机接受数据
* [url=home.php?mod=space&uid=247401]@brief[/url]  Master receive data
*
* @param  [in] u16DevAddr          The slave address
* @param  [in] au8Data             The data array
* @param  [in] u32Size             Data size
* @param  [in] u32Timeout          Time out count
* @retval int32_t:
*            - LL_OK:              Success
*            - LL_ERR_TIMEOUT:     Time out
*/
static int32_t I2C_Master_Receive(uint16_t u16DevAddr, uint8_t au8Data[], uint32_t u32Size, uint32_t u32Timeout)
{
    int32_t i32Ret;

    I2C_Cmd(I2C_UNIT, ENABLE);
    I2C_SWResetCmd(I2C_UNIT, ENABLE);
    I2C_SWResetCmd(I2C_UNIT, DISABLE);
    i32Ret = I2C_Start(I2C_UNIT, u32Timeout);
    if (LL_OK == i32Ret) {
        if (1UL == u32Size) {
//            I2C_AckConfig(I2C_UNIT, I2C_NACK);                // 注释掉NACK进行测试
        }

#if (I2C_ADDR_MD == I2C_ADDR_MD_10BIT)
        i32Ret = I2C_Trans10BitAddr(I2C_UNIT, u16DevAddr, I2C_DIR_RX, u32Timeout);
#else
        i32Ret = I2C_TransAddr(I2C_UNIT, u16DevAddr, I2C_DIR_RX, u32Timeout);
#endif

        if (LL_OK == i32Ret) {
            i32Ret = I2C_MasterReceiveDataAndStop(I2C_UNIT, au8Data, u32Size, u32Timeout);
        }

        I2C_AckConfig(I2C_UNIT, I2C_ACK);
    }

    if (LL_OK != i32Ret) {
        (void)I2C_Stop(I2C_UNIT, u32Timeout);
    }
    I2C_Cmd(I2C_UNIT, DISABLE);
    return i32Ret;
}

使用特权

评论回复
沙发
p0gon9y| | 2024-11-11 23:36 | 只看该作者
在I2C通信中,NACK(非应答)信号通常用于表示接收方没有正确接收到数据或者接收方不希望继续接收数据。

使用特权

评论回复
板凳
q1d0mnx| | 2024-11-12 08:12 | 只看该作者
在你的情况下,发送I2C设备接收地址之前需要先发送一个NACK,这可能与I2C总线的状态和设备的特定行为有关。

使用特权

评论回复
地板
q1ngt12| | 2024-11-12 09:18 | 只看该作者
在I2C通信中,总线状态的管理非常重要。如果总线状态不正确,可能会导致通信失败。

使用特权

评论回复
5
su1yirg| | 2024-11-12 10:36 | 只看该作者
在发送I2C设备接收地址之前,确保I2C总线状态已经正确初始化。

使用特权

评论回复
6
suw12q| | 2024-11-12 11:11 | 只看该作者
如果总线上有多个设备同时发送数据,可能会导致总线冲突,从而导致通信失败。

使用特权

评论回复
7
t1ngus4| | 2024-11-12 12:51 | 只看该作者
某些I2C设备在接收数据之前可能需要特定的初始化步骤。例如,设备可能需要在接收数据之前发送一个NACK信号,以确保设备处于正确的状态。

使用特权

评论回复
8
tax2r6c| | 2024-11-12 13:33 | 只看该作者
如果重新烧写固件和断电复位都无法解决问题,可能是硬件问题。

使用特权

评论回复
9
w2nme1ai7| | 2024-11-12 14:55 | 只看该作者
I2C总线连接,确保I2C总线的连接正确,没有短路或断路。

使用特权

评论回复
10
zhizia4f| | 2024-11-12 16:16 | 只看该作者
如果软件实现有问题,也可能导致通信失败。

使用特权

评论回复
11
d1ng2x| | 2024-11-12 17:17 | 只看该作者
确保I2C初始化代码正确,包括时钟配置、引脚配置等

使用特权

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

本版积分规则

3

主题

11

帖子

0

粉丝