主题中讨论的其他器件:MSP430F4784、
您好!
我正在尝试为电路板(MSP430F4784)使用其他 GPIO、因此我使用的是 PCA9539 I/O 扩展器16位。
根据数据表、我使用 I2C 进行编程。
我使用0x74作为从器件地址、将 A0和 A1接地。
我能够在逐步调试时读取和写入 PCA9539中的数据。
对于中断引脚、我使用了控制器的中断引脚。 但是、当我在 POR 之后运行下面的程序时、中断引脚不会变得高、我甚至不会更改 I/O 扩展器中的引脚状态。
即使引脚处于低电平状态、也不会发生中断。
您能否提供除 Arduino 示例以外的 PCA9539示例? 如 MSP430系列。
或者、请提供有关 PCA9539的操作步骤。
void i2c_beginTx(uint8_t address) { UCB1I2CSA = address; UCB1CTL1 |= UCTR + UCTXSTT; while((UCB1STAT & UCNACKIFG)); } void i2c_write(uint8_t byte) { __delay_cycles(500); UCB1TXBUF = byte; while((UCB1STAT & UCNACKIFG)); } void i2c_read(uint8_t address, uint8_t reg, uint8_t len) { int i; UCB1I2CSA = address; UCB1CTL1 |= UCTR + UCTXSTT; while((UCB1STAT & UCNACKIFG)); UCB1TXBUF = reg; __delay_cycles(500); UCB1CTL1 |= UCTXSTP; UCB1I2CSA = address; UCB1CTL1 &= ~UCTR; UCB1CTL1 |= UCTXSTT; while((UCB1STAT & UCNACKIFG)); for(i=0;i<len;i++) { data[i] = UCB1RXBUF; __delay_cycles(500); } UCB1CTL1 |= UCTXNACK; UCB1CTL1 |= UCTXSTP; } void read(uint8_t address, uint8_t len) { UCB1I2CSA = address; UCB1CTL1 &= ~UCTR; UCB1CTL1 |= UCTXSTT; while((UCB1STAT & UCNACKIFG)); for(i=0;i<len;i++) { //delay_in_sec(1); data[i] = UCB1RXBUF; __delay_cycles(500); } UCB1CTL1 |= UCTXNACK; UCB1CTL1 |= UCTXSTP; } void i2c_stop() { UCB1CTL1 |= UCTXSTP; } int main() { WDTCTL = WDTPW | WDTHOLD; P4SEL |= BIT3 + BIT4; // i2c pins /** interrupt pin **/ P1DIR &= ~BIT7; P1IE |= BIT7; P1IES |= BIT7; P9DIR |= BIT5; //LED blink UCB1CTL1 |= UCSWRST; UCB1CTL0 |= UCMST + UCMODE_3 + UCSYNC; UCB1CTL1 |= UCSSEL_2 + UCSWRST; UCB1BR0 = 11; UCB1BR1 = 0; UCB1CTL1 &= ~UCSWRST; __delay_cycles(100); i2c_beginTx(0x74); i2c_write(0x06); i2c_write(0xFF); i2c_write(0xFF); i2c_stop(); while(1) { i2c_read(0x74, 0x01, 2); } } #pragma vector=PORT1_VECTOR __interrupt void port_1_ISR(void) { if(P1IFG & BIT7) { read(0x74, 2); if((data[0] & 0) == 0) { P9OUT |= BIT5; __delay_cycles(1000000); P9OUT &= ~BIT5; __delay_cycles(1000000); } P1IFG &= ~BIT7; } }