MSP430 I2 C с чтением проблемы с датчиком перепада давления SDP610 - PullRequest
1 голос
/ 24 февраля 2020

Я пытаюсь прочитать датчик перепада давления SDP610 sensiron через Texas Instruments msp430. У меня проблема с тем, что датчик не подтверждает команду и, следовательно, не передает само значение давления. Примечание. Я подтвердил, что датчик работает, подключив его к arduino через библиотеку с открытым исходным кодом, и я могу просматривать данные через него. Обратите внимание, что моя IDE - это код composer. У меня чипы MSP430FR2311 (плата коммутационной панели).

У меня аппаратная настройка на 4 провода. V cc (3,3 В), Земля (0 В), SDK и SCL. Линии SDK и SCL подключены к V CC с помощью резистора 4,7 кОм согласно спецификации.

У меня есть следующий код для моего MSP430, см. Ниже:

Однако я не вижу отклик датчика через анализатор logi c. Вот мой захват. Вам нужно будет нажать на ссылку. Обратите внимание, что верхняя строка - часы, а нижняя - данные. Выход MSP430 . Поток logi c для чтения датчика из таблицы данных и из кода arduino выглядит следующим образом:

  • Запись адреса устройства в строку I2 C (8 бит h81)
  • Ожидание подтверждения ведомого устройства
  • Запись команды для чтения (8 бит hF1)
  • Ожидание подтверждения ведомого устройства
  • Ведомое устройство удерживает ведущее устройство
  • Ведомое устройство выводит 3 байта (2 данных один msb и 1 lsb, затем контрольную сумму)
  • квитанция

Это таблица данных для датчика

Любые подсказки, почему датчик не реагирует.

КОД

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

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Несколько частей отсутствовали по сравнению со старой моей реализацией проекта (VCNL3020 + MSP430).

Например: установить 7-битный режим адресации, одно-мастерную среду, I2 C Master, синхронный режим, .. Возможно, я упустил из виду

Нужен ли сам датчик в этом?

Часть инициализации I2 C выглядела только так:

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 I2 C MSP430 Main

Надеюсь, это немного поможет - развлекайтесь!

0 голосов
/ 28 февраля 2020

Я не уверен, как выглядит ваше оборудование, но ваши подтяжки I2 C звучат слишком громко. Я знаю, что во многих заметках приложения говорится о 4,7 КБ, но я бы посмотрел на время нарастания линии с осциллографом. Если у вас нет доступа к области, я бы использовал 1K или 2K и посмотрел, что произойдет.

...