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.

[参考译文] MSP430FR2355:将 MSP430配置为寄存器读取或写入的从器件

Guru**** 2538930 points
Other Parts Discussed in Thread: MSP430FR2355, HDC2010

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1002291/msp430fr2355-configuring-msp430-as-slave-for-a-register-read-or-write

器件型号:MSP430FR2355
主题中讨论的其他部件:MSPWAREHDC2010

我一直在浏览文档和论坛、但无法解决以下编程问题:

我想将 FR2355配置为从设备。 主器件(也是用于开发的 MSP430 Launchpad)应能够读取从器件上的各个数据寄存器并向其写入数据。 看起来、从中断矢量必须足够灵活、以便了解主器件是使用 UCTR 置位还是未置位对其进行寻址、例如从寄存器写入或读取数据。 接收到的数据的第一个字节始终是寄存器地址。 如果主器件正在读取该寄存器、代码应指向该寄存器并将其值加载到 UCB0TXBUF 中。 这有时是通过重复启动来处理的。 但是、如果主器件对寄存器以及之后的寄存器进行过写操作、则代码必须收集此数据并使用 UCB0RXBUF 进行解析。 它确实需要有分支功能。

我认为这可以由 MSPWare 驱动程序库中的固件来处理、但我想在注册表级别实现它、以便我了解正在发生的情况。 是否提供了说明如何执行此操作的文档或代码示例?

是否最好在 RAM 中设置独立的寄存器以进行写入和读取?

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

    尊敬的 Mike:

    您可以在 TI Resource Explorer 中的 Code Composer Studio (CCS)内或 dev.ti.com/tirex 上查看 I2C 代码示例。 这里 是 I2C 寄存器级示例的直接链接。 此外、MSP430FR2355用户指南将是您开发的重要参考。 另一个很好的资源是 《MSP430 MCU 上常见 eUSCI 和 USCI 串行通信问题的解决 方案》应用手册。 MSP Academy 中的 I2C 简介 也可能对您有所帮助。

    我希望这能让您入门。

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

    促使我首次发布帖子的一个特定困惑点是 TI 的 I2C 协议文档、如 slva704中所述;链接如下: https://www.ti.com/lit/an/slva704/slva704.pdf

    第3.2节说明了如何从从从器件读取数据字节。 主器件发送从器件地址和 R/W 位清零的起始值、然后发送所需寄存器地址和 R/W 设置的起始值。 从器件用适当的数据字节进行响应。 TI 的常用温度湿度传感器 HDC2010通过这种方式进行访问、但可能无法访问其他 I2C 外设。 由于 MSP430使用数据缓冲器和中断在 I2C 上实现数据传输、因此将其配置为 slva704中所述协议的从站时似乎需要少量编码、 即从器件指向随后读取的寄存器地址的位置。 我在 MSPWare 中找不到任何有用的东西、但我自己能够编写一些与 MSP430FR2355 Launchpad 兼容的从代码。

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

    我认为它们的功能是相同的、我认为 SLVA704中的图比 MSP430FR2355用户指南中所示的图好一点。

    SLVA704表明、地址中的最高有效位实际上是位6、而不是位7 (假设8位地址中的最低有效位为0)。 MSP430FR2355用户指南在 UCBxI2CSA 寄存器的说明中提到了这一点。

    代码示例也应以这种方式工作、如果您使用逻辑分析仪捕获 I2C 通信、则应看到从地址基本上向左移动1位。

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

    [由于某种原因、我无法使用您的链接或通过在 TI.com 上搜索("失败-服务器问题")打开该 PDF 、因此我不知道它的内容。]

    我曾经在一个较大实验中编写过一个非常简单的 I2C 从器件。 它有3个状态段:计数器、索引和阵列[32]。

    它响应了3个中断:

    STTIFG:设置计数器= 0

    RXIFG:IF (计数器=0)索引= RXBUF;否则数组[Index++]= RXBUF;++Counter;

    TXIFG:TXBUF =阵列[Index++];

    欧洲通信公司完成了所有其他工作。

    它实现了我的目标、但由于没有与 Array[]关联的语义、因此非常无聊。 考虑到 I2C 中的固有流量控制、我可以想象将其扩展为执行有趣的操作。

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

    这基本上就是我所做的、将字节计数器放置在 RX 和 TX 中断内。 我需要从/向 MSP430从器件读取和写入字节、因此我使用接收缓冲器、对其进行检查、然后决定执行什么操作。 我还将为主器件指定的数据加载到第二个数组中、主器件可以通过发送 R/W 位设置的从器件地址随时检索该数组。

    我正在开发一个低功耗应用程序,因此我必须在总线两侧获得中断,以便能够很好地与 LPM*配合使用。 这就是我使用各种 I2C 寄存器而不是用于此目的的不透明宏命令的原因。

    我的 slva704问题是未配置7位从地址。 它使用数据寄存器地址、如该文档的第3.2节所示。 我发现在数组中放置字节并使用指针访问字节更加透明、但可能我缺少一些内容。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="178960" URL"~/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1002291/msp430fr2355-configuring-msp430-as-slave-for-a-register-read-or-write/3706949 #3706949"]由于 MSP430使用数据缓冲区和中断在 I2C 上实现数据传输、因此将其配置为 slva704中所述协议的从站所需的编码似乎非常小、 即从器件指向随后读取的寄存器地址的位置。
    Unknown 说:
    我的 slva704问题未配置7位从器件地址。 它使用数据寄存器地址、如该文档的第3.2节所示。 我发现将字节放置在数组中并使用指针访问它们要更加透明、但可能缺少一些内容。

    我确实想指出的 是、SLVA704中第3.2节中的图9是由 I2C Academy 中"逻辑探头捕获"部分中的"读取操作范围"屏幕截图展示的(如上所链接)。  此示例使用 I2C 标准主设备和从设备代码示例。 对于主器件的读取操作、主器件向从器件发送从器件地址。 从器件确认后、会向从器件发送一条示例命令(用于演示寄存器地址)。 接下来、主器件将再次向从器件发送从器件地址、后跟与先前接收到的示例命令相关联的数据字节。 请注意、eUSCI 模块自动处理从器件地址和 R/W 位(不在您的方法等代码中手动检查)、从器件的状态机根据接收到的命令确定如何响应。 虽然这些示例确实使用了多个函数、但这些函数内的代码是寄存器级的。

    您的方法很有道理、听起来好像您在正确的轨道上。 将 MSP430配置为从器件是有利的、因为您可以编写完全符合您的要求的代码。 但是、这种灵活性也可能更具挑战性、因为与具有已定义寄存器的 HDC2010等固定功能器件相比、它的开放性更强。

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

    我看了 I2C Academy 中链接的示例。 宏会调用其他函数、它需要一些解压缩才能看到发生了什么情况。 我的 MSP430从应用无法按原样使用这些宏、因为它是在一个定时循环中收集数据、并且我需要持续启用 UCRXIE0和 UCTXIE0中断。 具体而言、我希望主器件能够随时从从从器件检索数据、例如与定时从器件操作异步。 所有信号处理都在从器件上进行、但我始终在一个阵列中加载状态字节、主器件可以根据需要检索和读取这些字节。 我还需要根据条件将从器件移入和移出 LPM3或 LPM4。 主器件从 LPM4唤醒 MSP430从器件的能力是一项非常好的功能。

    无论如何、我认为 MSP430从器件已根据我的需求进行了适当配置。 我感谢你的帮助。