历史上的今天
返回首页

历史上的今天

今天是:2024年10月15日(星期二)

正在发生

2018年10月15日 | 基于STM32的MS5540c压强温度传感器的应用

2018-10-15 来源:eefocus

3.5的库函数,stm32f10x系列的mcu,网上这个芯片的实例较少,而官方的代码an510这个文档找不到下载,datasheet写的也不甚明了。下面贴上我的基本程序给大家一个参考:


#include "main.h"
#include "Flash_LED.h"
#include "SPI_MS5540C.h"
#include "SysTick.h"

vu32 led_timer = 0; 
extern vu32 global_timer;
uint8_t detect_timer=0;
vu16 var_D1=0,var_D2=0;

int main()
{
 SystemInit();
 NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3); //8 preemption priority
  Init_Flash_LED();
 Init_SPI_Device_Clk();
 Init_SPI_Device();
 Compute_Para();
 while(1)
 { 
  if(((global_timer > led_timer) && (global_timer - led_timer  >= 200))||((global_timer < led_timer) && (0xffffffff - led_timer + global_timer >= 200)))
        {
          toggle_led();
          led_timer=global_timer;
         detect_timer++;
        }

 
    SPI_Control_Byte(0);
  Delay_ms(20);
  SPI_Control_Byte(1);
  Delay_ms(100);
  var_D1=SPI_Read();
  Delay_ms(20);
  SPI_Control_Byte(2);
  Delay_ms(100);
  var_D2=SPI_Read();
  Compute_value(var_D1,var_D2);
    //while(1);
 // */
}

}

时间来不及仔细整理,spi_ms5540c.c  如下,头文件里面就是些声明就不写了 另外main函数里面用到的延时是随便写的,官方datasheet是33ms的转换时间
#include "SPI_MS5540C.h"

uint16_t Control_D1=0x0f40;//0x03d0 // pressure conversion control_words
uint16_t Control_D2=0x0f20;//0x03c8 // temperature conversion control_words
uint16_t Control_read_word1=0x1d50;//0x0ea8;//
uint16_t Control_read_word2=0x1d60;//0x0eb0;//
uint16_t Control_read_word3=0x1d90;//0x0ec8;//
uint16_t Control_read_word4=0x1da0;//0x0ed0;//
uint16_t Control_Reset1=0x0015;  //the funtion "SPI_I2S_SendData" only could supply 8bit or 16bit send,and the chip ms5540c could start up with three high bits
uint16_t Control_Reset2=0x5540;
uint16_t Blank=0x9249;//1001 0010 0100 1001 send it to read the coversion result and avoid the wrong operation
vu16 pressure_value=0,temp_value=0;
vu16 para_C1=0,para_C2=0,para_C3=0,para_C4=0,para_C5=0,para_C6=0;
vu16 data1=0,data2=0,data3=0,data4=0;

void Init_SPI_Device(void)
{
   SPI_InitTypeDef SPI_InitStructure;
   GPIO_InitTypeDef GPIO_InitStructure;
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1|RCC_APB2Periph_GPIOA,ENABLE);//??SP1I?GPIOA??
   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//MOSI SCK??
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//??????
   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
   GPIO_Init(GPIOA,&GPIO_InitStructure);
   //GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;//SPI_CS
   //GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//????
   //GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
   //GPIO_Init(GPIOA,&GPIO_InitStructure);
   SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//??SPI???????????:SPI??????????
   SPI_InitStructure.SPI_Mode=SPI_Mode_Master;//??SPI????:????SPI
   SPI_InitStructure.SPI_DataSize=SPI_DataSize_16b;//??SPI?????:SPI????8????
   SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low; //??????????:?????
   SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;//???????????
   SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;//SPI_NSS_Soft;//NSS?????(NSS??)????(??SSI?)??:??NSS???SSI???
   SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_256;  //??????????:????????256
   SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //???????MSB???LSB???:?????MSB???
   //SPI_InitStructure.SPI_CRCPolynomial=7;//CRC???????
   SPI_Init(SPI1,&SPI_InitStructure);//??SPI_InitStruct???????????SPIx???
   SPI_Cmd(SPI1,ENABLE);//??SPI??
}

void SPI_Control_Byte(u8 xx)

   SPI_InitTypeDef SPI_InitStructure;
  SPI_Cmd(SPI1,DISABLE);
  SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//??SPI???????????:SPI??????????
   SPI_InitStructure.SPI_Mode=SPI_Mode_Master;//??SPI????:????SPI
   SPI_InitStructure.SPI_DataSize=SPI_DataSize_16b;//??SPI?????:SPI????8????
   SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low; //??????????:?????
   //SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;//???????????
   SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;//SPI_NSS_Soft;//NSS?????(NSS??)????(??SSI?)??:??NSS???SSI???
   SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_256;  //??????????:????????256
   SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //?
   SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;//??????????? 
   SPI_Init(SPI1,&SPI_InitStructure);//??SPI_InitStruct???????????SPIx???
   SPI_Cmd(SPI1,ENABLE);//??SPI??
 if(xx==0)
 {
 
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI1, Control_Reset1);
   while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); 
    SPI_I2S_ReceiveData(SPI1);
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI1, Control_Reset2);
   while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); 
    SPI_I2S_ReceiveData(SPI1);
 
 }
if(xx==1) 

  while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);
    SPI_I2S_SendData(SPI1, Control_D1);
   while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); 
    SPI_I2S_ReceiveData(SPI1);
  
}    
if(xx==2)
{
  while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI1, Control_D2);
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); 
    SPI_I2S_ReceiveData(SPI1);
  
}
if(xx==11)
{
  while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI1,Control_read_word1);
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); 
    SPI_I2S_ReceiveData(SPI1);
}
if(xx==12)
{
  while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI1,Control_read_word2);
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); 
    SPI_I2S_ReceiveData(SPI1);
}
if(xx==13)
{
  while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI1, Control_read_word3);
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); 
    SPI_I2S_ReceiveData(SPI1);
}
if(xx==14)
{
  while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI1, Control_read_word4);
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); 
    SPI_I2S_ReceiveData(SPI1);
}

}
uint16_t SPI_Read(void)
{
  SPI_InitTypeDef SPI_InitStructure;
  SPI_Cmd(SPI1,DISABLE);
     SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//??SPI???????????:SPI??????????
   SPI_InitStructure.SPI_Mode=SPI_Mode_Master;//??SPI????:????SPI
   SPI_InitStructure.SPI_DataSize=SPI_DataSize_16b;//??SPI?????:SPI????8????
   SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low; //??????????:?????
   //SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;//???????????
   SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;//SPI_NSS_Soft;//NSS?????(NSS??)????(??SSI?)??:??NSS???SSI???
   SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_256;  //??????????:????????256
   SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //? 
   SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;//??????????? 
   SPI_Init(SPI1,&SPI_InitStructure);//??SPI_InitStruct???????????SPIx???
   SPI_Cmd(SPI1,ENABLE);//??SPI??
 
//    SPI_InitTypeDef SPI_InitStructure;
//  SPI_Cmd(SPI1,DISABLE);
 //  SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;//??????????? 
  // SPI_Init(SPI1,&SPI_InitStructure);//??SPI_InitStruct???????????SPIx???
  // SPI_Cmd(SPI1,ENABLE);//??SPI??
// vu8 data1 = 0;
// vu8 data2 = 0;
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
 SPI_I2S_SendData(SPI1, Blank);
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); 
  return SPI_I2S_ReceiveData(SPI1);
 
}

u16 Read_Factory_words(void)
{
   SPI_InitTypeDef SPI_InitStructure;
  SPI_Cmd(SPI1,DISABLE);
   SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;//??????????? 
   SPI_Init(SPI1,&SPI_InitStructure);//??SPI_InitStruct???????????SPIx???
   SPI_Cmd(SPI1,ENABLE);//??SPI??
// vu8 data1 = 0;
// vu8 data2 = 0;
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
 SPI_I2S_SendData(SPI1, Blank);
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); 
  return SPI_I2S_ReceiveData(SPI1);

}

void TIM2_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);      //enable the TIM2 CLK
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);    // enable the GPIOa CLK
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_3 ;   //TIM2 CH4
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;     
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  //GPIO_PinRemapConfig(GPIO_FullRemap_TIM4, ENABLE);  // if use the remap ,afio is need
 
  //GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1;
  //GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void TIM2_Mode_Config(u16 CCR4_Val)
{
 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 TIM_OCInitTypeDef  TIM_OCInitStructure;
 
  TIM_TimeBaseStructure.TIM_Period = 2197;      
  TIM_TimeBaseStructure.TIM_Prescaler = 0;     //the PWM period is 20Hz
  TIM_TimeBaseStructure.TIM_ClockDivision =0; 
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

 // PWM1 Mode configuration: Channel4
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;     
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = CCR4_Val;   //????4??????,??????????PWM
  TIM_OC4Init(TIM2, &TIM_OCInitStructure);   //????4
  TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
  TIM_ARRPreloadConfig(TIM2, ENABLE);    // ??TIM4?????ARR

  // TIM4 enable counter
   TIM_Cmd(TIM2, ENABLE);                   //?????4 
}
void Init_SPI_Device_Clk(void)
{
  TIM2_GPIO_Config();
  TIM2_Mode_Config(1099);
}

void Compute_Para(void)
{
 u16 tmp=0;
 
    SPI_Control_Byte(0);
  
  
   //SPI_Control_Byte(0);
  //SPI_Control_Byte(0);
  // Delay_ms(100);
   //Temperature_Value=SPI_Read();
  SPI_Control_Byte(11);
  //Delay_ms(1000);
  data1=SPI_Read();
    
   SPI_Control_Byte(12);
   //Delay_ms(1000);
  data2=SPI_Read();
  
  SPI_Control_Byte(13);
  //Delay_ms(1000);
  data3=SPI_Read();
  
  SPI_Control_Byte(14);
  //Delay_ms(1000);
  data4=SPI_Read();
  
  Delay_ms(20);
  SPI_Control_Byte(2);

    tmp=data1&0xfffe;
    para_C1=tmp>>1;
    tmp=data3&0x003f;
    para_C2=tmp<<6;
    tmp=data4&0x003f;
    para_C2+=tmp;
    tmp=data4&0xffc0;
    para_C3=tmp>>6;
    tmp=data3&0xffc0;
    para_C4=tmp>>6;
    tmp=data1&0x0001;
    para_C5=tmp<<10;
    tmp=data2&0xffc0;
    para_C5+=tmp>>6;
    para_C6=data2&0x003f;
}
void Compute_value(u16 var_d1,u16 var_d2)
{
  double var_dt,var_x,var_off,var_sense,temp_value1,pressure_value1,var_t2,var_p2;
  var_dt=var_d2-20224-8*para_C5;
  var_off=para_C2*4+(para_C4-512)*var_dt/4096;
  var_sense=para_C1+para_C3*var_dt/1024+24576;
  var_x=var_sense*(var_d1-7168)/16384-var_off;
  temp_value1=(var_dt*(para_C6+50)/1024+200);
  pressure_value1=(var_x*10/32+2500);
 if(temp_value1<200)
 {
   var_t2=11*(para_C6+24)*(200-temp_value1)*(200-temp_value1)/1048576;
   var_p2=3*var_t2*(pressure_value1-3500)/16384;
 }
 else if(temp_value1>450)
 {
   var_t2=3*(para_C6+24)*(450-temp_value1)*(450-temp_value1)/1048576;
  var_p2=2*var_t2*(pressure_value1-10000)/16384;
  } 
 else
 {
   var_t2=0;
   var_p2=0;
  }
 temp_value=(int)(temp_value1-var_t2);
  pressure_value=(int)(pressure_value1-var_p2);
}


推荐阅读

史海拾趣

EIC [EIC discrete Semiconductors]公司的发展小趣事

EIC公司一直秉持着环保责任和社会责任感。公司在生产过程中积极采用环保材料和工艺,减少废弃物排放和能源消耗。同时,EIC还积极参与社会公益活动,为社会做出了积极贡献。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实的基础。

First Sensor公司的发展小趣事

在国内市场取得一定成绩后,EIC公司开始将目光投向国际市场。公司积极参加国际电子展会,与国际知名企业进行技术交流与合作,不断拓展海外市场。通过国际化战略的实施,EIC的产品逐渐进入了欧洲、北美等发达国家和地区,并在当地建立了完善的销售和服务网络。这一过程中,EIC不仅提升了品牌影响力,也积累了丰富的国际化运营经验。

BNS Solutions公司的发展小趣事

在快速发展的过程中,BNS Solutions公司始终注重品质管理和品牌建设。公司建立了一套完善的质量管理体系,从原材料采购到产品生产、销售等各个环节都严格把控质量。同时,公司还注重品牌形象的塑造和维护,通过广告宣传、公关活动等方式不断提升品牌知名度和美誉度。这些举措使得BNS Solutions公司的产品在市场上具有更高的竞争力,赢得了消费者的信赖和喜爱。

C&K Components公司的发展小趣事

进入千禧年代,随着全球经济的融合和科技的快速发展,ITT Industries看中了C&K在开关领域的领先地位和强大实力,决定对其进行收购。这次并购使C&K成为ITT的开关部门,但公司仍然保留了C&K的名称和品牌。并购后的C&K借助ITT的全球资源和平台优势,进一步提升了自身的研发能力和市场竞争力,实现了更快速的发展。

Gaomi Xinghe Electronics公司的发展小趣事

背景:随着中国经济的快速发展和消费者对电子产品需求的不断增加,Galaxy公司敏锐地捕捉到这一市场机遇。

行动:在2003年初,Galaxy以缜密的市场调研为基础,全力部署进入大陆市场。同年6月,公司推出了以“影驰”命名的Geforce家族系列产品,迅速吸引了众多游戏发烧友和电子产品爱好者的关注。随后,公司又在多个城市设立了销售和服务网点,为消费者提供更加便捷的产品体验和服务。

成果:经过多年的深耕细作,Galaxy在大陆市场取得了显著成绩,品牌影响力不断增强,市场份额稳步提升。

Hei Inc Optoelectronic Division公司的发展小趣事
根据实际应用环境的不同,需要考虑温度、湿度、振动等因素对控制电路的影响,并采取相应的防护措施。

问答坊 | AI 解惑

我国成功发射第二颗北斗导航卫星

4月15日0时16分,我国在西昌卫星发射中心用“长征三号丙”运载火箭,成功将第二颗北斗导航卫星送入预定轨道。新华社记者李刚摄 15日零时16分,我国在西昌卫星发射中心用“长征三号丙”运载火箭,成功将第2颗北斗导航卫星送入预定轨道。 中国卫 ...…

查看全部问答>

智能型节能灯泡

部分亮电灯泡,更加环保节能 我们家里使用的灯,基本都是全部亮的,房子的每个地方 都可以照到。不过实际上,我们需要照明的地方可能就只 有某一部分地方,那么其它地方的光似乎就有些浪费了。 现在有了这种可以部分亮电灯泡,就环保节能多了。 ...…

查看全部问答>

cache 是用来干什么的, 他和DDR有什么区别?

cache 是用来干什么的, 他和DDR有什么区别?…

查看全部问答>

5402求助帖

各位大虾请帮忙!我用SEED-XDS510PLUS调试5402板子为什么不能与CCS连接?请出出主意应该从哪些方面考虑出现的问题呢?谢谢了~~…

查看全部问答>

开发心得

能有一个全面功能的开发板,是顺利开发产品的最佳捷径.…

查看全部问答>

TI 最新太阳能逆变板预览

附件中是TI提供的太阳能逆变板资料,里面面有电路图,也没有源代码,   由于这块板子还没上市,听说更多详细资料要等之后几个月更新controlsuite才有   电源 连接线   附带的U盘和灯,U盘里面就是附件中的资料   ...…

查看全部问答>

layout设计

何为layout设计,鄙人是菜鸟,望见怪…

查看全部问答>

读《Exploring GNU radio》笔记

Exploring GNU radio(GNU radio探密)是GNU radio创始人Eric Blossom所写的,为我们用GNU radio工具构建软件无线电系统做了简明扼要的介绍。读完之后有几点需要自己注意的地方:1、ADC的主要特性:采样率和动态范围。采样率是ADC测量模拟信号的速度 ...…

查看全部问答>

S5PV210 多媒体预留内存空间 1 - FIMC控制器

由于GPU 多媒体解码 camera输入以及overlay显示等操作需要大块的连续物理内存,S5PV210开发板在初始化的过程中,会为这些多媒体相关驱动预留内存,这些预留的物理内存不能再被系统的其他部件使用,因此调整这些预留空间使之既能满足项目的需求,同 ...…

查看全部问答>

stm32 简单例程

stm32 简单例程stm32 简单例程stm32 简单例程stm32 简单例程stm32 简单例程stm32 简单例程stm32 简单例程…

查看全部问答>