OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 665|回复: 0

分享:MS5541C压力传感器代码

[复制链接]

17

主题

45

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
479
金钱
479
注册时间
2016-1-20
在线时间
48 小时
发表于 2019-7-15 23:15:58 | 显示全部楼层 |阅读模式
本帖最后由 feifeivictor 于 2019-7-15 23:16 编辑

#include "sys.h"

#define SCLK_PORT GPIOD
#define SCLK_PIN GPIO_Pin_4

#define DOUT_PORT GPIOD
#define DOUT_PIN GPIO_Pin_3

#define DIN_PORT GPIOD
#define DIN_PIN GPIO_Pin_6

#define MCLK_PORT GPIOB
#define MCLK_PIN GPIO_Pin_5

#define SCLK_high() GPIO_SetBits(SCLK_PORT,SCLK_PIN)
#define SCLK_low() GPIO_ResetBits(SCLK_PORT,SCLK_PIN)

#define DIN_high() GPIO_SetBits(DIN_PORT,DIN_PIN)
#define DIN_low() GPIO_ResetBits(DIN_PORT,DIN_PIN)

#define DOUT PDin(3)


typedef struct {
unsigned int SENST1;
unsigned int OFFT1;
unsigned int TCS;
unsigned int TCO;
unsigned int Tref;
unsigned int TEMPSENS;
} coeff_t;

coeff_t c={0};
unsigned int DT;

void MS5541C_IO_Init()
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD, ENABLE);         //ê1ÄüPB,PD¶Ë¿úê±Öó
       
         GPIO_InitStructure.GPIO_Pin = MCLK_PIN;                                 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;               
GPIO_Init(MCLK_PORT, &GPIO_InitStructure);                                         

          GPIO_InitStructure.GPIO_Pin = SCLK_PIN;                               
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                
         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
         GPIO_Init(SCLK_PORT, &GPIO_InitStructure);                                         
       
                  GPIO_InitStructure.GPIO_Pin = DIN_PIN;                               
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                
         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
         GPIO_Init(DIN_PORT, &GPIO_InitStructure);       
       
         GPIO_InitStructure.GPIO_Pin  = DOUT_PIN;
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
         GPIO_Init(DOUT_PORT, &GPIO_InitStructure);
}

u16 GetWord(char str[7])
{
        int i;
        u16 ret=0;
        u16 temp=0;
        SCLK_low();
        delay_us(10);
        //3bit start bits
        for(i=0;i<3;i++)
        {
                DIN_high();
               
                delay_us(10);
                SCLK_high();
                delay_us(10);
                SCLK_low();
        }
        delay_us(10);
        //6bit word address
        for(i=0;i<6;i++)
        {
                if(str=='1')
                {
                        DIN_high();
                }
                else if(str=='0')
                {
                        DIN_low();
                }
                else
                {
                        printf("GetWord error\r\n");
                }
               
                delay_us(10);
                SCLK_high();
                delay_us(10);
                SCLK_low();
        }
        //3bit stop bits
        for(i=0;i<3;i++)
        {
                DIN_low();
               
                delay_us(10);
                SCLK_high();
                delay_us(10);
                SCLK_low();
        }

       
        for(i=0;i<1;i++)
        {
                DIN_low();
               
                delay_us(10);
                SCLK_high();
                delay_us(10);
                SCLK_low();
        }
       
        delay_us(10);
        SCLK_high();
        delay_us(10);
       
        for(i=0;i<16;i++)
        {
                SCLK_low();
                delay_us(10);
               
                temp=DOUT;
                ret=ret|(DOUT<<(15-i));
               
                SCLK_high();
                delay_us(10);

        }
       

        SCLK_low();
        delay_us(10);
       
        return ret;
}

void MS5541C_Reset()
{
        int i;
        SCLK_low();
        delay_us(10);
        for(i=0;i<16;i++)
        {
                SCLK_low();
                delay_us(10);
               
                if(i%2==0)
                {
                        DIN_high();
                }
                else
                {
                        DIN_low();
                }
               
                SCLK_high();
                delay_us(10);       
        }
        for(i=0;i<5;i++)
        {
                SCLK_low();
                delay_us(10);
               
                DIN_low();
               
                SCLK_high();
                delay_us(10);               
        }
        SCLK_low();
        delay_us(10);
}

u16 GetWord1()
{
        u16 temp=GetWord("010101");
        printf("GetWord1=%d\r\n",temp);
        return temp;
}

u16 GetWord2()
{
        u16 temp=GetWord("010110");
        printf("GetWord2=%d\r\n",temp);
        return temp;
}

u16 GetWord3()
{
        u16 temp=GetWord("011001");
        printf("GetWord3=%d\r\n",temp);
        return temp;
}

u16 GetWord4()
{
        u16 temp=GetWord("011010");
        printf("GetWord4=%d\r\n",temp);
        return temp;
}

u16 GetD1()
{
        int i;
        u8 cmd[12]={1,1,1,1,0,1,0,0,0,0,0,0};
        u16 ret=0;
        u16 temp;
        SCLK_low();
        delay_us(10);
       
        for(i=0;i<12;i++)
        {
                if(cmd==1)
                {
                        DIN_high();
                }
                else
                {
                        DIN_low();
                }
               
                SCLK_high();
                delay_us(10);
               
                SCLK_low();
                delay_us(10);
        }
       
        delay_ms(50);
       
        for(i=0;i<16;i++)
        {
                SCLK_high();
                delay_us(10);
                SCLK_low();
               
                temp=DOUT;
                ret=ret|(temp<<(15-i));
               
                delay_us(10);
               
        }
                SCLK_high();
                delay_us(10);
                SCLK_low();
                delay_us(10);
        printf("GetD1=%d\r\n",ret);
        return ret;
}

u16 GetD2()
{
        int i;
        u8 cmd[12]={1,1,1,1,0,0,1,0,0,0,0,0};
        u16 ret=0;
        u16 temp;
        SCLK_low();
        delay_us(10);
       
        for(i=0;i<12;i++)
        {
                if(cmd==1)
                {
                        DIN_high();
                }
                else
                {
                        DIN_low();
                }
               
                SCLK_high();
                delay_us(10);
               
                SCLK_low();
                delay_us(10);
        }
       
        delay_ms(50);
       
        for(i=0;i<16;i++)
        {
                SCLK_high();
                delay_us(10);
                SCLK_low();
               
                temp=DOUT;
                ret=ret|(temp<<(15-i));
               
                delay_us(10);
               
        }
                SCLK_high();
                delay_us(10);
                SCLK_low();
                delay_us(10);
        printf("GetD2=%d\r\n",ret);
        return ret;
}

void get_coeffs(coeff_t* coefficients)
{
unsigned int w1, w2, w3, w4;


w1 = GetWord1();
w2 = GetWord2();
w3 = GetWord3();
w4 = GetWord4();

// print("w1 = %u\tw2 = %u\tw3 = %u\tw4 = %u\n\r", w1, w2, w3, w4);

coefficients->SENST1 = w1 >> 3;

coefficients->OFFT1 = (w1 & 0x07) << 10;  //0b111
coefficients->OFFT1 |= w2 >> 6;

coefficients->TCS = w3 >> 6;

coefficients->TCO = w4 >> 7;

coefficients->Tref = (w2 & 0x3f) << 6; //0b111111
coefficients->Tref |= w3 & 0x3f;       //0b111111

coefficients->TEMPSENS = w4 & 0x7f; //0b1111111
}



float GetTemperature()
{
         int c1,c2,c3,c4,c5,c6;       
         int d1,d2;
         int ut1;
         int dt;
         int off,sens,p;
         float tem;
         get_coeffs(&c);
         c1=c.SENST1;
         c2=c.OFFT1;
         c3=c.TCS;
         c4=c.TCO;
         c5=c.Tref;
         c6=c.TEMPSENS;
         d1=GetD1();
         d2=GetD2();
         ut1=8*c5+10000;
         dt=d2-ut1;
         //temp 0.1 degree
         tem=(float)(200+dt*(c6+100)/(1<<11))*0.1;
         printf("temp=%f\r\n",tem);
         off = c2 + ((c4-250)*dt)/(1<<12) + 10000;
         sens = c1/2 + ((c3+200)*dt)/(1<<13) + 3000;
         //pressure,mbar
         p= (sens * (d1-off))/(1<<12) + 1000;
         printf("pressure=%d mbar\r\n",p);
         return tem;
}

int GetPressure()
{
         int c1,c2,c3,c4,c5,c6;       
         int d1,d2;
         int ut1;
         int dt;
         int off,sens,p;
         float tem;
         get_coeffs(&c);
         c1=c.SENST1;
         c2=c.OFFT1;
         c3=c.TCS;
         c4=c.TCO;
         c5=c.Tref;
         c6=c.TEMPSENS;
         d1=GetD1();
         d2=GetD2();
         ut1=8*c5+10000;
         dt=d2-ut1;
         //temp 0.1 degree
         tem=(float)(200+dt*(c6+100)/(1<<11))*0.1;
         printf("temp=%f\r\n",tem);
         off = c2 + ((c4-250)*dt)/(1<<12) + 10000;
         sens = c1/2 + ((c3+200)*dt)/(1<<13) + 3000;
         //pressure,mbar
         p= (sens * (d1-off))/(1<<12) + 1000;
         printf("pressure=%d mbar\r\n",p);
         return p;
}




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-27 05:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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