社区导航

 

搜索
查看: 428|回复: 4

[原创] IKS01A3驱动移植,STM32G474RE的LPS22HH气压温度检测

[复制链接]

6393

TA的帖子

10

TA的资源

版主

Rank: 6Rank: 6

发表于 2019-8-29 20:11 | 显示全部楼层 |阅读模式

测量LPS22HH气压和温湿度通过串口打印


QQ图片20190829200157.png

 

/* Includes ------------------------------------------------------------------*/
#include "lps22hh_reg.h"
#include "main.h"
#include <string.h>
#include <stdio.h>
//#define MKI109V2
#define NUCLEO_G474RE

#define TX_BUF_DIM          1000

/* Private variables ---------------------------------------------------------*/
static axis1bit32_t data_raw_pressure;
static axis1bit16_t data_raw_temperature;
static float pressure_hPa;
static float temperature_degC;
static uint8_t whoamI, rst;
static uint8_t tx_buffer[TX_BUF_DIM];
extern I2C_HandleTypeDef hi2c1;

extern UART_HandleTypeDef hlpuart1;
/* Extern variables ----------------------------------------------------------*/

/* Private functions ---------------------------------------------------------*/

/*
 *   Replace the functions "platform_write" and "platform_read" with your
 *   platform specific read and write function.
 *   This example use an STM32 evaluation board and CubeMX tool.
 *   In this case the "*handle" variable is usefull in order to select the
 *   correct interface but the usage uf "*handle" is not mandatory.
 */

static int32_t platform_write(void *handle, uint8_t Reg, uint8_t *Bufp,
                              uint16_t len)
{
  if (handle == &hi2c1)
  {
    HAL_I2C_Mem_Write(handle, LPS22HH_I2C_ADD_H, Reg,
                      I2C_MEMADD_SIZE_8BIT, Bufp, len, 1000);
  }
#ifdef MKI109V2  
  else if (handle == &hspi2)
  {
    HAL_GPIO_WritePin(CS_SPI2_GPIO_Port, CS_SPI2_Pin, GPIO_PIN_RESET);
    HAL_SPI_Transmit(handle, &Reg, 1, 1000);
    HAL_SPI_Transmit(handle, Bufp, len, 1000);
    HAL_GPIO_WritePin(CS_SPI2_GPIO_Port, CS_SPI2_Pin, GPIO_PIN_SET);
  }
  else if (handle == &hspi1)
  {
    HAL_GPIO_WritePin(CS_SPI1_GPIO_Port, CS_SPI1_Pin, GPIO_PIN_RESET);
    HAL_SPI_Transmit(handle, &Reg, 1, 1000);
    HAL_SPI_Transmit(handle, Bufp, len, 1000);
    HAL_GPIO_WritePin(CS_SPI1_GPIO_Port, CS_SPI1_Pin, GPIO_PIN_SET);
  }
#endif
  return 0;
}

static int32_t platform_read(void *handle, uint8_t Reg, uint8_t *Bufp,
                             uint16_t len)
{
  if (handle == &hi2c1)
  {
      HAL_I2C_Mem_Read(handle, LPS22HH_I2C_ADD_H, Reg,
                       I2C_MEMADD_SIZE_8BIT, Bufp, len, 1000);
  }
#ifdef MKI109V2   
  else if (handle == &hspi2)
  {
    Reg |= 0x80;
    HAL_GPIO_WritePin(CS_DEV_GPIO_Port, CS_DEV_Pin, GPIO_PIN_RESET);
    HAL_SPI_Transmit(handle, &Reg, 1, 1000);
    HAL_SPI_Receive(handle, Bufp, len, 1000);
    HAL_GPIO_WritePin(CS_DEV_GPIO_Port, CS_DEV_Pin, GPIO_PIN_SET);
  }
  else
  {
    Reg |= 0x80;
    HAL_GPIO_WritePin(CS_RF_GPIO_Port, CS_RF_Pin, GPIO_PIN_RESET);
    HAL_SPI_Transmit(handle, &Reg, 1, 1000);
    HAL_SPI_Receive(handle, Bufp, len, 1000);
    HAL_GPIO_WritePin(CS_RF_GPIO_Port, CS_RF_Pin, GPIO_PIN_SET);
  }
#endif  
  return 0;
}

/*
 *  Function to print messages
 */
void tx_com( uint8_t *tx_buffer, uint16_t len )
{
  #ifdef NUCLEO_G474RE  
  HAL_UART_Transmit( &hlpuart1, tx_buffer, len, 1000 );
  #endif
  #ifdef MKI109V2  
  CDC_Transmit_FS( tx_buffer, len );
  #endif
}

/* Main Example --------------------------------------------------------------*/

void example_main(void)
{
  /*
   *  Initialize mems driver interface
   */
  lps22hh_ctx_t dev_ctx;
  dev_ctx.write_reg = platform_write;
  dev_ctx.read_reg = platform_read;
  dev_ctx.handle = &hi2c1;  
  /*
   *  Check device ID
   */
  whoamI = 0;
  lps22hh_device_id_get(&dev_ctx, &whoamI);
  if ( whoamI != LPS22HH_ID )
    while(1); /*manage here device not found */
  /*
   *  Restore default configuration
   */
  lps22hh_reset_set(&dev_ctx, PROPERTY_ENABLE);
  do {
    lps22hh_reset_get(&dev_ctx, &rst);
  } while (rst);
  /*
   *  Enable Block Data Update
   */
  lps22hh_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);
  /*
   * Set Output Data Rate
   */
  lps22hh_data_rate_set(&dev_ctx, LPS22HH_10_Hz_LOW_NOISE);
  
  /*
   * Read samples in polling mode (no int)
   */
  while(1)
  {
    /*
     * Read output only if new value is available
     */
    lps22hh_reg_t reg;
    lps22hh_read_reg(&dev_ctx, LPS22HH_STATUS, (uint8_t *)®, 1);

    if (reg.status.p_da)
    {
      memset(data_raw_pressure.u8bit, 0x00, sizeof(int32_t));
      lps22hh_pressure_raw_get(&dev_ctx, data_raw_pressure.u8bit);
      pressure_hPa = lps22hh_from_lsb_to_hpa( data_raw_pressure.i32bit);
      
      sprintf((char*)tx_buffer, "pressure [hPa]:%6.2f\r\n", pressure_hPa);
      tx_com( tx_buffer, strlen( (char const*)tx_buffer ) );
    }

    if (reg.status.t_da)
    {
      memset(data_raw_temperature.u8bit, 0x00, sizeof(int16_t));
      lps22hh_temperature_raw_get(&dev_ctx, data_raw_temperature.u8bit);
      temperature_degC = lps22hh_from_lsb_to_celsius( data_raw_temperature.i16bit );
      
      sprintf((char*)tx_buffer, "temperature [degC]:%6.2f\r\n", temperature_degC );
      tx_com( tx_buffer, strlen( (char const*)tx_buffer ) );
    }
  }
}

工程文件:
stm32g474 lps22hh.rar (2.57 MB, 下载次数: 3)

虾扯蛋


回复

使用道具 举报

8587

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2019-8-29 21:45 | 显示全部楼层

这不算驱动移植吧

点评

应该叫什么?  详情 回复 发表于 2019-8-29 22:01


回复

使用道具 举报

6393

TA的帖子

10

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2019-8-29 22:01 来自手机 | 显示全部楼层
dcexpert 发表于 2019-8-29 21:45 这不算驱动移植吧
应该叫什么?


回复

使用道具 举报

8587

TA的帖子

14

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2019-8-29 22:57 | 显示全部楼层

感觉是在STM32G474RE上使用传感器,而没有涉及到传感器的驱动移植  

点评

这个工程里的LPS22HH的驱动是是官方提供的 驱动提供一个读取数据通过串口发送的DEMO 是应用在NUCLEO_STM32F411RE开发板上的 没有提供项目文件 改这个东西是为了方便网友(拿用主义)在G474平台上使用这  详情 回复 发表于 2019-8-30 21:56


回复

使用道具 举报

6393

TA的帖子

10

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2019-8-30 21:56 | 显示全部楼层
dcexpert 发表于 2019-8-29 22:57 感觉是在STM32G474RE上使用传感器,而没有涉及到传感器的驱动移植  

这个工程里的LPS22HH的驱动是是官方提供的

驱动提供一个读取数据通过串口发送的DEMO

是应用在NUCLEO_STM32F411RE开发板上的

没有提供项目文件

改这个东西是为了方便网友(拿用主义)在G474平台上使用这款传感器

因为ST将驱动都已经封装好

应用在G474或者其它单片机只需要配置好对应单片机的I2C和UART

再对代码做简单修改就可以在对应的单片机上使用

方便了很多

虾扯蛋


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /6 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-9-21 15:32 , Processed in 0.176873 second(s), 18 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表