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.

[参考译文] MSP430FR2475:读取的 I2C 从器件地址未知

Guru**** 2348500 points
Other Parts Discussed in Thread: TCA9543A, TCA9534A
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1473129/msp430fr2475-unknown-i2c-slave-address-read

器件型号:MSP430FR2475
主题中讨论的其他器件:TCA9543ATCA9534A

工具与软件:

大家好、团队成员:

我正在使用 MSP430-FR-2475 MCU 作为 速度为400kHz 的 I2C 主器件、并且有一个 I2C 从器件与它连接、从器件地址未知。  

您能否提供准确的代码建议以了解此从器件的 I2C 从器件地址?

通常、我们必须提供启动 I2C、然后在循环中逐一发送地址值、并且确认的任何地址值都被视为从器件地址。 但在固件中到底是如何实现这一点我感到困惑。 您能在这里提供帮助吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您现在得到了什么结果?

    我不会看到您的代码有任何明显的错误。 我建议:

    UCB1IE = ucb1i2cie;//恢复旧的 UCB0CTL1

    在执行此操作之前可能需要输入 UCB1IFG=0之类的值、以避免错误/过时的中断指示符。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    我不知道如何使用此函数来从上述函数中获取 i2c 从器件地址。  

    我使用的是 is_slave_i2c0_present (void)函数、我使用的是该函数  UCB1I2CSA = 0xE0;  //设置从器件地址指令以获取地址、但我得到了  失败  电流。 您能否指导如何使用这些 API?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    这样,我通过递增和应用从属地址值来迭代 for()循环。 达到0x20 (十进制的32)时、成功信息会读取到调试日志中。 是否意味着 I2C 从器件地址为0x20?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、这将是原则----向每个可能的 I2C 地址发送一个空请求、并查看哪些请求被接受(确认)。 如果总线上有多个器件、每个器件都会应答。

    一些观察结果:

    1) I2C 地址只有7位、因此您的器件可能会显示两次(一次出现在0x20、一次出现在0xA0)。

    2) 2)您应该避免探测保留的地址(0x00-0x07和0x78-0x7F)、因为其中一些地址可能包含意外的结果。

    组合(1)/(2)、循环边界应为0x08-0x77。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    I2C 扩展器 TCA9543A 与 MCU MSP-2475相连。 现在 A1和 A0引脚都接地。 现在考虑数据表、地址为0xE0 (或用于读取的0xE1)。 但在我的代码中、当迭代循环时、不会检测到这个0xE0 (或0xE1)。 硬件侧的连接正确。  

    我在下面附上了 I2C 扩展器数据表。

    e2e.ti.com/.../tca9543a.pdf

    您能告诉我在这里遗漏了什么吗?

    谢谢!

    Nitish

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    I2C 地址仅为7位。 R/W 位不是地址的一部分。 [参考 I2C 规范(UM10204版本7.0)图10.]

    图12-13 (所示)实际上说明了这一点。 图14/Sec 8.6.1不正确。 如果 A0=A1=0、那么需要的地址为0x70。

    I2C 单元会忽略 I2CSA 的高位、因此如果您在那里放置0xE0、则实际上使用的是地址0x60。

    ---

    扫描 TCA9534A 后面的总线就是一种策略。 我想您可以只写入 Control=0x03和(重新) scan、但这可能会暴露地址冲突(我们假设出于某种原因而切换)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的。 那么、我应该考虑从器件地址0x70吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当 A0=A1=0时、所需的地址(扩展器本身的地址)为0x70、如图12-13所示。

    要扫描它背后的总线、你需要"知道"它在那里--根据 Adafruit 的 I2C 地址汇编、还有其他设备使用0x70-0x73:

    https://learn.adafruit.com/i2c-addresses/the-list