主题中讨论的其他器件: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;
}
}