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
io口模拟spi,stm32f103与MS5611基于spi总线的温度压力高度数据读取相关推荐
- STC15单片机读写大容量SD卡(IO口模拟SPI模式)
使用的芯片是STC15系列的IAP15F2K61S2,开发板是51的xl2000.把芯片座上的51芯片拔掉换成STC的,混合模式.(配置够低吧) 源码由51开发板例程的实验26修改而来. 浏览了网上的 ...
- STM32+MAX6675利用io口模拟SPI获取实时温度数据程序及代码
STM32+MAX6675利用io口模拟SPI获取实时温度数据程序及代码 本文采用的芯片为STM32F103RCT6 温度芯片为MAX6675 因为芯片的spi口只有3个,有部分需要外接W25Q128 ...
- 基于s32k146的IO口模拟串口
zhe最近在搞一个IO口模拟LIN的代码,其中包括IO口模拟UART的部分,就记录一下,希望对像我们这样的初学者能有所帮助. 1. 串口协议 串口的特点:全双工,串行,异步 串口协议(我这里选用最常见 ...
- 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)
版权声明:本文为博主原创文章,允许转载,但希望标注转载来源. https://blog.csdn.net/qq_38410730/article/details/80312357 IIC的基本介绍 I ...
- STM32 IO口模拟ISO7816(PSAM卡)协议
单片机:stm32f103c8t6 实现方式:纯IO口模拟(RST.I/O.CLK均为普通IO口) 实现功能:接触式CPU卡.PSAM.SIM读(写) 网上有很多相关的代码,有的是用自带的智能卡接 ...
- linux下IO口模拟I2C的一些总结
2019独角兽企业重金招聘Python工程师标准>>> 以前一直在用I2C接口,因为总是有线程的例子就一直没有去深入的了解,今天分析了一下在linux下通用GPIO模拟I2C的程序. ...
- 单片机IO口模拟串口程序(发送+接收
单片机IO口模拟串口程序(发送+接收)[转] qcmc 发表于 - 2011-6-23 0:42:00 前一阵一直在做单片机的程序,由于串口不够,需要用IO口来模拟出一个串口.经过若干曲折并参考了一些 ...
- STM8学习笔记----普通IO口模拟串口功能
串口在产品应用中很常见,但是单片机的默认带的串口往往比较少,有时候就会出现串口不够用,所以就想着能不能用普通IO口模拟串口来实现串口的功能. 要模拟串口首先要清楚串口数据传输过程中的原理. 常用的串口 ...
- 串口发送程序linux,单片机IO口模拟串口程序(发送+接收
前一阵一直在做单片机的程序,由于串口不够,需要用IO口来模拟出一个串口.经过若干曲折并参考了一些现有的资料,基本上完成了.现在将完整的测试程序,以及其中一些需要总结的部分贴出来. 程序硬件平台:11. ...
最新文章
- (转)有了jQuery.Jcrop,选取美女的哪个部位你说了算
- 守护网络安全,我们一直在努力
- js深度解析url地址
- 解决github图片不显示问题【完美解决】
- std::chrono::duration_cast时间计算
- js原生后代选择器_CSS 后代选择器
- python模块之 paramiko(转载)
- 《从缺陷中学习C/C++》——6.3 数组传参时的sizeof
- gperf linux 安装_Gperftools安装
- java 如何添加背景音乐_Java程序怎样添加背景音乐?
- SQL操作结果集-并集,差集,交集,结果集排序
- EXCEL常用函数之统计函数
- [noip2014]解方程 hash+秦九昭
- unity的ui跟随鼠标移动
- 说说java中extends与implements的区别
- Committer 蔡正昕专访:勇敢迈出第一步,做开源没有那么难
- 笔记本电脑wifi图标变成了小地球的解决办法(留日后查看)
- win10 蓝牙耳机 音量太小
- android替换默认壁纸库,android替换默认壁纸并添加壁纸进壁纸库
- 【Vue3】1.1 使用NaiveUI 构建页面
热门文章
- 2021-09-22 汽车租赁系统
- bat添加修改注册表键值 批处理修改注册表项
- 【ParaView教程】2.11 时间
- oracle sql循环判断语句怎么写,Oracle 非常详细的 PL/SQL入门教程,PL/SQL语法格式/循环语句/条件判断/异常处理...
- python截长图_利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素)
- 经纬度互换、换算成米、两点的经纬度计算两点间的距离
- Cadence 如何创建元件库与元件
- matlab汽车座椅脉冲振动冲击仿真
- Java Web快速开发框架 ---- JSPX
- MATLAB寻找三维曲面的有效波峰(滤除噪声产生的极大值)