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.

[参考译文] MSP430FR5994:未触发中断。

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1042620/msp430fr5994-interrupt-was-not-triggered

器件型号:MSP430FR5994

您好!

我正在使用 Adafruit ADXL345加速计、问题是有时会触发中断以获取值、有时不会触发中断。 也就是说、它根本不会进入中断子例程。

为了接收 ODR (输出数据速率)、我们需要启用最低100kHz 的频率、FAST 为400kHz。 在这里、我启用 UCB2BRW = 2.5时钟为1MHz。 因此、1MHz/2.5 = 400kHz I AM 设置。  

我仍然面临着这个问题。 我想知道我的问题所在。 我正在粘贴完整代码。 请帮助我解决问题。

#include
#include
#include
#include
#include
/**
 * main.c
 *
#define BMP280_ADDRESS 0x53
int m=0;
uint16_t BW_RATE [2]={0x2C、0x0F};
uint16_t POWER_CTL[2]={0x2D、0x08};
uint16_t Data_Format[2]={0x31、0x03};
uint16_t x1、y1、z1;
浮点 x2、Y2、Z2;
unsigned int OFCount;
uint16_t x、y、z=0;
int16_t XF、yf、ZF=0;
float xa、ya、za=0;
float f = 9.807;
uint8_t ADXL_ID=0;
uint16_t mBuffer[3];
uint8_t rxData=0;
int i、Index = 0、trans = 0、d = 500;
uint8_t nack_received;
uint8_t rxCount;
uint16_t rxBuffer[6];
uint8_t txCount;
uint16_t *txBuffer;
int clock_timeout=0;
uint8_t rx_data=2;
uint8_t str[4];


void i2cConfig (uint8_t stop_count)

   UCB2CTLW0 = UCSWRST;       //为 CONFIG 重置 I2C 接口
   UCB2CTLW0 =                // USCI - B2配置寄存器*/
                   UCMST        |//主控模式
                   UCSYNC       |//同步模式
                   UCMODE_3     |// I2C 模式
                   UCSSEL__SMCLK |//选择 SMCLK
                   UCTR         |//发送器模式
                   UCSWRST      |//不释放复位(尚未)
                   0;
       UCB2CTLW1 =
                   UCCLTO_1     |//时钟低电平超时选择(28ms)
                   UCASTP_2     |//自动停止条件生成(已启用)
                   UCGLIT_0     |//去毛刺脉冲时间(50ns)
                   0;
       UCB2TBCNT = STOP_COUNT;
       UCB2BRW = 2.5;              //位时钟分频器1M/2.5 = 400kHz
       UCB2CTLW0 &=~UCSWRST;     //清除复位位位以开始操作
       UCB2IE = UCNACKIE        |//启用 NACK 中断
                UCTXIE          |//启用 TX 中断
                UCRXIE          |//启用 RX 中断
                UCCLTOIE        |//启用时钟低电平超时中断
                0;
                           //锁定 CS


void i2cConfig_read (uint8_t stop_count)

   UCB2CTLW0 = UCSWRST;       //为 CONFIG 重置 I2C 接口
   UCB2CTLW0 =                // USCI - B2配置寄存器*/
                   UCMST        |//主控模式
                   UCSYNC       |//同步模式
                   UCMODE_3     |// I2C 模式
                   UCSSEL__SMCLK |//选择 SMCLK
                   UCTR         |//发送器模式
                   UCSWRST      |//不释放复位(尚未)
                   0;
       UCB2CTLW1 =
                   UCCLTO_1     |//时钟低电平超时选择(28ms)
                   UCASTP_0     |//自动停止条件生成(已启用)
                   UCGLIT_0     |//去毛刺脉冲时间(50ns)
                   0;
       UCB2TBCNT = STOP_COUNT;
       UCB2BRW = 2.5;              //位时钟分频器1M/2.5 = 400kHz
       UCB2CTLW0 &=~UCSWRST;     //清除复位位位以开始操作
       UCB2IE = UCNACKIE        |//启用 NACK 中断
                UCTXIE          |//启用 TX 中断
                UCRXIE          |//启用 RX 中断
                UCCLTOIE        |//启用时钟低电平超时中断
                0;


空初始化()

   //配置 GPIO
      P1OUT &=~BIT0;
      P1DIR |= BIT0;

      P6SEL1 &=(~BIT3);//为 GPIO 设置 P1.0 SEL
      P6DIR |= BIT3;//将 P1.0设置为输出
      P6OUT |= BIT3;//将 P1.0设置为高电平
      P1OUT &=~BIT1;
      P1DIR |= BIT1;

      //--setup 端口
      P7SEL1 &=~BIT1;            //P7.1 = SCL
      P7SEL0 |= BIT1;
      P7SEL1 &=~BIT0;            //P7.0 = SDA
      P7SEL0 |= BIT0;
      P7DIR &=~(BIT0 | BIT1);
      PM5CTL0 &=~LOCKLPM5;       //禁用 GPIO 上电高阻抗模式

//      //根据 MCLK 的器件数据表的要求配置一个 FRAM 等待状态
//      ////在配置时钟系统之前在8MHz 以上运行。
//      FRCTL0 = FRCTLPW | NWAITS_1;
//
//      //时钟系统设置
//      CSCTL0_H = CSKEY >> 8;                   //解锁 CS 寄存器
//      CSCTL1 = DCOFSEL_4 | DCORSEL;            //将 DCO 设置为16MHz
//      CSCTL2 = SELA_VLOCLK | SELS__DCOCLK | SELM_DCOCLK;//设置 SMCLK = MCLK = DCO、
//                                              // ACLK = VLOCLK
//      CSCTL3 = DIVA__4 | DIVM_4 | DIVM_4;  //将所有分频器设置为1以实现16MHz 运行
//      __delay_cycles (60);
//      CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1;    //设置所有分频器
//      CSCTL0_H = 0;

      i2cConfig (0x01);
      _bis_SR_register (GIE);
      _enable_interrupt ();


void transmit (uint16_t *字段、uint8_t count){
   i2cConfig (count);
   UCB2I2CSA = BMP280_ADDRESS;            //设置从器件地址
   txCount = count;
   txBuffer =字段;
   UCB2CTLW0 |= UCTR | UCTXSTT;           //作为发送器启动请求


void receive (uint16_t *字段、uint8_t 计数){
   i2cConfig (count);
   UCB2I2CSA = BMP280_ADDRESS;            //设置从器件地址
   rxCount =计数;
//   rxBuffer =字段;
   UCB2CTLW0 &=~UCTR;                    //将 I2C 总线置于接收模式
   UCB2CTLW0 |= UCTXSTT;                  //作为接收器启动请求


void write (uint8_t reg、uint8_t data){
  mBuffer[0]= reg;
  mBuffer[1]=数据;
  发送(mBuffer、2);
//  for (i=0;i<50;i++);

void read (uint16_t reg、uint8_t size){
   Transmit (Registered、1);
   接收(mBuffer、Size);


空 initTimer_A (空)

   //Timer0_A3配置
   TA0CCR0 = 62499;  //计时器计数值为0.5秒;//初始,停止计时器
   TA0CCTL0 |= CCIE;//为 CCR0启用中断。
   TA0CTL = tassel_2 + ID_0 + MC_1;//选择 SMCLK、SMCLK/1、向上计数模式


空 delayMS()

   if ((TA0CCTL0&TAIFG)!=0){   //监视标志状态
   TA0CCTL0&=~(TAIFG);  //清除标志
   }
//   OFCount = 0;//重置过流计数器
//   TA0CCR0 = 1000-1;//启动计时器,比较向上计数模式的值以获得每个循环1ms 的延迟
//   ////总计数= TACCR0 + 1。 因此、我们需要减1。
//
//   while (i<=mss);
//
//   TA0CCR0 = 0;//停止计时器




void power_cycle()

   P6OUT ^= BIT3;
   for (i=0;i<2000;i++);
   P6OUT ^= BIT3;


//定时器 ISR
#pragma vector = TIMER0_A0_vector
_interrupt void Timer_A_CCR0_ISR (void)

   OFCount++;//递增超流计数器


#pragma vector=USCI_B2_vector
_interrupt void USCIB2_ISR (void)

   uint8_t rx_val = 0;
   开关(__evo_in_range (UCB2IV、USCI_I2C_UCBIT9IFG))
 {
       案例 USCI_NONE:            //无中断中断;
           中断;
       案例 USCI_I2C_UCALIFG:     //仲裁丢失
           中断;
       案例 USCI_I2C_UCNACKIFG:   //接收到 NAK (仅限主器件)
           Nack_received = 1;
           UCB2CTLW0 |= UCTXSTP;  //当缺少应答时,从器件会得到一个停止条件
           UCB2IFG  &=~UCTXIFG;
//           Acc_initial (); //根据需要重置 MCU。
           中断;
       案例 USCI_I2C_UCRXIFG0:            // RXIFG0
           P1OUT^= BIT1;
           if (rxCount){
               RX_val = UCB2RXBUF;
               if (rxCount ==0)
               {
                   UCB2CTLW0 |= UCTXSTP;
               }
               其他
               {
                   rxBuffer[Index]= Rx_val;     //获取 RX 数据
                   索引++;
                   rxCount--;
               }
           }
           中断;
       案例 USCI_I2C_UCTXIFG0:    // TXIFG0
           P1OUT^= BIT0;
           UCB2TXBUF =*txBuffer++;
           TRANS = 1;
           中断;
       案例 USCI_I2C_UCCLTOIFG:   //时钟低电平超时-时钟保持低电平的时间过长
           Clock_timeout = 1;
           中断;
       默认值:
           中断;
 }


void UART_Int (uint8_t *头、uint8_t temp)

   int Index1=0;
   如果(温度>100)
   {
      STR[Index]=(temp / 100)+ 48;
      Indexx1++;
      STR[Index]=(temp /10)+ 48;
      Indexx1++;
      STR[Index]=(温度% 10)+ 48;
      UART_Transmit (HEAD);
      UART_Transmit (str);
      UART_TransmitOne ('\n');
      UART_TransmitOne ('\r\n');
   }
   其他
   {
      STR[索引]=(temp /10 )+48;
      索引++;
      STR[指数]=(温度% 10)+48;
      UART_Transmit (HEAD);
      UART_Transmit (str);
      UART_TransmitOne ('\n');
      UART_TransmitOne ('\r\n');
   }



void main (void)

   WDTCTL = WDTPW | WDTHOLD;  //停止看门狗计时器
   初始化();
//   initTimer_a();
//   __enable_interrupt ();
//   读取(0x00、1);
   UART_Init();
   写入(0x2D、0x08);//电源控制
   如果(TRANS_= 1)
   {
       UART_Transmit ("正在工作");
       写入(0x2C、0x0A);//数据速率
       写入(0x31、0x03);//数据格式
       TRANS = 0;
   }
   其他
   {
       power_cycle();
       UART_Transmit ("重启\n");
       写入(0x2D、0x08);//电源控制
       写入(0x2C、0x0A);//数据速率
       写入(0x31、0x03);//数据格式
   }
   while (1)
   {
       读取(0x32、2);//数据 x
       如果(nack_received = 1)
       {
           power_cycle();
           写入(0x2D、0x08);//电源控制
           写入(0x2C、0x0A);//数据速率
           写入(0x31、0x03);//数据格式
           读取(0x32、2);//数据 x
           x1 =((rxBuffer[1])<< 8)| rxBuffer[0];
           读取(0x34、2);//数据 y
           Y1 =((rxBuffer[3])<< 8)| rxBuffer[2];
           读取(0x36、2);//数据 z
           Z1 =((rxBuffer[5])<< 8)| rxBuffer[4];
       }
       其他
       {
           UART_Transmit ("正在接收\n");
           x1 =((rxBuffer[1])<< 8)| rxBuffer[0];
//           UART_Int ("x1"、x1);
           读取(0x34、2);//数据 y
           Y1 =((rxBuffer[3])<< 8)| rxBuffer[2];
//           UART_Int ("y1"、y1);
           读取(0x36、2);//数据 z
           Z1 =((rxBuffer[5])<< 8)| rxBuffer[4];
//           UART_Int ("Z1"、Z1);
       }
       X2 =((浮点) x1)* 0.004 * f;
//       delayMS (d);
       Y2 =(((float) Y1)* 0.004 * f;
//       delayMS (d);
       Z2 =((float) Z1)* 0.004 * f;
//       delayMS (d);
       UART_Int ("x2=\n"x2);
       UART_Int ("y2=\n",y2);
       UART_Int ("Z2=\n"、Z2);
       索引= 0;
//       for (m=0;m<10000;m++);
   }



我在通信之间没有使用任何延迟。

谢谢、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="496739" URL"~/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1042620/msp430fr5994-interrupt-was-not-triggered ]UCB2BRW = 2.5 [/quot]

    您不能除以非整数值、因此实际除数为2。 500kHz 时钟可能会也可能不会扰乱目标器件。

    由于 I2C 时钟与 MCLK 非常相似、因此在处理接收到的数据时必须非常快。 现在、如果您没有注释将 MCLK 设置为16MHz 的代码、您将获得两个好处。 第一个是可实现精确的400kHz I2C 时钟、第二个是 MCLK 比 I2C 时钟快得多。 放松时间。

    编辑器中有一个用于插入代码的菜单项。 使用它。

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

    感谢您的回答、我对这一行进行了注释。 我将 MCLK 设置为16MHz。 我还在示波器中进行了测试。 现在、我在示波器中检查了 i2c 时钟、得到的频率为1kHz。 但我需要400kHz 或100kHz。 请查找代码和示波器图像。

    // Clock Setup
       FRCTL0 = FRCTLPW | NWAITS_1;
       // Clock System Setup
       CSCTL0_H = CSKEY_H;                    // Unlock CS registers
       CSCTL1 = DCOFSEL_0;                     // Set DCO to 1MHz
       CSCTL2 = SELA__VLOCLK | SELS__DCOCLK | SELM__DCOCLK; // Set SMCLK = MCLK = DCO,
       CSCTL3 = DIVA__4 | DIVS__4 | DIVM__4;   // Set all corresponding clk sources to divide by 4 for errata
       CSCTL1 = DCOFSEL_4 | DCORSEL;             // Set DCO to 16MHz
       // Delay by ~10us to let DCO settle. 60 cycles = 20 cycles buffer + (10us / (1/4MHz))
       __delay_cycles(60);
       CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1;     // Set all dividers
       CSCTL0_H = 0;
    
    // i2c Configuration. 
    	UCB2CTLW0 = UCSWRST;        // Reset I2C interface for config
        UCB2CTLW0 =                 /* USCI - B2 configuration register */
                        UCMST         | // Master mode
                        UCSYNC        | // Synchronous mode
                        UCMODE_3      | // I2C mode
                        UCSSEL__SMCLK | // Select SMCLK
                        UCTR          | // Transmitter mode
                        UCSWRST       | // Don't release reset (yet)
                        0;
            UCB2CTLW1 =
                        UCCLTO_1      | // Clock low time-out select (28ms)
                        UCASTP_2      | // Automatic STOP condition generation (enabled)
                        UCGLIT_0      | // Deglitch time (50ns)
                        0;
            UCB2TBCNT = stop_count;
            UCB2BRW = 40;               // Bit clock divider 1M/2.5 = 400kHz
            UCB2CTLW0 &= ~UCSWRST;      // Clear reset bit to start operation
            UCB2IE = UCNACKIE         | // Enable Nack interrupt
                     UCTXIE           | // Enable TX interrupt
                     UCRXIE           | // Enable RX interrupt
                     UCCLTOIE         | // Enable clock low time-out interrupt
                     0;
    test

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

    void transmit(uint16_t *field, uint8_t count){
        i2cConfig(count);
        UCB2I2CSA = BMP280_ADDRESS;             // Set slave address
        txCount = count;
        txBuffer = field;
        UCB2CTLW0 |= UCTR | UCTXSTT;            // Start request as transmitter
    }

    这会启动(Tx)事务、但不会等待它完成。 对于 read(),它接下来将重置 I2C 单元(在 i2cConfig 中),该单元将终止事务。 这可能发生在第一个中断之前、也可能不会发生、但它肯定会在传输完成之前发生。 receive()执行类似的操作。

    处理这一问题的一种常见方法是进入 LPM0、并在得出结论认为事务已完成时让 ISR 执行 LPM0_EXIT。 (我建议还具有某种"I2C_Status"标志、因为唤醒可能会模糊不清。)

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

    好的、明白了。 但我这样做是因为我需要设置计数、即 UCB2TBCNT 这将针对 TX 和 Rx 进行更改。 我将再次启动。 然后、如果我在启用中断时使用 LPM0。 IE 位于此行 _bis_SR_register (LPM0 | GIE)中;类似这样。 代码在此行中停止。  

    我使用此链接作为开发参考 github.com/.../accelerometer.c。

    谢谢、

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

    重置 I2C 单元是可以的(几乎是 UCASTTP 所需的)、您只需等待事务完成即可。

    该操作的正确形式是 "_bis_SR_register (LPM0_bits | GIE);"。 您在上面输入的内容将会编译、但会出现故障。

    GitHub 代码显示为正确完成。 请特别注意 ISR 中策略性放置的"__BIC_SR_REGISTER_ON_EXIT (CPUOFF);"运算--这些是完成唤醒。

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

    好的、我将在传输后监控 UCASTP 状态。

    是的、正确的形式是_ bis_SR_register (LPM0_bits + GIE);。 正如我在前面的 msg 执行中告诉您的那样、该行中会停止执行。

    现在该怎么办?

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

    到目前为止、您有哪些产品? 您是否到达 ISR? 是否达到 WAKEUP 语句?

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

    是的、我使用__ENABLE_INTERRUPT ()到达 ISR;根据您的建议,我没有使用__bis_SR_register (LPM0_Bits + GIE); 按照建议、我使用此行 while (UCB2CTLW0 & UCTXSTP)监视事务状态; 我在 ISR 中放置了__BIC_SR_REGISTER_ON_EXIT (CPUOFF);。 不过、有时 Tx 和 Rx 中断不会触发。

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

    很抱歉、我在进行这种设置时遇到了困难。

    1) 1)设置  UCTXSTT 后、应使用" _bis_SR_register (LPM0_bits | GIE);"等待。 GitHub 代码就是这样做的。

    2) 2)当 ISR 决定事务完成(Rx 或 Tx 字节计数器= 0或 NACK)时、它应使用"__BIC_SR_REGISTER_ON_EXIT (LPM0_Bits)"唤醒 main;这就是 GitHub 代码执行该操作的方式。

    在 UCTXSTP 上旋转对于检测(完整)事务的完成不起作用、因为它仅在其中的一小部分开启。 在开始新事务之前、这种方法非常有用(额外的保险)、可确保 I2C 完全空闲。

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

    这里的情况也是如此、这会使问题发生。 正在等待使用这些行_bis_SR_register (LPM0_bits | GIE);我们还应该等待多长时间? 我等了1分钟 仍然会得到相同的误差。 我将再次附加经修改的完整代码。 请帮我解决这个问题。

    void i2cConfig(uint8_t stop_count)
    {
        UCB2CTLW0 = UCSWRST;        // Reset I2C interface for config
        UCB2CTLW0 =                 /* USCI - B2 configuration register */
                        UCMST         | // Master mode
                        UCSYNC        | // Synchronous mode
                        UCMODE_3      | // I2C mode
                        UCSSEL__SMCLK | // Select SMCLK
                        UCSWRST       | // Don't release reset (yet)
                        0;
            UCB2CTLW1 =
                        UCCLTO_1      | // Clock low time-out select (28ms)
    //                    UCASTP_2      | // Automatic STOP condition generation (enabled)
                        UCGLIT_0      | // Deglitch time (50ns)
                        0;
            UCB2TBCNT = stop_count;
            UCB2BRW = 260;               // Bit clock divider 1M/200 = 100kHz
            UCB2CTLW0 &= ~UCSWRST;      // Clear reset bit to start operation
            UCB2IE = UCNACKIE         | // Enable Nack interrupt
                     UCTXIE           | // Enable TX interrupt
                     UCRXIE           | // Enable RX interrupt
    //                 UCCLTOIE         | // Enable clock low time-out interrupt
                     0;
    }
    
    
    void transmit(uint16_t *field, uint8_t count){
        i2cConfig(count);
        UCB2I2CSA = BMP280_ADDRESS;             // Set slave address
        txCount = count;
        txBuffer = field;
        UCB2IFG &= ~(UCTXIFG + UCRXIFG);       // Clear any pending interrupts
        while (UCB2CTLW0 & UCTXSTP);
        UCB2CTLW0 |= UCTR | UCTXSTT;            // Start request as transmitter
        __bis_SR_register(CPUOFF + GIE);
    //    __enable_interrupt();
    
    }
    void receive(uint16_t *field, uint8_t count){
        i2cConfig(count);
        UCB2I2CSA = BMP280_ADDRESS;             // Set slave address
        rxCount = count;
    //    rxBuffer = field;
        UCB2IFG &= ~(UCTXIFG + UCRXIFG);       // Clear any pending interrupts
        while (UCB2CTLW0 & UCTXSTP);
        UCB2CTLW0 &= ~UCTR;                     // Put I2C bus in receive mode
        UCB2CTLW0 |= UCTXSTT;                   // Start request as a receiver
        __bis_SR_register(CPUOFF + GIE);
    //    __enable_interrupt();
    }
    void write(uint8_t reg, uint8_t data){
       while (UCB2CTLW0 & UCTXSTP);
       mBuffer[0] = reg;
       mBuffer[1] = data;
       transmit(mBuffer,2);
    }
    void read(uint16_t reg, uint8_t size){
        while (UCB2CTLW0 & UCTXSTP);
        transmit(&reg,1);
        while (UCB2CTLW0 & UCTXSTP);
        receive(mBuffer,size);
    }
    
    #pragma vector=USCI_B2_VECTOR
    __interrupt void USCIB2_ISR(void)
    {
        uint8_t rx_val = 0;
        switch(__even_in_range(UCB2IV, USCI_I2C_UCBIT9IFG))
      {
            case USCI_NONE:             // No interrupts break;
                break;
            case USCI_I2C_UCALIFG:      // Arbitration lost
                break;
            case USCI_I2C_UCNACKIFG:    // NAK received (master only)
                nack_received = 1;
                UCB2CTLW0 |= UCTXSTP;   // when an acknowledge is missing the slave gets a stop condition
                UCB2IFG   &= ~UCTXIFG;
                P1OUT^= BIT0;           //Red LED
                break;
            case USCI_I2C_UCRXIFG0:     // RXIFG0
                P1OUT^= BIT1;           //Green LED
                rx_val = UCB2RXBUF;
                if (rxCount)
                {
                    rxBuffer[Index] = rx_val;      // Get RX data
                    Index++;
                    rxCount--;
                }
                else
                {
    //                UCB2CTLW0 |= UCTXSTP;
                    UCB2IE &= ~UCRXIE;
                    __bic_SR_register_on_exit(CPUOFF);      // Exit LPM0
    //                __disable_interrupt();
                }
                rece = 1;
                break;
            case USCI_I2C_UCTXIFG0:     // TXIFG0
                if (txCount)                        // Check TX byte counter
                  {
                    UCB2TXBUF = *txBuffer++;          // Load TX buffer
                    txCount--;                        // Decrement TX byte counter
                    trans = 1;
                  }
                else
                  {
                    UCB2CTLW0 |= UCTXSTP;                    // I2C stop condition
                    UCB2IFG &= ~UCTXIFG;                     // Clear USCI_B0 TX int flag
                    __bic_SR_register_on_exit(CPUOFF);      // Exit LPM0
    //                __disable_interrupt();
                  }
                break;
            case USCI_I2C_UCCLTOIFG:    // Clock low timeout - clock held low too long
                clock_timeout = 1;
                UCB2IFG &= ~UCTXIFG;
                __bic_SR_register_on_exit(CPUOFF);
    //            __disable_interrupt();
                break;
            default:
                break;
      }
    }
    
    power_cycle(); // Power Cycling
        write(0x2D,0x08); //power control
        if (trans == success)
        {
            UART_Transmit("Working\n\r",12);
            write(0x2C,0x10); // data rate
            write(0x31,0x03); // data format
            trans = 0;
        }
        else
        {
            power_cycle();
            UART_Transmit("Power_Cycle\n\r",16);
            write(0x2D,0x08); //power control
            write(0x2C,0x10); // data rate
            write(0x31,0x03); // data format
        }
        while (1)
        {
            read(0x32,2); // Data x
            if (nack_received == 1)
            {
                nack_received = 0;
                power_cycle();
                write(0x2D,0x08); // power control
                write(0x2C,0x10); // data rate
                write(0x31,0x03); // data format
                read(0x32,2); // Data x
                x1 = ((rxBuffer[1]) << 8) | rxBuffer[0];
                read(0x34,2); // Data y
                y1 = ((rxBuffer[3]) << 8) | rxBuffer[2];
                read(0x36,2); // Data z
                z1 = ((rxBuffer[5]) << 8) | rxBuffer[4];
    
    
    
            }
            else if(rece == 1 && nack_received==0)
            {
                rece = 0;
                x1 = ((rxBuffer[1]) << 8) | rxBuffer[0];
                read(0x34,2); // Data y
                y1 = ((rxBuffer[3]) << 8) | rxBuffer[2];
                read(0x36,2); // Data z
                z1 = ((rxBuffer[5]) << 8) | rxBuffer[4];
            }
            else
            {
                power_cycle();
                write(0x2D,0x08); // power control
                write(0x2C,0x10); // data rate
                write(0x31,0x03); // data format
                read(0x32,2); // Data x
                x1 = ((rxBuffer[1]) << 8) | rxBuffer[0];
                read(0x34,2); // Data y
                y1 = ((rxBuffer[3]) << 8) | rxBuffer[2];
                read(0x36,2); // Data z
                z1 = ((rxBuffer[5]) << 8) | rxBuffer[4];
            }

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

    > UCB2IE &=~UCRXIE;

    这是 RXIFG 情况。 RXIE 将保持关闭状态、因为没有其他任何东西会再次打开它。 合理的做法是:

    > UCB2IFG &=~UCRXIFG;

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

    您好、Bruce、

    我更改了这个值、但现在在发送了 ox32之后从从从器件 IE X 值接收到第一个数据。 接下来、它不会进入中断例程。 这里会出现什么问题?

    谢谢你

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

    在 EUSCI_B2的寄存器条目中、IFG 和 IE 寄存器是什么样的?  

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

    您好、Bruce、

    TX 和 RX IE 都在开头设置。  例如 UCRXIE 和 UCTXIE = 1。

    发送:

    • 在 TX 中断被使能后、TXIFG 被置位。
    • 然后、在将数据放入(UCB2TXBUF) TX 缓冲区之前、TXIFG 被清零。
    • 在将数据放入 UCB2TXBUF 缓冲区后、TXIFG 被置位、即 TXIFG = 1。

    接收:

    • 在启用 RX 中断后、RXIFG 被置位。
    • 然后、RXIFG 在从(UCB2RXBUF) RX 缓冲器中获取数据之前被清零。
    • 在从 UCB2RXBUF 缓冲器中获取数据后、RXIFG 被置位、即 RXIFG = 1。

    RXIE 和 TXIE 都保持不变。

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

    根据 IE 和 IFG 寄存器的实际内容(以及 SR 中的 GIE),我试图回到第一原则。 了解"是"与了解"应该是"有何不同。

    如果、例如 RXIFG=1、RXIE=1、和 GIE=1、我们预计 ISR 将被调用。 (与 Tx 类似。)  

    如果这些条件为 true (并且未调用 ISR)、则指向一个方向。 如果其中一个位= 0、则该位指向不同的方向。

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

    在1K 时、信号设置时间似乎有点长。 当 SCL 和 SDA 的速度高达400k 时、您能帮助捕获波形吗?