主题中讨论的其他器件:MSP430F4784、
您好!
我目前正在使用 PCA9539 I/O 扩展器。使用 I2C 连接 MSP430F4784。
IC 上电(3.3)时,INT 引脚是否初始为低电平? 即使连接了上拉(10k)。
INT 引脚是否仅在读取输入寄存器之后才会变高?
下面是程序。
每当我读取输入寄存器 1时 、UCB0RXBUF 都会提供2个字节
但在循环中、数据[0]和数据[1]的字节会连续跳跃。
以便我无法读取字节的特定位。
问题是什么?
请帮我解决这个问题
uint8_t data[2];
void i2c_beginTx(uint8_t address)
{
UCB0I2CSA = address;
UCB0CTL1 |= UCTR + UCTXSTT;
while((UCB0STAT & UCNACKIFG));
}
void i2c_write(uint8_t byte)
{
UCB0TXBUF = byte;
while((UCB0STAT & UCNACKIFG));
__delay_cycles(5000);
}
void i2c_read(uint8_t address, uint8_t reg, uint8_t len)
{
int i;
UCB0I2CSA = address;
UCB0CTL1 |= UCTR + UCTXSTT;
while((UCB0STAT & UCNACKIFG));
UCB0TXBUF = reg;
__delay_cycles(5000);
UCB0CTL1 |= UCTXSTP;
UCB0I2CSA = address;
UCB0CTL1 &= ~UCTR;
UCB0CTL1 |= UCTXSTT;
while((UCB0STAT & UCNACKIFG));
for(i=0;i<len;i++)
{
data[i] = UCB0RXBUF;
__delay_cycles(5000);
}
UCB0CTL1 |= UCTXNACK;
UCB0CTL1 |= UCTXSTP;
}
void read(uint8_t address, uint8_t len)
{
UCB0I2CSA = address;
UCB0CTL1 &= ~UCTR;
UCB0CTL1 |= UCTXSTT;
while((UCB0STAT & UCNACKIFG));
for(i=0;i<len;i++)
{
data[i] = UCB0RXBUF;
__delay_cycles(5000);
}
UCB0CTL1 |= UCTXNACK;
UCB0CTL1 |= UCTXSTP;
}
void i2c_stop()
{
UCB0CTL1 |= UCTXSTP;
}
int main()
{
WDTCTL = WDTPW | WDTHOLD;
SCFQCTL |= SCFQ_4M;
SCFI0 |= FN_2;
FLL_CTL0 |= DCOPLUS;
do
{
IFG1 &= ~OFIFG;
__delay_cycles(5000);
}while(IFG1 & OFIFG);
P1DIR |= BIT1;
P1SEL |= BIT1;
P1DIR |= BIT4;
P1SEL |= BIT4;
P3SEL |= BIT1 + BIT2; // i2c pins
basic_tmr();
P9DIR |= BIT5; //LED blink
P9OUT &= ~BIT5;
P5DIR |= BIT5; // led
P5OUT &= ~BIT5;
P5DIR |= BIT4; // led
P5OUT &= ~BIT4;
P10DIR |= BIT6; // reset IO EXP
P10OUT &= ~BIT6;
__delay_cycles(500);
P10OUT |= BIT6;
UCB0CTL1 |= UCSWRST;
UCB0CTL0 |= UCMST + UCMODE_3 + UCSYNC;
UCB0CTL1 |= UCSSEL_2 + UCSWRST;
UCB0BR0 = 20;
UCB0BR1 = 0;
UCB0CTL1 &= ~UCSWRST;
__delay_cycles(100000);
i2c_beginTx(0x77);
i2c_write(0x06);
i2c_write(0x60);
i2c_write(0xFF);
i2c_stop();
__delay_cycles(50000);
i2c_read(0x77, 0x01, 2);
/** interrupt pin **/
P1DIR &= ~BIT5;
P1IE |= BIT5;
P1IES |= BIT5;
__bis_SR_register(GIE);
while(1)
{
P5OUT ^= BIT4;
__delay_cycles(1000000);
if(a == 1)
{
read(0x77, 2);
if((data[0] & (1<<5)) == 1)
{
a = 0;
P9OUT ^= BIT5;
__delay_cycles(1000000);
}
}
}
}
#pragma vector=PORT1_VECTOR
__interrupt void port_1_ISR(void)
{
if(P1IFG & BIT5)
{
read(0x77, 2);
if((data[0] & (1<<5)) == 0)
{
__delay_cycles(10000000);
P5OUT |= BIT5;
__delay_cycles(10000000);
P5OUT &= ~BIT5;
a = 1;
}
P1IFG &= ~BIT5;
}
}