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 支持团队:
AM2632与湿度/温度传感器(NSHT30-Q1DNR)之间的 I2C 通信会遇到问题。 如果您提供解决此问题的指导、我将不胜感激。
问题:
写作品 、但是 读取失败 :发送从地址后( R/W=1 ),传感器 ACK ,但 SCL 保持不变 低电平 .
我尝试了各种读取和写入操作、每个读取操作都具有相同的响应、因此我无法完全输出时钟
设置:
传感器: 在7位地址上 0x44 .
I2C 速度:400kHz (标准模式)。
上拉:SDA/SCL 上为4.7kΩ。
问题:
在读取期间、为什么在从器件 ACK 后 SCL 保持低电平? 这是主要配置问题还是传感器行为?
附件:
逻辑分析仪捕获(SCL_stuck.png
)。
感谢您的帮助!
此致、
ZX
您好、ZX、
如果将比特率降至100kbps、是否能够读取?
此致、
Brennan
嗨 Brennan:
我尝试过100K、但它仍然显示相同的现象。 此从器件支持高达1M 的时钟速度
此致
ZX
您好、ZX、
SysConfig 和硬件配置看起来正确。 我将在该主题中添加一位软件专家、用于进一步调查。
如果您能提供一些有关代码的详细信息、将会有所帮助。
此致、
Brennan
嗨 Brennan:
以下是我的代码、我对 SDK 的例程示例进行了一些修改
/* * Copyright (C) 2024 Texas Instruments Incorporated * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <drivers/i2c.h> #include <kernel/dpl/DebugP.h> #include "ti_drivers_config.h" #include "ti_drivers_open_close.h" #include "ti_board_open_close.h" extern uint32_t Board_i2cGetEepromDeviceAddr(void); #define I2C_READ_LEN (6U) static void i2c_read_error_handler(uint16_t sample, int32_t status); void i2c_read_main(void *arg0) { uint16_t sample; int32_t status; uint32_t i2cReadTargetAddr; uint8_t rxBuffer[I2C_READ_LEN]; uint8_t txBuffer[2]; I2C_Handle i2cHandle; I2C_Transaction i2cTransaction; Drivers_open(); Board_driversOpen(); i2cReadTargetAddr = 0x44;//Board_i2cGetEepromDeviceAddr(); i2cHandle = gI2cHandle[CONFIG_I2C0]; DebugP_log("[I2C] Read data ... !!!\r\n"); /* Set default transaction parameters */ I2C_Transaction_init(&i2cTransaction); i2cTransaction.writeBuf = txBuffer; i2cTransaction.readBuf = rxBuffer; i2cTransaction.writeCount = 2; i2cTransaction.readCount = 1; i2cTransaction.targetAddress = i2cReadTargetAddr; txBuffer[0] = 0x24; txBuffer[1] = 0x16; status = I2C_transfer(i2cHandle, &i2cTransaction); I2C_Transaction_init(&i2cTransaction); /* Override with required transaction parameters */ i2cTransaction.readBuf = rxBuffer; i2cTransaction.readCount = I2C_READ_LEN; i2cTransaction.targetAddress = i2cReadTargetAddr; /* Read 20 samples and log them */ // for(sample = 0; sample < 20; sample++) // { status = I2C_transfer(i2cHandle, &i2cTransaction); if(status == I2C_STS_SUCCESS) { DebugP_log("[I2C] Sample %u: %u\r\n", sample, rxBuffer[0]); } else { i2c_read_error_handler(sample, i2cTransaction.status); } // } DebugP_log("[I2C] Read data ... DONE !!!\r\n"); if(status == SystemP_SUCCESS) { DebugP_log("All tests have passed!!\r\n"); } else { DebugP_log("Some tests have failed!!\r\n"); } Board_driversClose(); Drivers_close(); return; } static void i2c_read_error_handler(uint16_t sample, int32_t status) { switch(status) { case I2C_STS_ERR: DebugP_logError("[I2C] Sample %u: Generic error occurred", sample); break; case I2C_STS_ERR_TIMEOUT: DebugP_logError("[I2C] Sample %u: Timeout error occurred", sample); break; case I2C_STS_ERR_NO_ACK: DebugP_logError("[I2C] Sample %u: No acknowledgement received", sample); break; case I2C_STS_ERR_ARBITRATION_LOST: DebugP_logError("[I2C] Sample %u: Arbitration lost", sample); break; case I2C_STS_ERR_BUS_BUSY: DebugP_logError("[I2C] Sample %u: Bus Bus Busy error occurred", sample); break; } return; }
期待您的回复
ZX
您好、ZX、
从我的初始分析来看、我有几个要点:
1.在你的代码中,我看到 I2C 写入操作后,你调用"I2C_Transaction_init ()"函数,并填充3个参数(目标地址, readBufa nd ReadCount )。 超时、控制器模式、状态和其他参数等其他参数采用如下所示的默认值
在调用读取操作之前、请确保正确配置 I2C 事务结构
2.我明白为什么 I2C_READ_LEN 会更改为"6"、但根据传感器的数据表、主器件应在接收到前5B 后发送 ACK、并在第6个字节后发送停止命令。 您能验证一下是否出现这种情况吗? 逻辑分析仪捕获结果 对我来说没有以高分辨率打开、因此我看不清。
3.我觉得代码中没有问题,我认为我们在正确执行读取操作方面缺少了一些步骤。
此致、
Shaunak
Shaunak 您好:
感谢您的答复。
1. 我提到了多个例程,只配置了目标器地址, readBufa 和 ReadCount、我遵循他的指示,我也配置了超时,但我没有正确地读取数据。 其他参数使用默认参数更好
当前的问题是在读取时、在发送从器件地址之后、时钟终止并变为低电平
此致
ZX
您好、ZX、
我认为问题在于 I2C 地址。 请勿将自身从器件地址设置为与总线上的任何其他从器件相同、自身从器件地址的用途是为了控制器的从模式运行、 保持其默认值或至少与总线上的任何其他从器件不同、否则 IP 将锁定
此致、
Shaunak
Shaunak 您好:
我的 IIC 总线上只有一个从器件。
我想知道这种现象是否由主机主动下拉、Ω 引起、以及原因
谢谢
ZX