工具/软件: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();
}
}
}
}
