Прежде всего, спасибо за ваши предложения.Я пытался проанализировать каждое возможное решение, которое вы предложили.
Решение, предложенное Питером, показалось очень интересным, но я должен сказать, что, пройдя через таблицу несколько раз, я не думаю, что это осуществимо.Мое соображение основано на следующих фактах:
Используя область действия, я вижу, что подтверждение получено сразу после отправки команды для выполнения преобразования.См. Следующее изображение, касающееся преобразования температуры:
Мне кажется, что бит подтверждения сразу после команды совершенно ясен.После этого линия SDA (желтая) становится высокой, поэтому я не понимаю, как это возможно, чтобы использовать это для определения того, когда преобразование готово.
Что касается решения при использовании SPI, да,SDO остается низким во время преобразования, но я не могу его использовать: мне нужно придерживаться I2C.Кроме того, у меня есть другие датчики, подключенные к этой шине SPI, и я согласен с тем, что говорит Габриэль Стейплз.
После моего рассмотрения я остановился на решении, предложенном Габриэлем Стейплсом (учитывая, что для считывания значения давления ятакже необходимо прочитать и преобразовать температуру).
Мое текущее решение основано на автомате с 6 состояниями.В моем решении я различаю время ожидания для преобразования давления и время ожидания для преобразования температуры с идеей, что я мог бы попытаться увидеть, насколько ухудшается показание давления, если я использую менее точное показание температуры.
Вот мое текущее решение.Следующая функция вызывается внутри main while:
void MS5803_update()
{
static uint32_t tStart; // us; start time
switch (sensor_state)
{
case MS5803_REQUEST_TEMPERATURE:
{
MS5803_send_command(MS5803_CMD_ADC_CONV + TEMPERATURE + baro.resolution);
tStart = HAL_GetTick();
sensor_state = MS5803_WAIT_RAW_TEMPERATURE;
break;
}
case MS5803_WAIT_RAW_TEMPERATURE:
{
uint32_t tNow = HAL_GetTick();
if (tNow - tStart >= conversion_time)
{
sensor_state = MS5803_CONVERTING_TEMPERATURE;
}
break;
}
case MS5803_CONVERTING_TEMPERATURE:
{
MS5803_send_command(MS5803_CMD_ADC_READ);
uint8_t raw_value[3]; // Read 24 bit
MS5803_read_value(raw_value,3);
temperature_raw = ((uint32_t)raw_value[0] << 16) + ((uint32_t)raw_value[1] << 8) + raw_value[2];
sensor_state = MS5803_REQUEST_PRESSURE;
break;
}
case MS5803_REQUEST_PRESSURE:
{
MS5803_send_command(MS5803_CMD_ADC_CONV + PRESSURE + baro.resolution);
tStart = HAL_GetTick();
sensor_state = MS5803_WAIT_RAW_PRESSURE;
break;
}
case MS5803_WAIT_RAW_PRESSURE:
{
uint32_t tNow = HAL_GetTick();
if (tNow - tStart >= conversion_time)
{
sensor_state = MS5803_CONVERTING_PRESSURE;
}
break;
}
case MS5803_CONVERTING_PRESSURE:
{
MS5803_send_command(MS5803_CMD_ADC_READ);
uint8_t raw_value[3]; // Read 24 bit
MS5803_read_value(raw_value,3);
pressure_raw = ((uint32_t)raw_value[0] << 16) + ((uint32_t)raw_value[1] << 8) + raw_value[2];
// Now I have both temperature and pressure raw and I can convert them
MS5803_updateMeasurements();
// Reset the state machine to perform a new measurement
sensor_state = MS5803_REQUEST_TEMPERATURE;
break;
}
}
}
Я не претендую на то, что мое решение лучше.Я просто отправляю это, чтобы узнать ваше мнение, ребята.Примечание: я все еще работаю над этим.Поэтому я не могу гарантировать отсутствие ошибок!
Для PeterJ_01: я мог бы согласиться, что это не просто учебный портал, но я считаю, что все здесь задают вопросы, чтобы узнать что-то новое или улучшить себя.Поэтому, если вы считаете, что решение, использующее ack, лучше, было бы здорово, если бы вы могли показать нам черновик вашей идеи.Для меня это было бы что-то новое для изучения.
Любые дальнейшие комментарии приветствуются.