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.

[参考译文] MSP430FR2633:解读传感器/周期数据包。

Guru**** 2582155 points
Other Parts Discussed in Thread: MSP430FR2633, CAPTIVATE-BSWP, MSP-EXP430FR2311

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/601497/msp430fr2633-interpreting-sensor-cycle-packets

器件型号:MSP430FR2633
主题中讨论的其他器件: CAPTIVATE-BSWPMSP-EXP430FR2311

您好!


我尝试通过 I2C (批量)接口从 MSP430FR2633 MCU 读取接近传感器数据包。 我正在使用的从器件地址是0x0A。 因此、主器件(主机)发送以下序列:

[0x00][0x01] (第一个字节0x00对应于命令 ID、第二个字节0x01对应于[接近传感器]的传感器 ID)。

我使用 i2cbsl.c 中的 i2c 帮助程序函数 因此,对于上述情况,我做如下:

uint8_t writeBuffer[2]={0x00、0x01};

uint8_t readBuffer[100];

MSP430BSL_I2CWriteRead (writeBuffer、2、readBuffer、8);

尽管我在 readBuffer 中获取了一些数据、但它看起来不像预期的那样。 例如、readBuffer 中的第一个字节和第二个字节不是0x00和0x01。 下面是我得到的顺序:

18 01 00 00 00 00 F9
18 01 00 01 00 00 00 F8
08 00 00 00 00 00 00
0C 01 00 00 00 0e
08 00 01 00 00 00 01
18 01 02 00 00 00 45
08 00 02 ff 00 00 00 00
14 01 03 00 00 00 00 f0
08 00 03 ff 00 00 01

(笑声) 重复很多次…

能不能帮我理解发生了什么? 有关调试的任何提示/信息都是最受欢迎的。 我是否可以参考有关如何解读各种数据包(传感器、周期、通用等)的文档(CapTIvate 技术指南除外)。

谢谢、

桑托什。

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

    我认为您不想使用"MSP430BSL_I2CWriteRead ()"命令通过典型的 I2C 接口与传感器进行通信。 与典型的 JTAG (4线制或2线制 SBW)接口相比、BSL 接口用于通过 I2C 接口对 MSP430FR2633进行编程。 我假设 MSP430FR2633是主机、而传感器是从器件。

    我建议查看我们的 I2C 代码示例。

    此致、

    James

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

    另一个很好的参考是 MSP430TmMCU 上常见 eUSCI 和 USCI 串行通信问题解决方案 中的第5节常见 I2C 通信问题应用手册。

    此致、

    James

    MSP 客户应用

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

    此外、如果您还不了解这些示例、此处提供了 MSP430FR2633代码示例的链接。

    有四个 I2C 示例应该是非常有用的参考:

    • msp430fr243x_euscib0_i2c_10.c
    • msp430fr243x_euscib0_i2c_11.c
    • msp430fr243x_euscib0_i2c_15.c
    • msp430fr243x_euscib0_i2c_16.c

    此致、

    James

    MSP 客户应用

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

    感谢您的回答。 在本例中、主机是双核 ARM cortex A9、从机是 MSP430FR2633。 我们使用 MSP CapTIvate 开发套件(参考: www.ti.com/.../msp-capt-fr2633) 、在该套件中、我们绕过编程器卡、并使用 I2C 接口将 MSP 开发卡直接连接到我们的 ARM 开发卡。 因此、基本而言、我们的设置如下所示:

    [ARM A9 I2C 主设备]<--I2C->[MSP430FR2633]<=48引脚连接器=>[CapTIvate BSWP]

    注意:我能够使用 I2C 从地址0x80从主机 CPU 使用 BSL 序列对 MSP430FR2633 MCU 进行编程。 但是、在读取传感器数据包的情况下、我仍然能够通过 I2C 接口接收数据(正如我在最初的文章中提到的)、但我无法解释读取结果。
    因此、我的问题是我发送的序列[0x00 0x01]是否不正确(或者可能有问题)? 主器件是否应按照特定顺序从从器件读取数据包?

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

    您好!

    我将附加一个逻辑分析仪屏幕截图、其中显示了将0x00和0x01写入地址0x0A 的顺序以及发送的读取请求。 在屏幕截图中、通道0对应于 SCL、通道1对应于 SDA、通道2对应于 IRQ (即从器件到主器件)。

    此致、
    桑托什

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

    您好、Santhosh、

    感谢您的详细答复。 它可以提供有关您观察到的内容和系统外观的非常详细的信息。

    我怀疑您已经使用演示代码对 MSP430FR2633进行了编程。 因此、您观察到的通信是器件与 PC 上 CapTIvate 设计中心 GUI 之间使用的协议。 虽然所有这些数据包都包含有价值的信息、但它就像不必要地从消防软管中饮用。 设计中心 GUI 需要如此多的数据、但在您的应用中、您的主机处理器仅需要诸如"打开此按钮"、"检测到运动"等信息

    因此、我建议查看 CapTIvate 技术指南的软件库部分。 例如、讨论了一个名为'main.c'的启动应用。 基本上、该代码将在 MSP430FR2633上运行、并在传感器检测到运动时打开 LED2。 对于类似您的应用、您必须添加代码、以便根据某种类型的输入(运动、按钮按压等)通过 I2C 向主机处理器发送消息。 简单的回调函数与每个传感器相关联。

    void my_button_callback (TSENSOR* pSensor)
    {
    if (((pSensor->bSensorTouch = true)&&(pSensor->bSensorPrevTouch = false))
    {
    //按钮被按下
    //执行某些操作...
    }
    否则 if (((pSensor->bSensorTouch == false)&&(pSensor->bSensorPrevTouch == true))
    {
    //按钮被释放
    //执行某些操作...
    }
    } 

    这有道理吗?

    如果您需要实现更高级的功能、并且需要使用 CapTIvate 协议、我们可以继续深入探讨。 协议的用例(复制自 CapTIvate 技术指南中的"软件库"->"通信模块"->"协议层"部分)包括以下内容:

    1. 电容式触控开发和调优电容式触控开发和调优涉及查看来自触摸面板的实时数据并调整软件参数、以实现来自该面板上传感器的所需响应和感觉。 例如:调优电容按钮需要查看微控制器返回的有关该按钮的原始数据、并相应地调整阈值、去抖和滤波器以创建强大的用户界面。 能够在查看传感器数据的同时实时调整所有这些软件参数、而无需重新编译代码、这是极其强大的、并可缩短开发时间。 CapTIvate 协议是使用 CapTIvate 设计中心专门设计的、旨在满足这一需求。
    2. 连接主机处理器的接口大多数电容式触控用户界面都涉及一个专用微控制器来驱动触控面板、该微控制器与某种类型的主机处理器进行通信。 凭借 CapTIvate 协议的灵活性、该协议可重新用作主机处理器的接口;它可以将触摸状态、接近状态和滑块/滚轮位置流式传输到主机。
    3. 现场/系统内调试接口和调优由于 CapTIvate 协议支持读取和写入电容式触控调优参数以及实时数据流、因此当与 CapTIvate 设计中心 PC 工具配合使用时、它可能会被用作现场诊断工具。

    此致、

    James

    MSP 客户应用

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、有关传感器、周期、触控板、通用和参数数据包的更多详细信息、 如需更多信息、请查看 CapTIvate 技术指南中的"软件库"->"通信模块"->"协议层"->"数据包类型简介"部分。

    希望这对您有所帮助。

    此致、

    James

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

    尊敬的 James:

    感谢你的答复。 我将按照您的建议尝试顶级软件库和回调函数。

    此致、

    桑托什

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    听起来不错。 如果您有任何问题、请随时告诉我。

    此致、

    James

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

    感谢您以前的帮助。 我现在能够成功读取传感器数据包。 但是、我有一个新问题:
    我正在尝试通过发送一个"Parameter packet"来读取各种参数(例如 LTA filter beta、负触摸阈值等)、如 CapTIvate 用户指南中的"Parameter packet"所述、位于"Protocol lay"->"Parameter packets"下。 我使用的是默认的 i2c 从器件地址0x0A。 但是、我没有从器件获取任何 ACK。 我怀疑这可能是由于这个部件未在 MSP430代码中执行(使用图形设计 UI 生成)。
    我的问题是、这种情况是否如此、以及参数数据包传输的实现是否存在于我可以下载的某个位置?

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

    我认为这可能是由于 MSP430 SW 期望参数数据包采用"tParameterPackage"格式(即在末尾包含 SYNC、空白、长度和校验和)、并且我按照文档[cmd byte][rw][sensor_id][][][][][][][][][][][]中所述发送数据包?

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

    您好、Santhosh、

    选项1)概括而言、您实际上不需要使用与 CapTIvate 设计中心相同的协议。 您可以基于主机和 MSP430FR2633 (从器件)之间的 I2C 接口实现简单协议。 根据传感器数量和所需的测量/数据/结果、您可以获得设置数量的命令。 然后、当主机处理器发送 MSP430FR2633 (从器件)该命令时、从器件将根据接收到的命令发送适当数量的字节。 您可以利用回调函数来获取传感器数据、但必须在 MSP430FR2633上实现 I2C 协议。

    方案2)一种替代方案、可能在前期更具挑战性、但更易于使用、即利用与 CapTIvate 设计中心配合使用的 I2C 驱动器。 这样、您就可以利用设计指南中描述的参数数据包。 让我来引导您完成这个过程。

    这些步骤假设您的设计已经有一个 CapTIvate 设计中心项目、并且您的设计中的传感器已经过调优。 基本上、您需要为寄存器 I2C 设置 CapTIvate 项目、这样您就可以从主机处理器读取数据包。 由于您使用的是 MSP430FR2633和 CAPTIVATE-BSWP 面板、我们将其用作从器件。

    设置目标(从) MCU

    步骤1.

    要启用寄存器 I2C 通信、请打开 CapTIvate 设计中心控制器定制器(双击画布上的 MSP430图标)。 然后、选择"REGISTERI2C"作为通信接口。

    步骤2.

    您现在需要通过在“控制器定制器”窗口中选择“生成源代码”来更新源代码以包含此更改。 接下来、浏览到您的 CCS 项目根目录。

    步骤3.

    基本上、此更改已修改其中一个头文件、因此请重新构建包含此更新的 CCS 工程。

    步骤4.

    使用更新的项目对 CapTIvate 目标 MCU MSP430FR2633进行重新编程。 最后、终止任何调试会话。 就是这样。 CapTIvate 软件库将处理其他所有内容。

    建立 I2C 连接

    您已将主机处理器连接到目标 MCU 并具有适当的 I2C 上拉电阻器。

    启动 REGISTERI2C 通信

    在本示例中、假设 MSP43FR2311用作主机处理器。 可使用 MSP 驱动程序库软件和 CapTIvate 示例中使用的 I2C 主驱动器对其进行编程、以控制 DRV26xx 触觉传动器。 可以构建如下所示的基本环路、以从 CapTIvate 目标器件 MSP430FR2633读取数据。

    此处显示的 I2C 主驱动器调用应易于转换为终端应用中使用的任何主机驱动器。 嵌入式 Linux 主机上的 I2CTOOLS 实用程序可采用类似的方式执行对 I2C 总线的写入和读取操作。

    在此基本示例中、读取了传感器0x00的传感器数据包。 接收到的数据的第6个(最终)字节的第一个位用于打开 MSP-EXP430FR2311 LaunchPad 上的 P1.0、该 LaunchPad 控制一个 LED。 接收数据中的该位对应于 ID 为0x00的传感器的全局触摸标志。 这意味着对传感器0的任何触摸都将导致 LED 亮起。 使用 CAPTIVATE-BSWP 演示时、传感器 ID 0x00对应于按钮组传感器。

    void loop (void)
    {
    静态 uint8_t TX[16];
    静态 uint8_t rx[16];
    如果(caption=true)
    {
    捕捉=错误;
    
    TX[0]= 0x00;
    TX[1]= 0x00;
    I2CMaster_writeBuffer (0x0A、&TX[0]、2);
    I2CMaster_readBuffer (0x0A、&Rx[0]、6);
    
    IF (Rx[5]和 BIT0)
    {
    P1OUT |= BIT0;
    }
    其他
    {
    P1OUT &=~BIT0;
    }
    }
    

    我们目前正在研究一些配套资料、这些资料将说明如何执行此操作和其他操作、但遗憾的是、它们尚未发布。 希望这对您有所帮助、但如果您无法通过遵循这些指南获取数据包数据、请告诉我。

    此致、

    James

    MSP 客户应用

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

    尊敬的 James:


    感谢您提供了内容丰富的答案。 我将首先尝试选项2 (因为我将能够使用已经存在的 I2C 驱动程序)。 如果事实证明比较棘手、我也会尝试选项1。

    此致、

    桑托什

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

    我尝试了选项1 (即寄存器 i2c 模式)。 我能够发送参数读取请求命令并接收响应。 但是、数据中的所有位都是0。 我发送了各种命令并返回0、如下所示:

    55 aa 03 8d 00 00 00 00 00 00 00 00 00
    55 aa 03 82 00 00 00 00 00 00 00 00 00
    55 aa 03 84 00 00 00 00 00 00 00 00 00
    55 aa 03 85 00 00 00 00 00 00 00 00 00
    55 aa 03 86 00 00 00 00 00 00 00 00 00
    55 aa 03 87 00 00 00 00 00 00 00 00 00
    55 aa 03 88 00 00 00 00 00 00 00 00 00
    55 aa 03 89 00 00 00 00 00 00 00 00 00
    55 aa 03 8a 00 00 00 00 00 00 00 00
    55 aa 03 8b 00 00 00 00 00 00 00 00
    55 aa 03 8c 00 00 00 00 00 00 00 00 00
    55 aa 03 9b 00 00 00 00 00 00 00 00 00

    参数 值
    运行时重校准启用 False
    接近阈值 0
    近端 阈值0中的去抖
    近端 去抖阈值0
    在阈值0中轻触去抖
    触摸去抖阈值0
    传感器超时阈值 0
    计数滤波器使能 错误
    计数滤波器 β 0
    LTA 滤波器 β 0
    负触摸阈值 0

    此外、我尝试在 MSP430 (CAPT_AppStart 函数)中写入和读取一个参数数据包。 下面显示了我使用的代码片段。 结果是一样的;我只得到了一组0。
    tTLParameterAccessResult AfterParamterAccess;
    uint8_t cmdBuffer[]={0x55、0xAA、0x03、0x80、0x01、0x00、0x00、0x01、0x00、0x00、0x82、0x00};
    AfterParamterAccess = MAP_CAPT_accessSensorParameter (
    G_uiApp.pSensorList、
    (tParameterPacket*) cmdbuffer
    );
    cmdBuffer[4]= 0;
    cmdBuffer[7]= 0;
    cmdBuffer[10]= 0x80;
    AfterParamterAccess = MAP_CAPT_accessSensorParameter (
    G_uiApp.pSensorList、
    (tParameterPacket*) cmdbuffer
    );

    我想知道为什么会发生这种情况?

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

    我想知道您是否对此主题有任何更新?

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

    您好、Santhosh、

    使用 REGISTER_I2C 模式时、不需要/使用数据包标头。  这意味着、当您在主机端请求参数时、不需要 SYNC、BLANK 和 LEN 字节。  这可能是此时的问题所在。  在 REGISTER_I2C 模式下、CapTIvate 软件库会查看接收到的第一个字节并将其解释为 CMD ID。  在您的测试用例中、它会尝试将0x55解释为 CMD。  由于无法识别0x55、因此它将仅返回0x00。  例如、要请求传感器0 (传感器 ID 0x00)的传感器数据包(CMD ID 0x00)、只需写入0x00 0x00、读出传感器数据包的6个字节。

    请注意此示例中的以下重要事项:

    1. 主器件(主机)通过写入所需传感器数据包的前两个字节来请求传感器数据包。 前两个字节向从器件指示要为主机获取的数据。 传感器数据包是固定长度的数据包(始终为6字节)、用于指示传感器的一般状态。 对于按钮传感器、这包括被触摸的显性按钮等信息。 对于滑块和滚轮传感器、这包括计算得出的滑块/滚轮位置。 有关 数据包结构的详细信息、请查看 CapTIvate 协议传感器数据包说明。 基本格式如下所示:



      前两个字节(深灰色阴影)包括 CMD 字节和传感器 ID 字节。 CMD 字节指示从器件获取传感器数据包。 传感器数据包的命令 ID 为0x00。 传感器 ID 字节告诉从器件要为哪个传感器获取数据包。 在本例中、我们要求提供与按钮组传感器相对应的传感器 ID 0x00。 这是读取传感器数据包所需的两个项目。
    2. 在主机请求数据包后、主机读取数据以检索由从器件(CapTIvate)生成的整个数据包。 这意味着传感器数据包的所有6个字节都从器件中读出。 请注意、两个请求字节(CMD 字节和传感器 ID 字节)会重新发送回主机。 这样做是为了向主机确认已检索到正确的数据。 协议规范规定有效载荷字节3 (数据包的最后一个字节)包含传感器状态字节。 这表示全局触摸/接近/检测状态、全局以前的触摸状态和其他全局诊断信息。 协议规范还规定、第一个字节(字节0)包含在按钮组中被触摸的主元件。 此信息可用于提取组中最受触摸的按钮的 ID。
    3. 请注意、主机可以随时轮询从器件、而不管 CapTIvate MCU 在何处运行转换。 通常情况下、当有新样本可用时、最好读取数据。 为此、从器件和主机之间可使用数字 GPIO 引脚作为从器件向主机指示其需要注意的一种方式。 这由用户来实现、因为不同的应用具有不同的要求。 某些系统可能希望在新数据可用时标记主机;其他系统可能只希望在有人靠近面板时标记主机。 但是、其他人可能只希望在检测到确认的触摸时标记主机。

    在主机端尝试一下、让我知道这是否能为您解决问题。

    此致、

    Walter

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

    Walter 的建议是否解决了您的问题?

    此致、

    James

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

    感谢你的答复。 我尝试了沃尔特的建议、但我得到的回答看起来完全奇怪。 我发送的命令长度为3个字节:[命令 ID][0][传感器 ID],我读回7个字节。 请在下面找到我针对我之前发布的同一组参数所得到的响应。

    00 00 01 00 8e 00 00
    00 00 00 00 00 00 00
    00 00 00 00 00 00 00
    00 00关断关断
    FF ff ff ff ff ff ff ff ff ff (FF 关闭 FF ff
    FF ff ff ff ff ff ff ff ff ff (FF 关闭 FF ff
    FF ff ff ff ff ff ff ff ff ff (FF 关闭 FF ff
    FF ff ff ff ff ff ff ff ff ff (FF 关闭 FF ff
    FF ff ff ff ff ff ff ff ff ff (FF 关闭 FF ff
    FF ff ff ff ff ff ff ff ff ff (FF 关闭 FF ff
    FF ff ff ff ff ff ff ff ff ff (FF 关闭 FF ff
    FF ff ff ff ff ff ff ff ff ff (FF 关闭 FF ff

    此外、我发现 I2C 通信完全停止、总线似乎挂起。

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

    您好、Santhosh、

    您能否澄清上面捕获的哪些字节是读取字节与写入字节以及 I2C 启动/停止条件在哪里?

    Walter

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

    写入从器件地址0x0A 的字节为:[命令字节][读取/写入= 0][传感器 ID = 0](基本上是按该顺序发送的3个字节)、然后我立即从同一从器件地址读取7个字节。 我粘贴的十六进制输出是我为各种命令字节获得的结果(与我之前的回复中的顺序相同、从"运行时重校准启用"到"负触摸阈值")。

    我担心在度假的时候、我不能再做进一步的测试了。 我将在几周后回到办公室、然后我将能够恢复测试。

    此致、
    桑托什