STM32F0使用LL库实现MS5536C通讯
在本次项目中,限于空间要求我们选用了STM32F030F4作为控制芯片。这款MCU不但封装紧凑,而且自带的Flash空间也非常有限,所以我们选择了LL库实现。在本文中我们说明一下,使用LL库实现MS5536C的SPI通讯。
1、MS5536C简述
MS5536C是一个系列的高分辨率工厂校准压力传感器。该设备包括一个压阻式压力传感器和一个ADC,采用三线SPI接口。该设备以16位数据字的形式提供数字压力和温度信息。其结构图如下:

MS5536C具有64位的单独校准的补偿系数,允许高度精确的软件补偿过程传播和温度效应。4个字的位排序组合为6个有效系数,具体如下:

MS5536C中,压力数据是一个16为的数据,读取的时序需要在发送命令和接受数据时采用不同的时钟沿。

MS5536C中,温度数据是一个16为的数据,读取温度数据的时序与眼里数据一样,也需要在发送命令和接受数据时采用不同的时钟沿。

MS5536C中,修正系数是有4个字组成,其实是6个系数,前面已经介绍了它的格式,读取这几个数据的时序也需要在发送命令和接受数据时采用不同的时钟沿。字1和字3的时序图如下:

读取字2和字4的时序图如下:

此外,还有复位信号,担复位信号没有什么特别,只需按时序图实现就好。其时序图如下:

关于这几个时序图的软件实现我们会在后面给出。在这里,我们可以总结一下,对于MS5536C表压传感器,在MCU发送信号时,使用时钟上升沿;在MCU接收数据时,采用时钟下降沿。
2、SPI通讯配置
MS5536C表压传感器采用的是SPI通讯,所以我们需要看看STM32F030F4中的SPI通讯。STM32F030F4中的SPI的结构如下:

要实现SPI通讯,需要对SPI的寄存器进行配置,主要是个寄存器:SPI控制寄存器1(SPIx_CR1)和SPI控制寄存器2(SPIx_CR2)。
SPI控制寄存器1(SPIx_CR1)的结构如下:

在SPIx_CR1中有几位是需要配置的:SSM,SSI,SPE,BR,MSTR,CPOL,CPHA等。SSM:软件从站管理,说的简单一点就是忽略NSS引脚信号,在我们的应用中需要置位。SSI:内部从站选择,在SSM置位的情况下才有效。SPE:SPI使能,这个是必须的,但配置需要注意,在后续我们还会说明。BR:波特率控制,用于设置时钟分频。MSTR主站选择,CPOL时钟极性,CPHA时钟相位不再多说。
SPI控制寄存器2(SPIx_CR2)的结构如下:

在SPI控制寄存器2(SPIx_CR2)中,有FRXTH,FIFO接收阈值;DS,SPI传送数据位数需要配置。
3、软件实现
在前面我们已经说明了SPI的配置和MS5536C表压传感器的通讯要求,接下来就根据我们的分析实现之。
首先来看SPI的配置,有一些配置可以通过LL库提供的初始化函数来完成。这部分我们需要给予相应的参数值然后调用初始化函数。还有一部分配置需要调用相应的函数来执行。具体配置如下:
/* SPI1 初始化配置 */
static void SPI1_Init_Configuration(void)
{
/* SPI1 端口参数配置*/
LL_SPI_InitTypeDef SPI_InitStruct = {0};
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
/* 相关外设时钟使能 */
LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_SPI1);
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA);
/**SPI1 GPIO配置:PA5 ------> SPI1_SCK
PA6 ------> SPI1_MISO
PA7 ------> SPI1_MOSI */
GPIO_InitStruct.Pin = LL_GPIO_PIN_5;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_0;
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LL_GPIO_PIN_6;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_0;
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = LL_GPIO_PIN_7;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_0;
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* SPI1 参数配置 */
SPI_InitStruct.TransferDirection = LL_SPI_FULL_DUPLEX;
SPI_InitStruct.Mode = LL_SPI_MODE_MASTER;
SPI_InitStruct.DataWidth = LL_SPI_DATAWIDTH_8BIT;
SPI_InitStruct.ClockPolarity = LL_SPI_POLARITY_LOW;
SPI_InitStruct.ClockPhase = LL_SPI_PHASE_1EDGE;
SPI_InitStruct.NSS = LL_SPI_NSS_SOFT;
SPI_InitStruct.BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV256;
SPI_InitStruct.BitOrder = LL_SPI_MSB_FIRST;
SPI_InitStruct.CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE;
SPI_InitStruct.CRCPoly = 7;
LL_SPI_Init(SPI1, &SPI_InitStruct);
LL_SPI_SetRxFIFOThreshold(SPI1,LL_SPI_RX_FIFO_TH_QUARTER);
LL_SPI_SetStandard(SPI1, LL_SPI_PROTOCOL_MOTOROLA);
LL_SPI_EnableNSSPulseMgt(SPI1);
}
配置成功后,控制寄存器的状态如下图所示:

这里需要说明一下的是使能SPI,如果只在初始化时使能,最后的结果可能是一项不到的。所以最好的做法是在每次实现数据发送前,检测SPI的状态,若没使能则调用LL_SPI_Enable(SPI1)使能SPI
关于MS5536C表压传感器,我们查看了时序图后其实很容易实现,只需要在下发命令和接收数据时,注意转换SPI的相位设定就可以了。我们在这里只列出读取温度和压力测量值的代码。
/* 读取测量数据 */
static uint16_t ReadMeasureData(MS5536cTypeDef *ms,uint16_t command)
{
uint8_t txData[2];
uint8_t rxData[2];
uint16_t result=0;
txData[0]=(uint8_t)(command>>8);
txData[1]=(uint8_t)command;
ms->ReadWriteMS(txData,rxData,2);
ms->Delayms(23);
ms->SetPhase(false);
ms->Delayms(10);
txData[0]=0x00;
txData[1]=0x00;
ms->ReadWriteMS(txData,rxData,2);
result=(rxData[0]<<8)+rxData[1];
ms->SetPhase(true);
ms->Delayms(10);
return result;
}
对于读取校准数据,读取寄存器,软件复位等都只需按时序图实现就可以了,这里不再详述。
4、总结
我们已经基于LL库实现了STM32F030F4和MS5536C表压传感器的代码,将其下在到目标板,监视器结果正确,如下图所示:

欢迎关注:

STM32F0使用LL库实现MS5536C通讯的更多相关文章
- STM32F0使用LL库实现Modbus通讯
在本次项目中,限于空间要求我们选用了STM32F030F4作为控制芯片.这款MCU不但封装紧凑,而且自带的Flash空间也非常有限,所以我们选择了LL库实现.本篇将说明基于LL实现USART通讯. 1 ...
- STM32F0使用LL库实现SHT70通讯
在本次项目中,限于空间要求我们选用了STM32F030F4作为控制芯片.这款MCU不但封装紧凑,而且自带的Flash空间也非常有限,所以我们选择了LL库实现.本篇我们将基于LL库采用模拟I2C接口的方 ...
- C/C++ 用libcurl库进行http通讯网络编程
C/C++ 用libcurl库进行http通讯网络编程 目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三.curl_easy_setopt函数部分选项介绍 四.curl_easy_p ...
- C++ 用libcurl库进行http通讯网络编程 【转】
http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724318.html C++ 用libcurl库进行http通讯网络编程 目录索引: 一.Lib ...
- C++ 用libcurl库进行http通讯网络编程
使用libcurl完成http通讯,很方便而且是线程安全,转载一篇比较好的入门文章 转载自 http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724 ...
- C++ 用libcurl库进行http通讯网络编程(转)
转载:http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724318.html 目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三. ...
- C++ 用libcurl库进行http通讯网络编程[转]
http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724318.html 目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三.cur ...
- (4)STM32使用HAL库实现串口通讯——理论讲解
一.查询模式 1. 二.中断模式 1.中断接收. 1.1先看中断接收的流程(以 USART2 为例) 在启动文件中找到中断向量 USART2_IRQHandler 找到USART2_IRQHandle ...
- STM32F0使用LL库实现PWM输出
在本次项目中,限于空间要求我们选用了STM32F030F4作为控制芯片.这款MCU不但封装紧凑,而且自带的Flash空间也非常有限,所以我们选择了LL库实现.本文我们将说明如何通过LL库实现PWM信号 ...
随机推荐
- SqlServer如何判断字段中是否含有汉字?
--/* --unicode编码范围: --汉字:[0x4e00,0x9fa5](或十进制[19968,40869]) --数字:[0x30,0x39](或十进制[48, 57]) --小写字母:[0 ...
- Linux(Ubuntu)使用日记------ssh远程登录腾讯云
不知道是我自己电脑的问题还是其他的问题.总之在我的折腾之下算是用ssh连接上了我的腾讯云. 具体步骤: 1.生成密钥 ssh-keygen -t rsa 执行命令会出现这样,执行后让你输入东西的全部回 ...
- linux 命令ls
命令格式 ls -la /etc -a 查看所有隐藏文件 以.开头的,就是隐藏文件.改名.开头,就可以改成隐藏文件 -l 长格式显示 ]# ls -al total 8 drwxr-xr-x ...
- SQL 中使用 WITH AS 提高性能
一.WITH AS的含义WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到.有的时候,是为了让S ...
- JSON.stringify() 和 JSON.parse()
stringify()用于从一个对象解析出字符串,如 var obj = {x: 1, y: 2 } console.log(JSON.stringify(obj)) //{"x" ...
- <数据结构基础学习>(三)Part 2 队列
一.队列 Queue 队列也是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另一端(队首)取出元素. (排队) 队列是一种先进先出的数据结构(先到先得)FIFO ...
- 洛谷 P4302 【[SCOI2003]字符串折叠】
又来填一个以前很久很久以前挖的坑 首先如果先抛开折叠的内部情况不谈,我们可以得到这样的一个经典的区间DP的式子 $ f[l][r]=min(f[l][r],f[l][k]+f[k+1][r])(l&l ...
- 题解-洛谷P1184 高手之在一起
https://www.luogu.org/problemnew/show/P1184 (题目出处) 见到地名,自然就想到字符串了.可以从第一天开始,将她的位置与高手方便取得地方一一比较,(char字 ...
- 团体程序设计天梯赛(CCCC) L3021 神坛 的一些错误做法(目前网上的方法没一个是对的) 和 一些想法
团体程序设计天梯赛代码.体现代码技巧,比赛技巧. https://github.com/congmingyige/cccc_code
- Day041--CSS, 盒模型, 浮动
内容回顾 表单标签 input type text 普通的文本 password 密码 radio 单选 默认选中添加checked 互斥的效果 给radio标签添加 相同的name checkbo ...