Other Parts Discussed in Thread: OPT3001, SYSCONFIG, MSPM0C1104, MSPM0C1106
器件型号: MSPM0C1104
Thread 中讨论的其他器件: SysConfig、 MSPM0C1106、OPT3001、 HDC2010
我们正在尝试错误 I2C、因为 SCL 保持高电平且 SDA 斜升为低电平、猜测时钟未被配置。
请建议解决方案。
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.
Other Parts Discussed in Thread: OPT3001, SYSCONFIG, MSPM0C1104, MSPM0C1106
器件型号: MSPM0C1104
Thread 中讨论的其他器件: SysConfig、 MSPM0C1106、OPT3001、 HDC2010
我们正在尝试错误 I2C、因为 SCL 保持高电平且 SDA 斜升为低电平、猜测时钟未被配置。
请建议解决方案。
尊敬的 Diego:
在示例代码 i2c_sensors_to_uart_LP_MSPM0C1104_nortos_ticlang 默认 FIFO 触发电平 被设置为 0 中、我们尝试将设置为 6、因为我们要传输 6 个字节、发现传输仅发生在 4 个字节中。
在 I2C 引脚上、SDA 保持低 SCL 高电平、未找到时钟。我们在 SCL SDA 上连接了 2.2k 上拉电阻器。
请 指南启动 I2C。
此致
Seema Joshi
尊敬的 Seema:
我从我这边尝试了这个例子,它似乎工作正常。 我尝试使用包含 6 大小消息的 SDK 示例、然后我看到了与您的行为类似的问题。 我相信您可以使用以下功能来避免此问题:
正如我所言、C1104 上的 TX FIFO 大小为 4、而不是 8。 具体来说:初始化后、我看到 CFIFOSR:TXFIFOCNT=4、而不是 8。MSPM0C1106 也是这种情况。
这与 TRM (SLAU893C) 第 16.1.2 节和图 16-1 不一致。 它与 mspm0c110x.h 中的 I2C_SYS_FENTRIES (=4) 一致
如果您尝试将 6 个字节放入 TX FIFO、其中 2 个字节将丢失、事务(如您所观察到的)将在 SCL 为低电平时挂起、等待 CPU 再提供 2 个字节。 如果您需要发送 4 个以上的字节,您将需要使用 DL_I2C_fillControllerTXFIFO () 的循环(如 Diego 所提供)。
亲爱的 迭戈、Bruce、
我们将连接 Murrata 设备 IRS-D200ST00R1。
预计会发送 18 个字节(地址 (9)+命令 (9)) 来配置传感器。
然后发送命令状态和读取
然后读取状态写入命令,读取数据。
然后是数据 写入地址、读取数据 2 次。
请告知我们是否应该 为 16 字节调用“configureTarget" 4“ 4 次、为 2 字节调用一次。?
我们正在尝试调试示例代码 i2c_sensors_to_uart.c 发现代码滞留在第 206 行
请指导解决方案。
此致
Seema Joshi
> getMeasurementFromTarget (&gTxPacketLightMeasurement[0]、I2C_TARGET_ADDRESS_OPT3001);
您是否也有板载 OPT3001? 如果没有,这将遇到一个 NACK ,这将导致程序在你提到的 delay_cycles 调用之前停止在 BKPT ()。
我建议您也删除这一行
这是我使用的项目。 我如上所述建造了它。
e2e.ti.com/.../x_2D00_i2c_5F00_sensors_5F00_to_5F00_uart_5F00_LP_5F00_MSPM0C1104.zip
尊敬的 Bruce:
在 LaunchPad 中有 20 引脚 MCU、我们在 SDA 上没有看到任何位置。
我们有 8 引脚 MCU 在那里我们看到 SDA 引脚置换 ,但 SCL 引脚保持低电平。
但在观察窗口中、我们看到 SCL 引脚状态为高电平。
我们看到了 I2C 配置窗口、我们可以将 TX FIFO 触发电平设置为最多 7 个字节。请确认 TX 缓冲区我们应该发送这么多个字节?
此致
Seema Joshi
上述工程(来自基本示例)使用 PA0/PA11、与 Launchpad 匹配。 这些引脚有上拉跳线 (2.2k);我想您提到了这些、但只是为了确保:这些跳线是否安装在您的测试用例中?
-----
在 8 引脚中[根据 SLASF90C 表 6-1]、I2C0 在 PA0/PA1 上。 值得注意的是、PA1 与 NRST 共享。 您的电路板上有复位电路吗? 硬件指南 (SLAAEG4B) 似乎没有提及此冲突、但在(此处)的论坛讨论中、建议通过排除 NRST 电路并让 I2C 上拉电阻器使 NRST 工作来处理此情况。
[我仍然卡在“为什么 SCL=2.2V?“]
-----
我不知道为什么 TRM 在 TX FIFO 大小方面存在差异。 我通过使用调试器写入 TXDATA 并观察 TXFIFOCNT 递减来发现这一点。 我还 在 mspm0c110x.h 中找到了(偶然发现)I2C_SYS_FENTRIES (=4)【尽管这不是我通常会查看的页面】。 示例 i2c_controller_rw_multibyte_poll 中还有一条注释(未详细阐述)、该注释说“此示例使用具有轮询功能的 FIFO、最大 FIFO 大小为 4。“ “那你就知道了。“
也就是说:TX FIFO 触发级别(本身)与本示例并不真正相关、因为它使用轮询。 DL_I2C_fillControllerTXFIFO () 的工作原理是写入字节、直到 TXFIFOCNT=0、因此不管(显式)FIFO 有多大。
否、我们已尝试连接 2.2K 4.7K、5.6K 至 10K
方法是切断板载跳线。
硬件
您正好有用于复位 4.7K 的上拉电阻、我们尝试并行连接 4.7K、2.2K.2k。
我不知道为什么 TRM 在 TX FIFO 大小方面存在差异。 我通过使用调试器写入 TXDATA 并观察 TXFIFOCNT 递减来发现这一点。 我还 在 mspm0c110x.h 中找到了(偶然发现)I2C_SYS_FENTRIES (=4)【尽管这不是我通常会查看的页面】。 示例 i2c_controller_rw_multibyte_poll 中还有一条注释(未详细阐述)、该注释说“此示例使用具有轮询功能的 FIFO、最大 FIFO 大小为 4。“ 很明显有人知道它
我们每次尝试使用代码 I2C 传感器向 UART 发送 2 个字节、在观察窗口中传输的校验字节、但在引脚上转换时未捕获。
也就是说:TX FIFO 触发电平(本身)与本示例并不真正相关、因为它使用轮询。 DL_I2C_fillControllerTXFIFO () 的工作原理是在 TXFIFOCNT=0 之前写入字节、因此不关心(显式)FIFO 的大小。
我们看到 FIFO 寄存器在轮询模式下仅发送最多 4 个字节。
现在、我们观察到最新更新、我们使用 4.7k 上拉电阻捕获了 9 个时钟和数据、我们尝试将<1K SCL SDA 线路降至 0V。
如果你问我,我们需要确定硬件至少是上拉 ,尝试软件或反之亦然.
我们正在尝试硬件软件的突然变化 ,不能得出结论。
如果 I2C 线路无法正常工作、在我看来、这是传感器的问题。
尊敬的 Diego:

使用 SCL SDA 上的 4.7K 上拉 、我们发现位置已连接。我们无法跟踪以下传递函数。
我们需要禁用写入器件地址、因为传感器数据表要求写入 00x 地址和数据。
此处、 I2C0_MTXDATA 显示第 4 个字节发送。
但在示波器上、我们只能捕获 90h 作为设备地址发送。
如果传感器侧 AD 引脚连接到 Vcc、则地址为 0x49、而不是 0x48。
I2C 的工作方式就是这样、在不发送目标器件地址的情况下没有机制来执行 I2C 事务。
我只找到了规范表(网页)和 AppNote DM-R23-034 (v3)、两者都没有描述协议。 DM-R23-034 描述了寄存器、这意味着它是标准的“寄存器模型“目标(发送寄存器编号字节后跟内容)、但对命令一无所知。 您是否有其他文档?
尊敬的 Bruce:
如上所述、“示波器迹线似乎显示 NACK “、我们更改了 AD 引脚连接到 GND @器件地址 48。中传感器器件的流程图
DM-R23-034 (v3) 第 11 页 显示了如何开始与 00、00.butti I2C 驱动程序 DL_I2C_startController 发送器件地址?和 tend 数据。
我不确定这就是为什么传感器会回复 NACK。
请告知我们如何在没有器件地址的情况下启动驱动程序。
此致
Seema Joshi
由于这是 I2C 不可分割的一部分、因此在不首先发送地址 (SLA) 字节的情况下无法执行 I2C 事务。 [如果需要这样说:您的代码不发送地址字节、而是由 I2C 单元自动代表您发送地址字节。]
DM-R23-034 (v3) 第 11 页(和第 2.5 节)描述了代码发送的事务级别数据。 “Write X to register A“形式的每个方向大概是一个单独的事务。
NACK 是下面的一个级别。 首先我要做的是:(1) 检查接线(再次)(2) 检查传感器 Vcc 电源(再次)。
是否使用 Murata 演示套件? 这在应用手册中提到、但我找不到有关它的更多信息。 【原理图会很有用。】
1) 上述示波器迹线似乎显示了 SCL/SDA 上的活动。 (这是一个否定的,但这算作活动。 测试条件是什么?
2) 这是你之前发布的同一个代码吗? 它仍然包含对 OPT3001 (I2C 地址 0x44) 的请求、我知道您没有这些请求。
3) 也许您发布整个工程会很有用、包括.syscfg 文件。
4) 我看不到任何超过 3 字节的传输。 您在什么情况下溢出 FIFO?
尊敬的 Bruce:
1.
2.是的! 我们通过放置断点来检查代码。
4 我们尝试调用 configurearget 的时间 超过 2 次、I2C 传输发生 在 4 个字节之后、该传输停止。
我们无法 理解原因。
e2e.ti.com/.../5432.x_2D00_i2c_5F00_sensors_5F00_to_5F00_uart_5F00_LP_5F00_MSPM0C1104.zip
由于您在 count=2 的情况下调用 configureTarget、因此我不明白为什么它会发送 4 个字节。 您是否有成功交易的范围跟踪?
听起来前两次交易成功了。 在第二个事务结束时、总线是什么样子的(在示波器上)?
您似乎(同样,他们的协议没有文档记录,因此我猜)是将寄存器 0x00 设置为 0xA0、然后设置为 0xF0。 这确实会将低位设置为 0(=活动)、但也会设置一些保留位、这可能会对目标产生干扰。 尝试将寄存器 0x00 设置为 0x00。
尊敬的 BRUCEe2e.ti.com/.../Murata_5F00_reference_5F00_SW_5F00_.zip
附件是 Murrata 的参考代码。
还随附了代码、我们试图用于 I2C。请在示波器上查看申请。 
e2e.ti.com/.../x_2D00_i2c_5F00_sensors_5F00_to_5F00_uart_5F00_LP_5F00_MSPM0C1104-_2800_2_2900_.zip
与传感器连接的 SCL SDA 引脚上有上拉 4.7K。
请帮助解决 I2C 的问题。
e2e.ti.com/.../Murata_5F00_reference_5F00_SW_5F00_.zip
请查阅

您是否相当确定范围内的这些事务属于配置、而不是(后续)获取数据?
我调整了目标地址、前 4 个配置要求与 MPR121(Adafruit 分线板)一起使用、它们都能正常运行。 当我让程序进一步运行时、我看到了几个 2 字节的事务(数据提取)、然后程序在第 200 行停止、特别是
while (DL_I2C_isControllerRXFIFOEmpty(I2C_0_INST))
;
同时尝试从 OPT3001 读取(我没有)。
我建议您删除第 264 行的呼叫、 即:
getMeasurementFromTarget(&gTxPacketLightMeasurement[0], I2C_TARGET_ADDRESS_OPT3001);
如果它现在没有妨碍你的方式,它很快就会。
尊敬的 Bruce:
谢谢! 您是对的、我们可以使用传感器在 I2C 上写入数据。
现在、若要从传感器读取状态、我们需要从传感器@目标地址 48 的状态寄存器 04 中读取状态
根据示例代码、函数计算
寄存器编号位于 gBuffer[0]中。 对于第一种调用、这是
uint8_t gTxPacketTemperatureMeasurement[I2C_TX_PACKET_SIZE_READING] = {0x00};
因此、要读取寄存器 04、您可以使用
uint8_t gTxPacketTemperatureMeasurement[I2C_TX_PACKET_SIZE_READING] = {0x04};我忘记提及我对 Murata 示例代码的调查结果:
1) 该器件实际上是一个具有 1 字节寄存器编号的标准“寄存器模型“从器件。 读取不需要重复启动。 (TI 样片不进行重复启动,因此效果很好。)
2) 没有可说明的示例寄存器值。 设置值显然通过 UART 链路接收、该链路连接到我想使用的是 GUI 或其他器件。
3) 代码进入一些麻烦,以防止设置寄存器中的“保留“位。 我无法判断这是关键还是只是“净度“、但您的代码应该避免这样做(例如,不将寄存器 00 设置为 0xA0)。