io口模拟spi,stm32f103与MS5611基于spi总线的温度压力高度数据读取

以下文件为源文件

/**

    -----------------------MS5611驱动 && IO口模拟SPI驱动-------------------------

  *****************************************************************************/

/* 包含的头文件 --------------------------------------------------------------*/
#include "ms5611_spi.h"
#include "delay.h"
#include "math.h"
/***************************************************
函数名称:MS_SPI_Delay
功    能:SPI延时
作    者:MANGO
****************************************************/
void MS_SPI_Delay(void)
{
  uint16_t cnt = 5;

  while(cnt--);
}
/***************************************************
函数名称:MS_SPI_GPIO_Conf
功    能:SPI引脚配置
作    者:MANGO
****************************************************/
void MS_SPI_GPIO_Conf(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      //IO口速度设置为50MHz
    
    /* CS CLK MOSI */
    GPIO_InitStructure.GPIO_Pin = MS_PIN_SPI_CS|MS_PIN_SPI_CLK|MS_PIN_SPI_MOSI;
    GPIO_Init(GPIOB, &GPIO_InitStructure);                                // 三个IO均是PORT_B,配置参数相同,可以一起初始化
    
    /* MISO */
    GPIO_InitStructure.GPIO_Pin = MS_PIN_SPI_MISO;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;    //浮空输入
    GPIO_Init(MS_PORT_SPI_MISO, &GPIO_InitStructure);
}   
 /***************************************************
函数名称:MS_SPI_Init
功    能:SPI初始化
作    者:MMANGO
****************************************************/
void MS_SPI_Init(void)
{
    MS_SPI_GPIO_Conf();
    
    MS_SPI_CS_DISABLE;
    MS_SPI_CLK_HIGH;
    MS_SPI_MOSI_HIGH;
    
}
 /***************************************************
函数名称:MS_SPI_WriteByte
功    能:SPI写一字节数据
参    数:TxData  发送的字节数据
作    者:MANGO
****************************************************/
void MS_SPI_WriteByte(uint8_t TxData)
{
  uint8_t cnt;

  for(cnt=0; cnt<8; cnt++)
  {
    MS_SPI_CLK_LOW;                                 //时钟 - 低
    MS_SPI_Delay();

    if(TxData & 0x80)                            //发送数据
      MS_SPI_MOSI_HIGH;
    else
      MS_SPI_MOSI_LOW;
    TxData <<= 1;

//    MS_SPI_Delay();
    MS_SPI_CLK_HIGH;                                //时钟 - 高
    MS_SPI_Delay();
  }
}
 /***************************************************
函数名称:MS_SPI_ReadByte
功    能:SPI读一字节数据
参    数:RxData  接收的字节数据
作    者:MANGO
****************************************************/
uint8_t MS_SPI_ReadByte(void)
{
  uint8_t cnt;
  uint8_t RxData = 0;

  for(cnt=0; cnt<8; cnt++)
  {
    MS_SPI_CLK_LOW;                                 //时钟 - 低
    MS_SPI_Delay();

    RxData <<= 1;
    if(MS_SPI_MISO_READ)                            //读取数据
    {
      RxData |= 0x01;
    }

    MS_SPI_CLK_HIGH;                                //时钟 - 高
    MS_SPI_Delay();
  }

  return RxData;
}
 /***************************************************
函数名称:MS_Init
功    能:MS5611初始化
参    数:coef 地址1-6位校准系数,0为出产数据和设置,7为串行代码和CRC
作    者:MANGO
****************************************************/
void MS_Init(uint16_t coef[8])
{
    uint16_t i;
    uint8_t data[16]={0};

    
    MS_SPI_CS_ENABLE;
    MS_SPI_WriteByte(0x1E);     //Reset 5611
    delay_us(2800);
    MS_SPI_CS_DISABLE;    
/*********向MS5611写指令返回系数************/
    for(i=0;i<8;i++)
    {
        MS_SPI_Delay();
        MS_SPI_CS_ENABLE;
        MS_SPI_WriteByte(0xa0+2*i);    
        data[2*i]=MS_SPI_ReadByte();
        data[2*i+1]=MS_SPI_ReadByte();
        MS_SPI_CS_DISABLE;
        coef[i]=data[2*i]*256+data[2*i+1];
    }    
}
 /***************************************************
函数名称:MS_Read_Temperature
功    能:MS5611温度读取
参    数:ms_data 地址0为温度,1为压力,2为高度;coef见上面函数
作    者:MANGO
****************************************************/
void MS_Read_Data(uint16_t coef[8] , float ms_data[3])
{
    uint32_t D1,D2;
    int      dT,T2,TEMP;
    int64_t  OFF,SENS,OFF2,SENS2;
    
    MS_SPI_CS_ENABLE;
    MS_SPI_WriteByte(0x58);
    MS_SPI_CS_DISABLE;
    delay_us(8220);
    MS_SPI_CS_ENABLE;
    MS_SPI_WriteByte(0x00);
    D2=MS_SPI_ReadByte()*65536+MS_SPI_ReadByte()*256+MS_SPI_ReadByte();
    MS_SPI_CS_DISABLE;
    dT = D2 - ((uint32_t)coef[5])*256;
    TEMP = 2000 + dT*((float)coef[6])/8388608;
    
    MS_SPI_CS_ENABLE;
    MS_SPI_WriteByte(0x48);
    MS_SPI_CS_DISABLE;
    delay_us(8220);
    MS_SPI_CS_ENABLE;
    MS_SPI_WriteByte(0x00);
    D1=MS_SPI_ReadByte()*65536+MS_SPI_ReadByte()*256+MS_SPI_ReadByte();
    MS_SPI_CS_DISABLE;
    
    //二阶温度补偿
    if(TEMP<2000)
    {
        T2 = (float)(dT*dT)/2147483648;
        OFF2 = 2.5f*(TEMP-2000)*(TEMP-2000);
        SENS2 = 1.25f*(TEMP-2000)*(TEMP-2000);        
        if(TEMP<-1500)
        {
            OFF2 = OFF2 +7*(TEMP+1500)*(TEMP+1500);
            SENS2 = SENS2 +5.5f*(TEMP+1500)*(TEMP+1500);
        }
            
    }
    else
    {
        T2 = 0;
        OFF2 = 0;
        SENS2 = 0;
    }
    
    ms_data[0]=(TEMP-T2)/100.0;            //温度
    
    OFF = ((int64_t)coef[2])*65536 + (((int64_t)coef[4])*dT)/128 - OFF2;
    SENS = ((int64_t)coef[1])*32768 + (((int64_t)coef[3])*dT)/256 - SENS2;
    
    ms_data[1] = ((D1*SENS/2097152 - OFF)/32768);           
    ms_data[2] = (44330.0f*(1.0f - pow((float)ms_data[1]/101325.0f, 0.190295f)));      //气压高度转换公式   高度单位 m
    ms_data[1] = ms_data[1]/100.0;                   //压强    mbar

}

以下文件为头文件

/**
    -----------------------MS5611驱动 && IO口模拟SPI驱动-------------------------

  *****************************************************************************/

/* 定义防止递归包含 ----------------------------------------------------------*/
#ifndef __MS_SPI_H
#define __MS_SPI_H

/* 包含的头文件 --------------------------------------------------------------*/
#include "stm32f10x.h"


/* 宏定义 --------------------------------------------------------------------*/
#define MS_PORT_SPI_CS                                    GPIOB
#define MS_PORT_SPI_CLK                                    GPIOB
#define MS_PORT_SPI_MISO                                GPIOB
#define MS_PORT_SPI_MOSI                                GPIOB

#define MS_PIN_SPI_CS                                        GPIO_Pin_3
#define MS_PIN_SPI_CLK                                    GPIO_Pin_6
#define MS_PIN_SPI_MISO                                    GPIO_Pin_4
#define MS_PIN_SPI_MOSI                                    GPIO_Pin_5

#define MS_SPI_CS_ENABLE                                (MS_PORT_SPI_CS->BRR  = MS_PIN_SPI_CS)            //置0
#define MS_SPI_CS_DISABLE                                (MS_PORT_SPI_CS->BSRR = MS_PIN_SPI_CS)          //置1
#define MS_SPI_CLK_LOW                                    (MS_PORT_SPI_CLK->BRR      = MS_PIN_SPI_CLK)  //置0
#define MS_SPI_CLK_HIGH                                    (MS_PORT_SPI_CLK->BSRR  = MS_PIN_SPI_CLK)   //置1
#define MS_SPI_MOSI_LOW                                 (MS_PORT_SPI_MOSI->BRR = MS_PIN_SPI_MOSI) //置0
#define MS_SPI_MOSI_HIGH                                (MS_PORT_SPI_MOSI->BSRR = MS_PIN_SPI_MOSI) //置1

#define MS_SPI_MISO_READ                                (MS_PORT_SPI_MISO->IDR & MS_PIN_SPI_MISO)     //检测输入

/* 函数申明 ------------------------------------------------------------------*/
void MS_SPI_GPIO_Conf(void);    //初始化IO口
void MS_SPI_Init(void);             //初始化SPI口
void MS_SPI_WriteByte(uint8_t TxData);    
uint8_t MS_SPI_ReadByte(void);
void MS_Init(uint16_t coef[8]);
void MS_Read_Data(uint16_t coef[8] , float ms_data[2]);

#endif































猜你喜欢

转载自blog.csdn.net/jjadads/article/details/80038120