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/MSP432P401R:UCB0CTLW0 ||~(UCTR)正在禁用所有已启用的中断

Guru**** 2563590 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/603275/ccs-msp432p401r-ucb0ctlw0-uctr-disabling-all-enabled-interrupts

器件型号:MSP432P401R

工具/软件:Code Composer Studio

当我将模式更改为接收时、需要一些帮助来了解为什么我的中断被禁用。 在此步骤之前、所有中断都被启用。 在单步执行该行后、它们都将禁用。 请参阅下面显示的高亮显示行和完整代码。

谢谢

 

IF (STATUS & EUSCI_B_I2C_Transmit _INTERRUPT0)

 while (TxByteCtr)

UCB0TXBUF = TXData;

//UCB0IFG &=~(UCTXIFG0);

TxByteCtr --;

//map_Interrupt_disableSlepOnIsrExit();

UCB0IE |= UCRXIE0;

UCB0CTLW0 |=~(UCTR);   此行代码将禁用我的所有中断、并且在发送重启后不允许设置 RXIFG。

UCB0CTLW0 |= UCTXSTT;

 

 

 

#include "driverlib.h"

/*标准定义*/

#include

#include

#include

#include

/* I2C 从机的从机地址*/

#define SLAVE_ADDRESS IC_ADDRESS_TMP7051_ADDRESS

#define NUM_OF_REC_Bytes 2.

/*变量*/

const uint8_t TXData ={0xE3};

静态 uint8_t RXData[NUM_OF_REC_BYes];

静态 uint8_t RxByteCtr、TxByteCtr;

静态易失性 uint32_t xferIndex;

静态易失性 bool stopSent;

/* I2C 主配置参数*/

const eUSCI_I2C_MasterConfig i2cConfig =

EUSCI_B_I2C_CLOCKSOURCE_SMCLK、// SMCLK 时钟源

3000000、// SMCLK = 3MHz

EUSCI_B_I2C_SET_DATA_RATE 100KBPS、//所需的100kHz I2C 时钟

0、//无字节计数器阈值

EUSCI_B_I2C_NO_AUTO_STOP //无自动停止

//EUSCI_B_I2C_SEND_STOP_Automatically _ON_BYTECOUNT_T_THRESHOLD

};

int main (空)

静态易失性 uint32_t ii;

/*禁用看门狗*/

MAP_WDT_A_HOLDTimer();

/*为 I2C 选择端口1 -将引脚6、7设置为输入主模块功能、

(UCB0SIMO/UCB0SDA、UCB0SOMI/UCB.S.)。

*

MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P1、

GPIO_PIN6 + GPIO_PIN7、GPIO_PRIMARY_MODULE_FUNCTION);

//stopSent = false;

memset (RXData、0x00、NUM_OF_REC_Bytes);

/*以100kHz 的频率将 I2C 主设备初始化为 SMCLK,而不进行自动停止*/

MAP_I2C_initMaster (EUSCI_B0_BASE、&i2cConfig);

/*指定从地址*/

MAP_I2C_setSlaveAddress (EUSCI_B0_BASE、SLAVE_ADDRESS);

/*将主设备设置为传输模式*/

MAP_I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit 模式);

/*启用 I2C 模块以启动操作*/

MAP_I2C_enableModule (EUSCI_B0_BASE);

/*启用和清除中断标志*/

MAP_I2C_clearInterruptFlag (EUSCI_B0_BASE、EUSCI_B_I2C_Receive_INTERRUPT0);

MAP_I2C_clearInterruptFlag (EUSCI_B0_BASE、EUSCI_B_I2C_NAK_INTERRUPT);

MAP_I2C_clearInterruptFlag (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit _INTERRUPT0);

//启用主机发送中断

MAP_I2C_enableInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_NAK_INTERRUPT);

MAP_I2C_enableInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Receive_INTERRUPT0);

MAP_I2C_enableInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit INTERRUPT0);

//map_Interrupt_enableSlepOnIsrExit();

MAP_Interrupt_enableInterrupt (INT_EUSCIB0);

while (1)

//for (ii = 4000;ii > 0;ii -);

RxByteCtr = 2;

TxByteCtr = 1;

while (MAP_I2C_masterIsStopSent (EUSCI_B0_BASE)== EUSCI_B_I2C_Sending _stop);

UCB0TXBUF = TXData;

UCB0CTLW0 |= UCTR + UCTXSTT;

MAP_PCM_gotoLPM0InterruptSafe ();

/*********

* eUSCIB0 ISR。 发生重复的启动和发送/接收操作

*。

秘书长的报告 /

EUSCIB0_IRQHandler ()

uint_fast16_t status;

STATUS = MAP_I2C_getEnabledInterruptStatus (EUSCI_B0_BASE);

IF (STATUS & EUSCI_B_I2C_STOP_INTERRUPT)

UCB0IFG &=~(UCSTPIFG);

IF (STATUS & EUSCI_B_I2C_NAK_INTERRUPT)

//map_Interrupt_disableSlepOnIsrExit();

UCB0IFG &=~(UCNACKIFG);

UCB1CTLW0 |= UCTR + UCTXSTT;

IF (STATUS & EUSCI_B_I2C_Transmit _INTERRUPT0)

while (TxByteCtr)

UCB0TXBUF = TXData;

//UCB0IFG &=~(UCTXIFG0);

TxByteCtr --;

//map_Interrupt_disableSlepOnIsrExit();

UCB0IE |= UCRXIE0;

UCB0CTLW0 |=~(UCTR);

UCB0CTLW0 |= UCTXSTT;

IF (STATUS & EUSCI_B_I2C_Receive_INTERRUPT0)

while (RxByteCtr)

RXData[RxByteCTR]= UCB0RXBUF;

UCB0IFG &=~(UCRXIFG0);

RxByteCtr ----

if (RxByteCtr =0)

UCB0CTLW0 |= UCTXSTP;

MAP_Interrupt_disableSlepOnIsrExit()

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

    > UCB0CTLW0 |=~(UCTR);  

    这将打开 UCB0CTLW0中除 UCTR 以外的所有位。 值得注意的是、它打开 UCSWRST、其副作用之一是清零 IE 位。 它还会将装置置于复位状态、因此不管怎样、它都不起作用。

    我不是很确定您的目标是什么、它本可以是:

    UCB0CTLW0 &=~(UCTR); //->接收器模式

    UCB0CTLW0 |=(UCTR);   //->发送器模式

    选择一个。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Bruce 的快速回复。 我看不到树的森林。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    更正了该问题并对代码进行了一些修改。 程序似乎正在跳过我的发送开始/向从器件写入 TxData。 只读到总线上。

    while (1)

    (ii = 4000;ii > 0;ii -);

    RxByteCtr = 2;

    TxByteCtr = 1;

    while (MAP_I2C_masterIsStopSent (EUSCI_B0_BASE)== EUSCI_B_I2C_Sending _stop);

    UCB0TXBUF = TXData;

    UCB0CTLW0 |= UCTXSTT + UCTXSTP;

    MAP_PCM_gotoLPM0InterruptSafe ();

    /*********

    * eUSCIB0 ISR。 发生重复的启动和发送/接收操作

    *。

    秘书长的报告 /

    EUSCIB0_IRQHandler ()

    uint_fast16_t status;

    STATUS = MAP_I2C_getEnabledInterruptStatus (EUSCI_B0_BASE);

    IF (STATUS & EUSCI_B_I2C_STOP_INTERRUPT)

    UCB0IFG &=~(UCSTPIFG);

    IF (STATUS & EUSCI_B_I2C_NAK_INTERRUPT)

    //map_Interrupt_disableSlepOnIsrExit();

    UCB0IFG &=~(UCNACKIFG);

    UCB1CTLW0 |= UCTR + UCTXSTT;

    IF (STATUS & EUSCI_B_I2C_Transmit _INTERRUPT0)

    while (TxByteCtr)

    UCB0TXBUF = TXData;

    UCB0IFG &=~(UCTXIFG0);

    //UCB0CTLW0 |= UCTXSTP;

    TxByteCtr --;

    //map_Interrupt_disableSlepOnIsrExit();

    UCB0CTLW0 &=~(UCTR);

    UCB0CTLW0 |= UCTXSTT;

    //UCB0CTLW0 |= UCTXSTT;

    IF (STATUS & EUSCI_B_I2C_Receive_INTERRUPT0)

    while (RxByteCtr)

    RXData[RxByteCTR]= UCB0RXBUF;

    UCB0IFG &=~(UCRXIFG0);

    RxByteCtr ----

    if (RxByteCtr =0)

    UCB0CTLW0 |= UCTXSTP;

    MAP_Interrupt_disableSlepOnIsrExit();

     


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

    > while (TxByteCtr)

    > while (RxByteCtr)

    这两种情况使我感到怀疑、但我无法立即将它们与您的症状联系起来。 通常、每个中断只能接收/发送一个字节。 (这并不是很糟糕、因为 I2C 相当慢。) 第一个可能不会影响您、因为 TxByteCtr 始终为0或1、但第二个可能是(或将是)。

    每当我必须使用 I2C 器件时、我都会返回到 SLAU356A (或等效)图24-9 (ff)中的状态图、并按其所述执行操作。