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.

[参考译文] CCS/MSP430FR5738:未进入中断

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/775142/ccs-msp430fr5738-not-entering-into-interrupt

器件型号:MSP430FR5738
主题中讨论的其他器件: MSP-EXP430FR5739

工具/软件:Code Composer Studio

我使用的是 msp430fr5738微控制器、我使用示例代码进行了刷写、但它不起作用。 它在这条线路中停止了。 我还启用了中断。 如何解决此问题

#include "driverlib.h"
#include

//
#define SLAVE_ADDRESS 0x3b
unsigned char TXData =0;//指向 TX 数据的指针
unsigned char TXByteCtr;

void main (void)

//停止 WDT
WDT_A_HOLD (WDT_A_base);
//为 I2C 配置引脚
P1SEL1 |= BIT6 + BIT7;//引脚初始化

UCB0CTLW0 |= UCSWRST;//将 eUSCI_B 置于复位状态
UCB0CTLW0 |= UCMODE_3 + UCMST + UCSSEL_2 | UCTR;// I2C 主模式、SMCLk
UCB0BRW = 0x8;//波特率= SMCLK / 8
UCB0I2CSA = 0x3A;//地址从器件为48十六进制
UCB0CTLW0 &=~ UCSWRST;//清除复位寄存器
UCB0IE |= UCTXIE0 + UCNACKIE;  //发送 中断使能

while (1)

//__delay_cycles (1000);//传输之间的延迟
TXByteCtr = 1;//加载 TX 字节计数器
while (UCB0CTLW0 & UCTXSTP);//确保发送了 STOP 条件
UCB0CTLW0 |= UCTR + UCTXSTT;// I2C TX,启动条件

_bis_SR_register (CPUOFF + GIE);//输入 LPM0、带中断
//保持在 LPM0中直到所有数据
//是 TX
TXData++;//递增数据字节

#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = USCI_B0_vector
_interrupt void USCIB0_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(USCI_B0_vector)) USCIB0_ISR (void)
其他
错误编译器不受支持!
#endif

switch (__evo_in_range (UCB0IV、0x1E))

情况0x00:中断;//向量0:无中断中断中断;
情况0x02:break;
情况0x04:
UCB0CTLW0 |= UCTXSTT;//如果 NACK,则重新发送开始
中断;//向量4:NACKIFG 中断;
情况0x18:
if (TXByteCtr)//检查 TX 字节计数器

UCB0TXBUF = TXData;//加载 TX 缓冲区
TXByteCtr -;//减量 TX 字节计数器

其他

UCB0CTLW0 |= UCTXSTP;// I2C 停止条件
UCB0IFG &=~UCTXIFG;//清除 USCI_B0 TX 内部标志
_BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出 LPM0

中断;//向量26:TXIFG0中断;
默认值:break;

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

    器件型号:MSP430FR5738

    工具/软件:Code Composer Studio

    我使用的是 msp430fr5738微控制器、我使用示例代码进行了刷写、但它不起作用。 它在这一行中停止(在上面的代码在 这一行中停止,不会进入中断_bis_SR_register (CPUOFF + GIE); 。 我还启用了中断。 如何解决此问题

    #include "driverlib.h"
    #include

    //
    #define SLAVE_ADDRESS 0x3b
    unsigned char TXData =0;//指向 TX 数据的指针
    unsigned char TXByteCtr;

    void main (void)

    //停止 WDT
    WDT_A_HOLD (WDT_A_base);
    //为 I2C 配置引脚
    P1SEL1 |= BIT6 + BIT7;//引脚初始化

    UCB0CTLW0 |= UCSWRST;//将 eUSCI_B 置于复位状态
    UCB0CTLW0 |= UCMODE_3 + UCMST + UCSSEL_2 | UCTR;// I2C 主模式、SMCLk
    UCB0BRW = 0x8;//波特率= SMCLK / 8
    UCB0I2CSA = 0x3A;//地址从器件为48十六进制
    UCB0CTLW0 &=~ UCSWRST;//清除复位寄存器
    UCB0IE |= UCTXIE0 + UCNACKIE;  //发送 中断使能

    while (1)

    //__delay_cycles (1000);//传输之间的延迟
    TXByteCtr = 1;//加载 TX 字节计数器
    while (UCB0CTLW0 & UCTXSTP);//确保发送了 STOP 条件
    UCB0CTLW0 |= UCTR + UCTXSTT;// I2C TX,启动条件

    _bis_SR_register (CPUOFF + GIE);//输入 LPM0、带中断
    //保持在 LPM0中直到所有数据
    //是 TX
    TXData++;//递增数据字节

    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #pragma vector = USCI_B0_vector
    _interrupt void USCIB0_ISR (void)
    #Elif defined (_GNU_)
    void __attribute__((中断(USCI_B0_vector)) USCIB0_ISR (void)
    其他
    错误编译器不受支持!
    #endif

    switch (__evo_in_range (UCB0IV、0x1E))

    情况0x00:中断;//向量0:无中断中断中断;
    情况0x02:break;
    情况0x04:
    UCB0CTLW0 |= UCTXSTT;//如果 NACK,则重新发送开始
    中断;//向量4:NACKIFG 中断;
    情况0x18:
    if (TXByteCtr)//检查 TX 字节计数器

    UCB0TXBUF = TXData;//加载 TX 缓冲区
    TXByteCtr -;//减量 TX 字节计数器

    其他

    UCB0CTLW0 |= UCTXSTP;// I2C 停止条件
    UCB0IFG &=~UCTXIFG;//清除 USCI_B0 TX 内部标志
    _BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出 LPM0

    中断;//向量26:TXIFG0中断;
    默认值:break;

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

    请提供您所引用的特定示例代码的更多详细信息、以便我尝试重新创建问题吗? 此外、您是否对该示例进行了任何修改?

    此致、

    Matt
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    FYI 将引用相同问题的最新线程合并、因为最好的做法是在初始线程的本地问题上提供支持。 感谢您的理解。

    此致、

    Matt
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您如何知道您不会使用 ISR? 您是否在第一行设置了断点?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在 TX 中断内部放置了断点、并在调试模式下逐步执行
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我只更改了从器件地址
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    最可能的情况是:总线上拉电阻安装不正确。

    我添加了这两行(MSP-exp430fr5739)、然后进入 ISR。 (它被 NACK、当然、因为我没有连接从属设备。) 这不是一个解决办法--你真的应该有外部上拉电阻器。

    P1OUT |= BIT6|BIT7; //内部上拉
    P1REN |= BIT6|BIT7; //(仅用于演示)
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    仍然不工作、当我发送 START 信号时、UCTXIFG0该标志不会置位
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当我执行我描述的操作时、我看到 TXIFG 被置位、但 NACKIFG 优先。 然后、重新启动清除了 TXIFG。

    我不知道答案、我没有您的设备。 它在我的设备上按预期工作。

    您安装了什么上拉电阻器? 您的从器件是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的从器件是 MMA8652 (加速计)。 当我发送 START 信号时、不会发生从高电平到低电平的转换。 在 UCB0STATW 寄存器中、总线忙位为高电平。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是我的代码


    #include "driverlib.h"
    #include

    //
    #define SLAVE_ADDRESS 0x3A
    unsigned char TXData = 0; //指向 TX 数据的指针
    unsigned char TXByteCtr;

    void main (void)

    //停止 WDT
    WDT_A_HOLD (WDT_A_base);
    //为 I2C 配置引脚
    // P1OUT |= BIT6 | BIT7;
    P1REN |= BIT6 | BIT7;
    P1SEL1 |= BIT6 + BIT7; //引脚初始化

    UCB0CTLW0 |= UCSWRST; //将 eUSCI_B 置于复位状态
    UCB0CTLW0 |= UCMODE_3 + UCMST + UCSSEL_2 + UCSYNC;// I2C 主模式、SMCLk
    UCB0BRW = 0x8; //波特率= SMCLK /8
    UCB0I2CSA = SLAVE_ADDRESS; //地址从器件为3Ahex
    UCB0CTLW0 &=~ UCSWRST; //清除复位寄存器
    UCB0IE |= UCTXIE0 + UCNACKIE; //发送和 NACK 中断使能

    while (1)

    //__delay_cycles (1000); //传输之间的延迟
    TXByteCtr = 1; //加载 TX 字节计数器
    while (UCB0CTLW0和 UCTXSTP); //确保发送了停止条件
    UCB0CTLW0 |= UCTR + UCTXSTT; // I2C TX、启动条件

    _bis_SR_register (CPUOFF | GIE); //输入带中断的 LPM0
    __no_operation(); //保持在 LPM0中直到所有数据
    //是 TX
    TXData++; //递增数据字节








    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #pragma vector = USCI_B0_vector
    _interrupt void USCIB0_ISR (void)
    #Elif defined (_GNU_)
    void __attribute__((中断(USCI_B0_vector)) USCIB0_ISR (void)
    其他
    错误编译器不受支持!
    #endif

    switch (__evo_in_range (UCB0IV、0x1E))

    情况0x00:break; //向量0:无中断中断;
    情况0x02:break;
    情况0x04:
    UCB0CTLW0 |= UCTXSTT; //重新发送启动(如果 NACK)
    中断; //向量4:NACKIFG 中断;
    情况0x18:
    IF (TXByteCtr) //检查 TX 字节计数器

    UCB0TXBUF = TXData; //加载 TX 缓冲区
    TXByteCtr --; //测量 TX 字节计数器

    其他

    UCB0CTLW0 |= UCTXSTP; // I2C 停止条件
    UCB0IFG &=~UCTXIFG; //清除 USCI_B0 TX int 标志
    _BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出 LPM0

    中断; //向量26:TXIFG0中断;
    默认值:break;

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

    >#define SLAVE_ADDRESS 0x3A
    根据 MMA8652FC 数据表(修订版3.3)表1、I2C 地址为0x1D。 (R/W 位不是地址的一部分。)

    [编辑:我刚刚注意到:]

    //P1OUT |= BIT6 | BIT7;
    >P1REN |= BIT6 | BIT7;

    这会使电阻器处于某种未知状态。 使用这两行或两者都不使用(我建议"不使用")。

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

     现在也是一样的,不起作用

    #include "driverlib.h"

    #include

    //

    #define SLAVE_ADDRESS 0x1D

    unsigned char TXData = 0;           //指向 TX 数据的指针

    unsigned char TXByteCtr;

    void main (void)

      //停止 WDT

      WDT_A_HOLD (WDT_A_base);

      //为 I2C 配置引脚

      P1OUT |= BIT6 | BIT7;

      P1REN |= BIT6 | BIT7;

      P1SEL1 |= BIT6 + BIT7;          //引脚初始化

      UCB0CTLW0 |= UCSWRST;          //将 eUSCI_B 置于复位状态

      UCB0CTLW0 |= UCMODE_3 + UCMST + UCSSEL_2 + UCSYNC;// I2C 主模式、SMCLk

      UCB0BRW = 0x8;              //波特率= SMCLK /8

      UCB0I2CSA = SLAVE_ADDRESS;            //地址从器件为3Ahex

      UCB0CTLW0 &=~ UCSWRST;        //清除复位寄存器

      UCB0IE |= UCTXIE0 + UCNACKIE;      //发送和 NACK 中断使能

      while (1)

      {

     //__delay_cycles (1000);          //传输之间的延迟

      TXByteCtr = 1;              //加载 TX 字节计数器

      while (UCB0CTLW0和 UCTXSTP);       //确保发送了停止条件

      UCB0CTLW0 |= UCTR + UCTXSTT;       // I2C TX、启动条件

      _bis_SR_register (CPUOFF | GIE);    //输入 LPM0、带中断

      // __no_operation();                   //保持在 LPM0中直到所有数据

                          //是 TX

      TXData++;                //递增数据字节

      }

    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)

    #pragma vector = USCI_B0_vector

    _interrupt void USCIB0_ISR (void)

    #Elif defined (_GNU_)

    void __attribute__((中断(USCI_B0_vector)) USCIB0_ISR (void)

    其他

    错误编译器不受支持!

    #endif

     switch (__evo_in_range (UCB0IV、0x1E))

     {

        情况0x00:break;           //向量0:无中断中断;

        情况0x02:break;

        情况0x04:

         UCB0CTLW0 |= UCTXSTT;       //重新发送启动(如果 NACK)

         中断;               //向量4:NACKIFG 中断;

        情况0x18:

       IF (TXByteCtr)           //检查 TX 字节计数器

         {

          UCB0TXBUF = TXData;       //加载 TX 缓冲区

          TXByteCtr --;           //测量 TX 字节计数器

         }

         其他

         {

          UCB0CTLW0 |= UCTXSTP;      // I2C 停止条件

          UCB0IFG &=~UCTXIFG;       //清除 USCI_B0 TX int 标志

          _BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出 LPM0

         }

         中断;               //向量26:TXIFG0中断;

        默认值:break;

     }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我被更改了从器件地址
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您安装了哪种上拉电阻器?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    几天以来,我们没有收到您的意见,因此我假设您能够解决您的问题。 如果情况并非如此,请单击“这未能解决我的问题”按钮,并使用有关 Bruce 问题的更多信息和您拥有的任何其他新信息回复此主题。 如果此主题锁定、请单击"提出相关问题"按钮、然后在新主题中描述您的问题的当前状态以及您可能需要帮助我们帮助解决您的问题的任何其他详细信息。

    此致、
    Matt