[技术问答] HC32F4A0硬件I2C问题

[复制链接]
 楼主| T3rra 发表于 2024-10-24 09:52 | 显示全部楼层 |阅读模式
参考的是官网下载的DDL2.2.0库里的I2C轮询例程,在I2C主机模式接收长度为1字节数据的情况下,为什么发I2C设备接收地址之前需要先发一个NACK呢?如果不发这个NACK就会返回Timeout错误,并且不上电复位就没有办法正常收发数据,各个和I2C相关的操作返回值都是Timeout错误,重新烧写也不会恢复,需要芯片断电再上电其他操作才正常。

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

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

  15.     I2C_Cmd(I2C_UNIT, ENABLE);
  16.     I2C_SWResetCmd(I2C_UNIT, ENABLE);
  17.     I2C_SWResetCmd(I2C_UNIT, DISABLE);
  18.     i32Ret = I2C_Start(I2C_UNIT, u32Timeout);
  19.     if (LL_OK == i32Ret) {
  20.         if (1UL == u32Size) {
  21. //            I2C_AckConfig(I2C_UNIT, I2C_NACK);                // 注释掉NACK进行测试
  22.         }

  23. #if (I2C_ADDR_MD == I2C_ADDR_MD_10BIT)
  24.         i32Ret = I2C_Trans10BitAddr(I2C_UNIT, u16DevAddr, I2C_DIR_RX, u32Timeout);
  25. #else
  26.         i32Ret = I2C_TransAddr(I2C_UNIT, u16DevAddr, I2C_DIR_RX, u32Timeout);
  27. #endif

  28.         if (LL_OK == i32Ret) {
  29.             i32Ret = I2C_MasterReceiveDataAndStop(I2C_UNIT, au8Data, u32Size, u32Timeout);
  30.         }

  31.         I2C_AckConfig(I2C_UNIT, I2C_ACK);
  32.     }

  33.     if (LL_OK != i32Ret) {
  34.         (void)I2C_Stop(I2C_UNIT, u32Timeout);
  35.     }
  36.     I2C_Cmd(I2C_UNIT, DISABLE);
  37.     return i32Ret;
  38. }
p0gon9y 发表于 2024-11-11 23:36 | 显示全部楼层
在I2C通信中,NACK(非应答)信号通常用于表示接收方没有正确接收到数据或者接收方不希望继续接收数据。

q1d0mnx 发表于 2024-11-12 08:12 | 显示全部楼层
在你的情况下,发送I2C设备接收地址之前需要先发送一个NACK,这可能与I2C总线的状态和设备的特定行为有关。

q1ngt12 发表于 2024-11-12 09:18 | 显示全部楼层
在I2C通信中,总线状态的管理非常重要。如果总线状态不正确,可能会导致通信失败。

su1yirg 发表于 2024-11-12 10:36 | 显示全部楼层
在发送I2C设备接收地址之前,确保I2C总线状态已经正确初始化。

suw12q 发表于 2024-11-12 11:11 | 显示全部楼层
如果总线上有多个设备同时发送数据,可能会导致总线冲突,从而导致通信失败。

t1ngus4 发表于 2024-11-12 12:51 | 显示全部楼层
某些I2C设备在接收数据之前可能需要特定的初始化步骤。例如,设备可能需要在接收数据之前发送一个NACK信号,以确保设备处于正确的状态。

tax2r6c 发表于 2024-11-12 13:33 | 显示全部楼层
如果重新烧写固件和断电复位都无法解决问题,可能是硬件问题。

w2nme1ai7 发表于 2024-11-12 14:55 | 显示全部楼层
I2C总线连接,确保I2C总线的连接正确,没有短路或断路。

zhizia4f 发表于 2024-11-12 16:16 | 显示全部楼层
如果软件实现有问题,也可能导致通信失败。

d1ng2x 发表于 2024-11-12 17:17 | 显示全部楼层
确保I2C初始化代码正确,包括时钟配置、引脚配置等
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

11

帖子

0

粉丝
快速回复 返回顶部 返回列表