This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR2033:来自压力传感器的压力数据

Guru**** 2346870 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1225604/msp430fr2033-pressure-data-from-pressure-sensors

器件型号:MSP430FR2033

大家好!

我正在尝试使用几个霍尼韦尔传感器测量压力。 我有3个 i2c 压力传感器、它们都具有相同的地址。 该器件有一个多路复用器、允许与所有3个传感器进行通信。 每次打印压力数据时、我都会得到一个随机的十六进制值。 转换值时、返回值不是预期值。 返回的十六 进制值为十进制的0x8523 = 34083。

此函数从压力传感器读取原始数据并返回原始压力值

uint32_t i2cReadHWPressureTemp(uint8_t channel)
{
  uint8_t c_cmd_data[1] = {channel};

  *((uint32_t*)pressure_data) = 0xFFFFFFFFU;
  I2C_Master_WriteReg(0xF0, 0x01, c_cmd_data, 1);
  I2C_Master_ReadData(0x28, pressure_data, 4);
  return *((uint32_t*)pressure_data);

这是从函数读取的代码部分。 它正在将原始数据转换为压力和温度数据。

static uint8_t Press[PRESSURE_NUM_BYTES] = {0xFFU, 0xFFU, 0xFFU, 0xFFU};
uint32_t bridge_data;
uint32_t pressure;
uint32_t temp_data;
uint32_t temperature;

case sensors:
*((uint32_t*)Press) = i2cReadHWPressureTemp(4);
bridge_data = (((uint32_t)Press[0] & ~STATUS_MASK) << 8) | (uint32_t)Press[1];
pressure = ((bridge_data - OUTPUT_MIN)*(PRESSURE_MAX_001BA - PRESSURE_MIN_001BA))/ (OUTPUT_MAX - OUTPUT_MIN) + PRESSURE_MIN_001BA;
temp_data = ((uint32_t)(Press[2]) << 8) | ((uint32_t)(Press[3] >> 5));
temperature = ((temp_data*0.0977) - 50);

SendSignedHexNumStr(pressure, 4, false);
break;

我的问题是 BRIDGE_DATA 始终显示为0、这意味着按下列表[PRESURE_NUM_BYTE] 是空列表、即使它由函数 i2cReadHWPressureTemp 填充 。 我需要帮助以确定如何填写列表。  

我希望这一点很清楚。

谢谢你

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Anish、您好!

    简单来说一下、您是否也探测了 I2C 线路以确保一切 正常通信?  

    您在何处以及如何定义 pression_data?  将数组指针传递到  i2cReadHWPressureTemp 函数中可能更容易、然后直接在那里更新。  

    此致、
    Brandon Fisher

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我能够解决我的问题。 问题不是 i2c,而是计时问题。 我设置的时间太短、无法计算我发送的代码中的所有内容。 我发送的代码只是一个较大程序的片段。 此外、我为该序列分配了足够的时间、这导致传感器不读取和计算原始数据。

    感谢你的帮助