ST意法半导体
直播中

周煌煦

9年用户 1147经验值
私信 关注
[问答]

I2C向霍尼韦尔传感器发送测量数据包请求无效怎么解决

我似乎很难完成一个简单的 I2C 任务。我想将测量请求发送到霍尼韦尔传感器,以便它读取温度和湿度读数,这需要其数据表中的以下格式:

我一直在为我的测试代码使用以下内容:

当我读取数据时,我已经准备好接收 4 个字节的数组。我将它作为虚拟参数传递给传输函数,但将长度设置为 0,因为我们不需要为测量请求发送任何数据。
这是 I2C 线路上产生的内容。不幸的是,我工作的地方目前只有一个探头,所以我不得不分别读取 SCL 和 SDA 读数:

我将范围跟踪组合成一个图表。一切看起来都很好,直到 ACK 位之后出现一个额外的位并且在该位的开头只有一个尖峰:

就调试代码时收到的内容而言,我得到以下信息:

这实际上看起来是正确的格式,因为前两位是状态位,后两位将被忽略(“无关”位)所以它看起来像是一个有效的数据包,其中包含温度和湿度的最大传感器值(100% 和 125ºC)。
如果我第二次读取数据,我会看到状态位从 00 变为 01,这表明数据过时:

所以看起来 IC 的状态机正在工作并且它知道它正在被读取,但是测量请求数据包无效并且不会触发传感器进行读取?
电子方面,这里是原理图,I2C 线有 2.2k 上拉,与 Sparkfun 分线板相同:

与我们的电路唯一不同的是,我们在 I2C 总线上还有一个地址为 0x50 的 EEPROM,因此它不会产生干扰。
我已经在 100 和 400 kHz 下尝试了 I2C,并且尝试了上升时间、下降时间和数字滤波器设置的各种设置:

有没有人能帮忙,因为我对此完全不知所措。我已经联系了霍尼韦尔的技术支持,但没有得到他们的回应,所以这真的是我唯一的希望。

回帖(1)

刘洋

2022-12-28 14:05:17
现在已经解决了,是硬件问题!
IC 的逻辑部分很好,但传感器已损坏,因此无法进行测量,因此每个值都返回 0b11111111111111。
在拆焊我们的板载 IC 并连接Sparkfun分线板后,我设法用我的测试代码获得了合理的读数。我们怀疑是 IPA 或助焊剂。
对于与此传感器(或类似传感器)接口的任何其他人,最终代码都非常简单。
对于测量请求,我做了类似的事情:
HAL_I2C_Master_Transmit_IT(&hi2c2, (0x27 << 1), NULL, 0);
故障仍然存在,但没有引起任何问题。正如 TDK 指出的那样,它发生在 SCL 上升沿之间,因此没有影响。
为了从 IC 读取数据,我添加了一个static uint8_t sensorDataBuff[4] = {0}; 在模块范围级别上调用:
HAL_I2C_Master_Receive_IT(&hi2c2, (0x27 << 1), sensorDataBuff, sizeof(sensorDataBuff));
然后我将HAL_I2C_MasterRxCpltCallback () 添加到我的模块并解析放入 sensorDataBuff 的字节。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分