3350|6

7

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

LPS22HB代码移植 [复制链接]

 大家好,我最近在使用lps22hb这颗芯片,发现读到的压力值不对,只有0.7kPa,温度值正确。
官方提供了read_data_simple.c的例程,使用的是cube平台,我想使用smt32的库函数。我修改了原文中的platform_write和platform_read两个函数,如下:

  1. /*********************************************************************
  2. * SPI1_Init : LPS22HB
  3. *********************************************************************/
  4. void SPI1_Init(void)
  5. {
  6.         GPIO_InitTypeDef GPIO_InitStructure;
  7.           SPI_InitTypeDef SPI_InitStructure;
  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE);
  9.        
  10.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; // SCK/MISO/MOSI                                                                         
  11.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                     // 复用推挽输出
  12.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  14.        
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                        // CS
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 // 推挽输出
  17.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  18.         GPIO_Init(GPIOA, &GPIO_InitStructure);       
  19.         GPIO_SetBits(GPIOA, GPIO_Pin_4);                                 // CS拉高       

  20.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // 全双工                                                                         
  21.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                         // 主机模式
  22.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                // 8位帧结构
  23.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                                 // 串行同步时钟的空闲状态为高电平
  24.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                         // 串行同步时钟的第2个跳变沿(上升或下降)数据被采样
  25.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                                 // NSS信号由软件(SSI位)控制, 片选
  26.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; // 波特率预分频值为256, 72M/256=281.25K                                                                         
  27.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                     // 数据传输从MSB位开始
  28.         SPI_InitStructure.SPI_CRCPolynomial = 7;                             // CRC值计算的多项式
  29.         SPI_Init(SPI1, &SPI_InitStructure);                              // 根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
  30.         SPI_Cmd(SPI1, ENABLE);                                           // 使能SPI外设         
  31. }

  32. /*********************************************************************
  33. * SPI1 speed setting
  34. * SPI_BaudRatePrescaler_2   2分频   
  35. * SPI_BaudRatePrescaler_8   8分频   
  36. * SPI_BaudRatePrescaler_16  16分频  
  37. * SPI_BaudRatePrescaler_256 256分频
  38. *********************************************************************/
  39. /*void SPI1_SetSpeed(u8 SPI_BaudRatePrescaler)
  40. {
  41.           assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));
  42.         SPI1->CR1 &= 0XFFC7;
  43.         SPI1->CR1 |= SPI_BaudRatePrescaler;                                     // 设置SPI1速度
  44.         SPI_Cmd(SPI1,ENABLE);
  45. }*/

  46. u8 SPIx_Send_Byte(SPI_TypeDef* SPIx, u8 dat)
  47. {
  48.         u8 retry = 0;                                                                                  // 超时处理, 避免程序死在这里
  49.         while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET)    // 检查指定的SPI标志位设置与否: 发送缓存空标志位, 为1表示空
  50.         {
  51.                 retry++;
  52.                 if(retry > 200)
  53.                         return 0;
  54.         }       
  55.         SPI_I2S_SendData(SPIx, dat);                                     // 通过外设SPIx发送1字节
  56.         retry = 0;
  57.         while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET)   // 检查指定的SPI标志位设置与否: 接收缓存非空标志位, 为1表示包含有效数据
  58.         {
  59.                 retry++;
  60.                 if(retry > 200)
  61.                         return 0;
  62.         }       
  63.         return SPI_I2S_ReceiveData(SPIx);                                // 返回SPIx最近接收的数据                                            
  64. }

  65. void SPIx_Send_nByte(SPI_TypeDef* SPIx, u8 *buf, u16 len)
  66. {
  67.         u16 i;
  68.         for (i=0; i<len; i++)
  69.         {
  70.                 SPIx_Send_Byte(SPIx, *buf++);
  71.         }
  72. }

  73. void SPIx_Read_nByte(SPI_TypeDef* SPIx, u8 *buf, u16 len)
  74. {
  75.     u16 i;
  76.         for (i=0; i<len; i++)
  77.         {
  78.             *buf++ = SPIx_Send_Byte(SPIx, 0xFF);                          // 发送一个哑字节以读取数据
  79.         }
  80. }

  81. static int32_t platform_write(void *handle, uint8_t Reg, uint8_t *Bufp, uint16_t len)
  82. {
  83.     YL_Cs_L();
  84.         SPIx_Send_Byte(handle, Reg);
  85.         SPIx_Send_nByte(handle, Bufp, len);
  86.         YL_Cs_H();
  87.         return 0;
  88. }

  89. static int32_t platform_read(void *handle, uint8_t Reg, uint8_t *Bufp, uint16_t len)
  90. {
  91.     Reg |= 0x80;
  92.         YL_Cs_L();
  93.         SPIx_Send_Byte(handle, Reg);
  94.         SPIx_Read_nByte(handle, Bufp, len);
  95.         YL_Cs_H();
  96.         return 0;
  97. }

  98. /*********************************************************************
  99. * Lps_Config : 获取压力传感器数据
  100. * err : 0-正确, 1-ID号有错
  101. *********************************************************************/
  102. u8 Lps_Config(void)
  103. {
  104.         u8 err=0;
  105.     /* Initialize mems driver interface */
  106.     dev_ctx.write_reg = platform_write;
  107.     dev_ctx.read_reg = platform_read;
  108.     dev_ctx.handle = SPI1;
  109.    
  110.     /* Check device ID */
  111.     lps22hb_device_id_get(&dev_ctx, &whoamI);
  112.     if (whoamI != LPS22HB_ID)
  113.         {
  114.         err = 1;
  115.         }
  116.    
  117.     /* Restore default configuration */
  118.     lps22hb_reset_set(&dev_ctx, PROPERTY_ENABLE);
  119.     do {
  120.       lps22hb_reset_get(&dev_ctx, &rst);
  121.     } while (rst);
  122.    
  123.     /* Enable Block Data Update */
  124.     //lps22hb_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);
  125.    
  126.     /* Can be enabled low pass filter on output */
  127.     lps22hb_low_pass_filter_mode_set(&dev_ctx, LPS22HB_LPF_ODR_DIV_2);
  128.    
  129.     /* Can be set Data-ready signal on INT_DRDY pin */
  130.     //lps22hb_drdy_on_int_set(&dev_ctx, PROPERTY_ENABLE);
  131.    
  132.     /* Set Output Data Rate */
  133.     lps22hb_data_rate_set(&dev_ctx, LPS22HB_ODR_10_Hz);
  134.         return err;

  135. }

  136. /*********************************************************************
  137. * Get_Lps_Data : 获取压力传感器数据
  138. * err : 0-正确, 1-ID号有错, 2-读取出错
  139. *********************************************************************/
  140. u8 Get_Lps_Data(float *pressure_kPa, float *temperature_degC)
  141. {
  142.     uint8_t reg;
  143.     u8 err = 0;
  144.         float pressure_hPa = 0.0;
  145.    
  146.     /* Read output only if new value is available */
  147.     lps22hb_press_data_ready_get(&dev_ctx, ®);
  148.     if (reg)
  149.     {
  150.         memset(data_raw_pressure.u8bit, 0x00, sizeof(int32_t));
  151.         lps22hb_pressure_raw_get(&dev_ctx, data_raw_pressure.u8bit);        
  152.         pressure_hPa = lps22hb_from_lsb_to_hpa(data_raw_pressure.i32bit);
  153.                 *pressure_kPa = pressure_hPa/10.0;
  154.         
  155.         memset(data_raw_temperature.u8bit, 0x00, sizeof(int16_t));
  156.         lps22hb_temperature_raw_get(&dev_ctx, data_raw_temperature.u8bit);        
  157.         *temperature_degC = lps22hb_from_lsb_to_degc(data_raw_temperature.i16bit);
  158.     }
  159.         else err = 1;
  160.         return err;
  161. }
复制代码


请大家帮我分析下,代码上有没有问题?




read_data_simple.c

9.08 KB, 下载次数: 15

最新回复

没研究一下新版的问题出在哪?  详情 回复 发表于 2018-12-25 13:59
点赞 关注
 
 

回复
举报

7

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
先自顶一发了
 
 
 

回复

9790

帖子

24

TA的资源

版主

板凳
 
这个是我之前的测试代码,接口是I2C,你通过SPI如果能读取正确的温度值说明通信应该没有问题
安全起见你可以再读一次WHO AM I寄存器确定一下
然后参考我的这个贴子配置一下寄存器,再读一下数据看看是否正确
如果你是连续读取记得判断DRDY信号
https://bbs.eeworld.com.cn/forum ... 6&highlight=LPS22HB
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

4
 
littleshrimp 发表于 2018-12-24 13:23
这个是我之前的测试代码,接口是I2C,你通过SPI如果能读取正确的温度值说明通信应该没有问题
安全起见你可 ...

非常感谢,是不是由于没有等待P_DA位为1,我回去试下。另外如果读P_DA还需要看DRDY信号吗?

点评

判断P_DA也可以  详情 回复 发表于 2018-12-24 13:45
 
 
 

回复

9790

帖子

24

TA的资源

版主

5
 
tubujia 发表于 2018-12-24 13:38
非常感谢,是不是由于没有等待P_DA位为1,我回去试下。另外如果读P_DA还需要看DRDY信号吗?

判断P_DA也可以
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

6
 
已解决,目前最新的官方代码有问题,用老版本ok,结帖。

点评

没研究一下新版的问题出在哪?  详情 回复 发表于 2018-12-25 13:59
 
 
 

回复

9790

帖子

24

TA的资源

版主

7
 
tubujia 发表于 2018-12-25 13:31
已解决,目前最新的官方代码有问题,用老版本ok,结帖。

没研究一下新版的问题出在哪?
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表