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代码读取传感器的逻辑流程如下:
- 将设备地址写入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
}
}
我不确定你的硬件是什么样子,但你的 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
我希望这对您有所帮助 - 玩得开心!
我正在尝试通过 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代码读取传感器的逻辑流程如下:
- 将设备地址写入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
}
}
我不确定你的硬件是什么样子,但你的 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
我希望这对您有所帮助 - 玩得开心!