This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] PCA9539:INT 引脚未变得高电平

Guru**** 2387080 points
Other Parts Discussed in Thread: MSP430F4784, PCA9539
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1112197/pca9539-int-pin-is-not-getting-high

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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    SAI、

    您是否有我们可以检查的原理图? INT 引脚是开漏输出、需要一个外部上拉电阻器来提供逻辑高电平。

    -Bobby

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很遗憾、我无法提供原理图。

    对于中断引脚、I 提供了10K 上拉电阻器。 够了吗?

    时钟的输入信号现在变得很高。 但我希望它在8MHz 下工作、因此我也包括了一些延迟、但有时 INT 会始终为低电平或读取 I/O 会成为一个问题、例如最初当高电平时、使其变为低电平或按下按钮。 INT 相应地做出响应、但是在第三次或第四次按下按钮后、中断一直为低电平。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sai、

    [~ userid="431635" url="支持/interface-group/interface/f/interface-forum/1112197/pca9539-int-pin-is-not getting-high/4122357#4122357]for interrupt pin I 为中断引脚提供了10K 上拉电阻器。 够了吗?[/引述]

    是的、10k 应该正常。

    [引用 userid="431635" URL"~//support/interface-group/interface/f/interface-forum/1112197/pca9539-int-pin-is-not getting-high/4122357#4122357"]但有时 INT 会始终处于低电平或读取 I/O 时会成为问题、例如当高电平使其变为低电平或按下按钮时[引用]。

    读取输入端口后、INT 应始终取消置位。 如果在每次 INT 置位后读取这些端口、则不应看到 INT 保持置位。 您是否具有 INT 断言的范围、I2C 流量是否显示对输入端口的读取?

    -Bobby