Я пытаюсь прочитать датчик перепада давления 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
}
}