主题中讨论的其他器件:MSP430FR2355、 HDC2080、 HDC2022、
我正在尝试将/msp430fr2355_demo_wo_hdc2080/main.c 中的示例代码移植到我们的硬件(FR2353、HDC2022)。 我将使用 USCI_B1。
I2C 外设不会生成中断(从不命中我在 ISR 中第一条语句上设置的断点)。
首先、我是否在下面的语句中使用了正确的关键字:
#pragma vector = USCI_B1_Vector
这是怎么回事?
#pragma vector = EUSCI_B1_Vector
两者都指向同一个中断矢量吗? 两个构建都没有错误。
下面是一些代码片段、这些代码片段经过修改以与我的硬件相匹配。
void initGPIO()
{
......... skipped lines
// I2C pins (P4.7 is SCL, P4.6 is SDA)
P4SEL0 |= BIT6 | BIT7;
P4SEL1 &= ~(BIT6 | BIT7);
.......skipped lines
}
void initI2C()
{
UCB1CTLW0 = UCSWRST; // Enable SW reset
UCB1CTLW0 |= UCMODE_3 | UCMST | UCSSEL__SMCLK | UCSYNC; // I2C master mode, SMCLK
UCB1BRW = 160; // fSCL = SMCLK/160 = ~100kHz
UCB1I2CSA = SLAVE_ADDR; // Slave Address
UCB1CTLW0 &= ~UCSWRST; // Clear SW reset, resume operation
UCB1IE |= UCNACKIE;
}
//******************************************************************************
// I2C Interrupt ***************************************************************
//******************************************************************************
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector = USCI_B1_VECTOR
__interrupt void USCI_B1_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(USCI_B1_VECTOR))) USCI_B1_ISR (void)
#else
#error Compiler not supported!
#endif
{
//Must read from UCB1RXBUF
uint8_t rx_val = 0;
switch(__even_in_range(UCB1IV, USCI_I2C_UCBIT9IFG)) <<<<<<<<<<<Breakpoint set here.....
{
.......
......
}
I2C_Mode I2C_Master_WriteReg(uint8_t dev_addr, uint8_t reg_addr, uint8_t *reg_data, uint8_t count)
{
/* Initialize state machine */
MasterMode = TX_REG_ADDRESS_MODE;
TransmitRegAddr = reg_addr;
//Copy register data to TransmitBuffer
CopyArray(reg_data, TransmitBuffer, count);
TXByteCtr = count;
RXByteCtr = 0;
ReceiveIndex = 0;
TransmitIndex = 0;
/* Initialize slave address and interrupts */
UCB1I2CSA = dev_addr;
UCB1IFG &= ~(UCTXIFG + UCRXIFG); // Clear any pending interrupts
UCB1IE &= ~UCRXIE; // Disable RX interrupt
UCB1IE |= UCTXIE; // Enable TX interrupt
UCB1CTLW0 |= UCTR + UCTXSTT; // I2C TX, start condition
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0 w/ interrupts <<<<<<<<<<<< HANGS HERE...............
return MasterMode;
}
当我运行程序时、它会在以下行上挂起:
_bis_SR_register (LPM0_bits + GIE);//输入 LPM0、带中断
未命中断点。
这是第一次尝试使用 I2C 与 HDC2022通信)。