工具与软件:
您好、TI 团队。
我正在使用 MSPM0g3507控制器、用于连接 i2c 传感器、这些传感器是 SHT35和 HS300、在从该传感器获取数据之前、我想探测并检查传感器是否存在、
我已将传感器地址分别设置为0x45和0x44。
我需要写入地址并从传感器读取 ACK。 那么、我应该使用哪个驱动程序函数来捕获并返回 ACK
那么、可以使用该 ACK 来探测传感器存在吗?
此致
Prajesh karmalkar
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具与软件:
您好、TI 团队。
我正在使用 MSPM0g3507控制器、用于连接 i2c 传感器、这些传感器是 SHT35和 HS300、在从该传感器获取数据之前、我想探测并检查传感器是否存在、
我已将传感器地址分别设置为0x45和0x44。
我需要写入地址并从传感器读取 ACK。 那么、我应该使用哪个驱动程序函数来捕获并返回 ACK
那么、可以使用该 ACK 来探测传感器存在吗?
此致
Prajesh karmalkar
true
:I2C 事务成功完成。 这意味着位于指定地址(本例中为 SHT35)的器件已确认通信。 false
: I2C 事务失败。 这可能表明器件未确认该地址或 I2C 总线上出现问题。 if (I2C_transfer(i2c, &i2cTransaction))
{
// If true, the sensor acknowledged its address.
printf("SHT35 is active and responded to the address.\n");
}
else
{
// If false, the sensor did not acknowledge.
printf("SHT35 did not respond to the address. Check wiring and power.\n");
}
我没有看到 DriverLib 函数可以执行您需要的探测、因此我想您必须自己编写。
您需要的是"快速指令"。 [参考 TRM (SLAU846A)第 18.2.4.1节、接近结尾。] 这只是一个具有 START+STOP 的事务、长度为0。 也可以是读取或写入;通常这种类型的探针是通过读取完成的、但(请参阅下文)您可能需要使用写入。
我不使用 DriverLib、但我认为您可以 用类似的东西做这样的探针(未经测试):
DL_I2C_startControllerTransferAdvanced(I2C_n_INST, Target_I2C_Addr, DL_I2C_CONTROLLER_DIRECTION_TX, 0u, // Length=0 DL_I2C_CONTROLLER_START_ENABLE, DL_I2C_CONTROLLER_STOP_ENABLE , DL_I2C_CONTROLLER_ACK_DISABLE); uint32_t msr; do { msr = DL_I2C_getControllerStatus(I2C_n_INST); } while ((msr & I2C_MSR_IDLE_SET) == 0); uint32_t OK = 1; if (msr & I2C_MSR_ERR_SET) OK = 0; return(OK);
我认为您需要使用写入、因为:
1) 1)如果 SHT35获得读取请求且数据未就绪、则 SHT35将不确认[参考 SHT35数据表(版本7)第4.6节]、因此结果不明确。
2) 2)勘误表 I2C_ERR_02对作为读取的快速命令提出了严格限制。
您可能需要检查 HS300以查看是否对发送(空)写入有任何保留。
请告诉我们事实是怎样的。