以下文件为源文件

/**

-----------------------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

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

  1. STC15单片机读写大容量SD卡(IO口模拟SPI模式)

    使用的芯片是STC15系列的IAP15F2K61S2,开发板是51的xl2000.把芯片座上的51芯片拔掉换成STC的,混合模式.(配置够低吧) 源码由51开发板例程的实验26修改而来. 浏览了网上的 ...

  2. STM32+MAX6675利用io口模拟SPI获取实时温度数据程序及代码

    STM32+MAX6675利用io口模拟SPI获取实时温度数据程序及代码 本文采用的芯片为STM32F103RCT6 温度芯片为MAX6675 因为芯片的spi口只有3个,有部分需要外接W25Q128 ...

  3. 基于s32k146的IO口模拟串口

    zhe最近在搞一个IO口模拟LIN的代码,其中包括IO口模拟UART的部分,就记录一下,希望对像我们这样的初学者能有所帮助. 1. 串口协议 串口的特点:全双工,串行,异步 串口协议(我这里选用最常见 ...

  4. 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)

    版权声明:本文为博主原创文章,允许转载,但希望标注转载来源. https://blog.csdn.net/qq_38410730/article/details/80312357 IIC的基本介绍 I ...

  5. STM32 IO口模拟ISO7816(PSAM卡)协议

    单片机:stm32f103c8t6   实现方式:纯IO口模拟(RST.I/O.CLK均为普通IO口) 实现功能:接触式CPU卡.PSAM.SIM读(写) 网上有很多相关的代码,有的是用自带的智能卡接 ...

  6. linux下IO口模拟I2C的一些总结

    2019独角兽企业重金招聘Python工程师标准>>> 以前一直在用I2C接口,因为总是有线程的例子就一直没有去深入的了解,今天分析了一下在linux下通用GPIO模拟I2C的程序. ...

  7. 单片机IO口模拟串口程序(发送+接收

    单片机IO口模拟串口程序(发送+接收)[转] qcmc 发表于 - 2011-6-23 0:42:00 前一阵一直在做单片机的程序,由于串口不够,需要用IO口来模拟出一个串口.经过若干曲折并参考了一些 ...

  8. STM8学习笔记----普通IO口模拟串口功能

    串口在产品应用中很常见,但是单片机的默认带的串口往往比较少,有时候就会出现串口不够用,所以就想着能不能用普通IO口模拟串口来实现串口的功能. 要模拟串口首先要清楚串口数据传输过程中的原理. 常用的串口 ...

  9. 串口发送程序linux,单片机IO口模拟串口程序(发送+接收

    前一阵一直在做单片机的程序,由于串口不够,需要用IO口来模拟出一个串口.经过若干曲折并参考了一些现有的资料,基本上完成了.现在将完整的测试程序,以及其中一些需要总结的部分贴出来. 程序硬件平台:11. ...

最新文章

  1. (转)有了jQuery.Jcrop,选取美女的哪个部位你说了算
  2. 守护网络安全,我们一直在努力
  3. js深度解析url地址
  4. 解决github图片不显示问题【完美解决】
  5. std::chrono::duration_cast时间计算
  6. js原生后代选择器_CSS 后代选择器
  7. python模块之 paramiko(转载)
  8. 《从缺陷中学习C/C++》——6.3 数组传参时的sizeof
  9. gperf linux 安装_Gperftools安装
  10. java 如何添加背景音乐_Java程序怎样添加背景音乐?
  11. SQL操作结果集-并集,差集,交集,结果集排序
  12. EXCEL常用函数之统计函数
  13. [noip2014]解方程 hash+秦九昭
  14. unity的ui跟随鼠标移动
  15. 说说java中extends与implements的区别
  16. Committer 蔡正昕专访:勇敢迈出第一步,做开源没有那么难
  17. 笔记本电脑wifi图标变成了小地球的解决办法(留日后查看)
  18. win10 蓝牙耳机 音量太小
  19. android替换默认壁纸库,android替换默认壁纸并添加壁纸进壁纸库
  20. 【Vue3】1.1 使用NaiveUI 构建页面

热门文章

  1. 2021-09-22 汽车租赁系统
  2. bat添加修改注册表键值 批处理修改注册表项
  3. 【ParaView教程】2.11 时间
  4. oracle sql循环判断语句怎么写,Oracle 非常详细的 PL/SQL入门教程,PL/SQL语法格式/循环语句/条件判断/异常处理...
  5. python截长图_利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素)
  6. 经纬度互换、换算成米、两点的经纬度计算两点间的距离
  7. Cadence 如何创建元件库与元件
  8. matlab汽车座椅脉冲振动冲击仿真
  9. Java Web快速开发框架 ---- JSPX
  10. MATLAB寻找三维曲面的有效波峰(滤除噪声产生的极大值)