gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:31:57 24 4
gpt4 key购买 nike

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

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

我的 MSP430 有以下代码,见下文:

但是,我没有通过逻辑分析仪看到传感器的响应。这是我的捕获。您必须单击该链接。注意上面一行是时钟,下面一行是数据。
MSP430 output .
从数据表和arduino代码中读取传感器的逻辑流程如下:

  • 将设备地址写入 I2C 线(8 位 h81)
  • 等待从机确认
  • 用于读取的写入命令(8 位 hF1)
  • 等待从机确认
  • 奴隶持有主人
  • 从设备输出 3 个字节(2 个数据 1 msb 和 1 lsb 然后是校验和)
  • 确认

  • 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
    }
    }

    最佳答案

    与我的旧项目实现 (VCNL3020 + MSP430) 相比,缺少几个部分。

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

    传感器本身是否需要初始化?

    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

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

    关于c - MSP430 I2C 读取 SDP610 压差传感器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60378162/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com