以下文件为源文件
/**
-----------------------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