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.

[参考译文] MSP430FR5969:构建 I2C 从机消息处理程序的最佳方法?

Guru**** 2606725 points
Other Parts Discussed in Thread: MSP430FR5969

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/647284/msp430fr5969-best-approach-for-building-i2c-slave-message-handler

器件型号:MSP430FR5969
主题中讨论的其他器件:MSP430WARE

我一直在 Lanuchpad 电路板上开发代码、到目前为止、一切都是基于 PWM 和时间的事件、因此我能够使用外设和中断服务例程(ISR)来完成工作。 我的主要功能是设置所有内容、然后进入低功耗模式。

现在、我需要开始编写 I2C 处理程序、并且我正在使用 USCI_B 外设。 我认为我可能能够按照我以前的方式构建 I2C 处理程序、但我认为代码对于通过 ISR 和其他外设进行处理而言会太复杂(DMA 是否支持 I2C 传输? 这是一种合理的方法吗?)。

为了澄清我要做的事情、我的系统中有一个标准 I2C 消息格式。 我的 MSP430将是从器件。

起始地址写入、命令(1字节)、数据(2字节)、start_repeat Addr 读取、数据(2字节)、 停下

因此、我尝试接收3个字节的信息、更改方向、并使用2个字节进行回复。 我是否需要创建一个状态机来处理此问题? 您能给我指出退出 ISR 并运行特定代码段来处理此问题、然后返回 LPM 的首选方法吗? 我正在使用 MSP430Ware Driverlib。

很抱歉、这些问题太基础了。 提前感谢您的帮助!

Paul

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

    作为从站、您无法控制主站为您执行的操作、因此您必须随时准备好处理启动/停止/读取/写入请求。 这通常意味着一个状态机、您可以将其放入中断处理程序中。

    另请参阅 实现 I2C 从器件

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

    同意、但这是我的_预期_消息、格式、所以我必须先正确! 在我能够处理所需的行为之后、我必须处理错误情况。 )

    在任何情况下、通过 Google 的快速搜索、我们得到了有关状态机和 MSP430的 TI 注意事项 :www.ti.com/.../slaa402a.pdf
    我将深入探讨这一点、并尝试使用它来解析 I2C 消息。

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

    您可能不需要努力构建正式的状态机;了解自上次启动条件以来已发送/接收的字节数就足够了:

    unsigned int bytes_sine_start;
    uint8_t command[3];
    uint8_t response [2];
    
    #pragma vector = USCI_B0_vector
    __interrupt void USCI_B0_ISR (void){
    switch (__evo_in_range (UCB0IV、0x1E)){
    USCI_I2C_UCSTTIFG 案例:
    bytes_sine_start = 0;
    中断;
    USCI_I2C_UCRXIFG0案例:
    if (bytes_sine_start < 3){
    Command[bytes_sine_start++]= UCB0RXBUF;
    if (bytes_sine_start =3){
    //填充响应
    }
    }
    中断;
    USCI_I2C_UCTXIFG0案例:
    如果(bytes_sine_start < 2)
    UCB0TXBUF = RESPONSE[bytes_sine_start++];
    其他
    UCB0TXBUF = 0xff;
    中断;
    }
    } 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢后续行动、Clemens。 这是 一个很好的中点、可以帮助我获取代码、以便它正确处理消息。  我确实注意到、ISR 中的标志会导致错误操作。 如果 UCBxIE 和 UCBxIFG 的位掩码标志与中断矢量对齐、本会很好、但正如您从下面的摘录(MSP430FR5x_6X 用户指南)中看到的、UCBxIV case 语句是不同的。 这就解释了 TI 示例代码为何始终在其 ISR 中使用显式十六进制数、而是将 IFG 名称放在注释中。

    再次感谢您向正确的方向指示! 我添加此消息是为了使找到此线程的任何其他人的完整性。

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

    请允许我引用 MSP430‍fr5969.h 的话:

    /* USCI 中断矢量 I2C 定义*/
    #define USCI_I2C_UCALIFG (0x0002) /*中断矢量:I2C 模式:UCALIFG */
    #define USCI_I2C_UCNACKIFG (0x0004) /*中断矢量:I2C 模式:UCNACKIFG */
    #define USCI_I2C_UCSTTIFG (0x0006) /*中断矢量:I2C 模式:UCSTTIFG*/
    #define USCI_I2C_UCSTPIFG (0x0008) /*中断矢量:I2C 模式:UCSTPIFG*/
    #define USCI_I2C_UCRXIFG3 (0x000A) /*中断矢量:I2C 模式:UCRXIFG3 */
    #define USCI_I2C_UCTXIFG3 (0x000C) /*中断矢量:I2C 模式:UCTXIFG3 */
    #define USCI_I2C_UCRXIFG2 (0x000E) /*中断矢量:I2C 模式:UCRXIFG2 */
    #define USCI_I2C_UCTXIFG2 (0x0010) /*中断矢量:I2C 模式:UCTXIFG2 */
    #define USCI_I2C_UCRXIFG1 (0x0012) /*中断矢量:I2C 模式:UCRXIFG1 */
    #define USCI_I2C_UCTXIFG1 (0x0014) /*中断矢量:I2C 模式:UCTXIFG1 */
    #define USCI_I2C_UCRXIFG0 (0x0016) /*中断矢量:I2C 模式:UCRXIFG0 */
    #define USCI_I2C_UCTXIFG0 (0x0018) /*中断矢量:I2C 模式:UCTXIFG0 */
    #define USCI_I2C_UCBCNTIFG (0x001A) /*中断矢量:I2C 模式:UCBCNTIFG */
    #define USCI_I2C_UCCLTOIFG (0x001C) /*中断矢量:I2C 模式:UCCLTOIFG */
    #define USCI_I2C_UCBIT9IFG (0x001E) /*中断矢量:I2C 模式:UCBIT9IFG *
    
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    啊,哈! 你是对的。 我在 eusci_b_i2c.h 中查看了一组定义、该定义重定向到 msp430fr5969.h、但有一组不同的#define 语句。 我同意您的代码没有错误。 但不幸的是、位掩码不相同、或者命名约定对差异不太清楚。 感谢您向我指出正确的#define 语句。

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

    您是否能够成功构建 I2C 从站消息处理程序、或者您是否仍有任何未决问题?

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

    您好 Caleb、

    我目前还未完成工作、但我已经为整体方法制定了计划。 最后、我购买了 O'Reilly 的"制造嵌入式系统"、作为对代码进行分区的正确方法的指南。 我计划编写 I2C 驱动程序、以使用 I2C 中断处理程序填充/读取读写环缓冲器。 然后使用不同的编程结构来读取消息并决定如何反应。 (可能是 main()中的循环,因为我实际上不需要超低功耗操作)。

    谢谢、

    Paul

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

    尊敬的 Paul:

    我现在将关闭此主题、但如果您在开发过程中有任何其他问题、请参阅 MSP430 MCU 上 eUSCI 和 USCI 串行通信常见问题解决方案 或回复此主题、该主题将重新打开。  

    此致、  
    Caleb Overbay