MSP430 I2C 读取 SDP610 压差传感器问题

MSP430 I2C reading a SDP610 differential pressure sensor issue

我正在尝试通过 Texas Instruments msp430 读取 SDP610 sensiron 差压传感器。 我遇到的问题是传感器不确认命令,因此不传达压力值本身。请注意,我已经确认传感器可以通过开源库将其连接到 arduino 来工作,并且我可以通过它查看数据。注意我的 IDE 是代码编写器。我的芯片是 MSP430FR2311(发射台分线板)。

我的硬件设置是 4 线。 Vcc(3.3V)、接地(0V)、SDK 和 SCL。根据规范,SDK 和 SCL 线通过 4.7Kohm 电阻拉至 VCC。

我的 MSP430 代码如下:

但是,我没有通过逻辑分析仪看到传感器的响应。这是我的捕获。您将必须单击 link。请注意,顶行是时钟,底部是数据。 MSP430 output。 从数据表和arduino代码读取传感器的逻辑流程如下:

This is the datasheet for the sensor

关于传感器没有响应的任何提示。

代码

void Read_Diff_pressure(void)
{
    int rx_byte;
    UCB0CTL1 |= UCTXSTT+ UCTR; // Generating START + I2C transmit (write)
    UCB0I2CSA = SDP610Address; // SDP610 7 bit address 0x40
    UCB0TXBUF = SDP610Read; // sending the read command 0x78
    while(!(UCB0IFG & UCTXIFG)); //wait until reg address got sent
    while( UCB0CTL1 & UCTXSTT); //wait till START condition is cleared
    UCB0CTL1 |= UCTXSTT; //generate RE-START
    UCB0I2CSA = SDP610Address; // SDP610 7 bit address 0x40
    UCB0CTL1 &=~ UCTR; //receive mode
    while( UCB0CTL1 & UCTXSTT); //wait till START condition is cleared
    rx_byte = UCB0RXBUF; //read byte
    //while(!(UCB0IFG & UCRXIFG)); //wait while the Byte is being read
    UCB0CTL1 |= UCTXNACK; //generate a NACK
    UCB0CTL1 |= UCTXSTP; //generate stop condition
    while(UCB0CTL1 & UCTXSTP); //wait till stop condition got sent```

    Pressure_result = rx_byte;
}
void InitI2C_diff(void)
{

    PAOUT |= I2C_SCL_PIN|I2C_SDA_PIN;//P1.2(SDA) - P1.3(SCL) as per silk screen defined in a header
    PADIR |= I2C_SCL_PIN|I2C_SDA_PIN;
    PASEL0 |= (I2C_SCL_PIN|I2C_SDA_PIN);              // configure I2C pins (device specific)
    UCB0CTLW0 |= UCSWRST;                             // put eUSCI_B in reset state
    UCB0CTLW0 |= UCMODE_3 | UCSYNC | UCMST;           // I2C master mode, SMCL
    UCB0CTL1 = UCSSEL_2 + UCSWRST; //use SMCLK + still reset
    UCB0BR0 = 10; // default SMCLK 1M/10 = 100KHz
    UCB0BR1 = 0; //
    UCB0I2CSA =  SDP610Address;                       //The address of the device
    UCB0CTLW0 &= ~UCSWRST;                            // eUSCI_B in operational state

    //UCB0BRW = 64;                                     // baudrate = SMCLK / 64
}
int main(void)
{
    InitI2C_diff();//Init the i2c


    while (1) { // Mainloop
        Read_Diff_pressure();
        delay(1000);//1 Second delay before re looping
    }
}

我不确定你的硬件是什么样子,但你的 I2C 上拉听起来也不错 large.I 知道很多应用笔记都在谈论 4.7K,但我会看看上升时间用示波器的线路。如果您无权访问示波器,我会使用 1K 或 2K,看看会发生什么。

与我的旧项目实施 (VCNL3020 + MSP430) 相比,缺少一些部件。

例如: 设置7位寻址模式,单主机环境,I2C Master,同步模式,..可能是我忽略了

传感器本身需要初始化吗?

I2C 的初始化部分看起来像这样:

void I2CInit( void )
{
    P1SEL |= BIT6 + BIT7;                    // Assign I2C pins to USCI_B0
    P1SEL2|= BIT6 + BIT7;
    UCB0CTL1 |= UCSWRST;                    // Enable SW reset
    UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;    // 7-bit addressing, single-master environment, I2C Master, synchronous mode
    UCB0CTL1 = UCSSEL_2 + UCSWRST;            // Use SMCLK, keep SW reset
    UCB0BR0 = 16;                    // fSCL = SMCLK/UCB0BR1
    UCB0BR1 = 0;
    UCB0I2CIE |= UCNACKIE;                    // Enable not-acknowledge interrupt
    UCB0I2CSA=slave_adress;
    UCB0CTL1 &= ~UCSWRST;                    // Clear SW reset, resume operation
    IE2 |= UCB0TXIE + UCB0RXIE;                // Enable TX&RX interrupts

}

为了避免不必要的复杂化,您可以在 github 上查看我的实现,看看是否有帮助 Github Link I2C MSP430 Main

我希望这对您有所帮助 - 玩得开心!