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_SCKPA6 ------> SPI1_MISOPA7 ------> 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接口的方 ...
- STM32G0 硬件SPI+DMA+LL库,最高通讯速率32MBit/s
硬件SPI+DMA+LL库代码连接STM32G0硬件SPI+DMA+LL库,最高通讯速率32MBit/s-嵌入式文档类资源-CSDN下载 近期在写0.96寸OLED显示屏驱动的程序,之前试过用软件模拟 ...
- 利用libcurl库进行http通讯网络
文章目录 一.了解libcurl 二.通过实例认识libcurl 三.总结 四.参考资料 本文章使用的是Ubuntu18.04来完成程序编译运行. 一.了解libcurl libcurl是什么 lib ...
- 485通讯的校验和_S7200 SMART通过MODBUS库与称重仪表通讯
点击↑↑技成培训 ,关注并置顶即可长期免费订阅 20万+工控人关注的微信平台:技术分享.学习交流.工控视频 首先介绍我们的硬件准备工作 1一台支持Modbus协议的称重仪表支持Modbus协议的称重仪 ...
- 485通讯的校验和_S7-200SMART通过MODBUS库与称重仪表通讯
首先介绍我们的硬件准备工作 1一台支持Modbus协议的称重仪表 支持Modbus协议的称重仪表 2设置好仪表的通讯参数 根据自己的要求可以调整,只要和PLC端统一就可以 波特率:9600 数据格式: ...
- STM32F0使用LL库实现PWM输出
在本次项目中,限于空间要求我们选用了STM32F030F4作为控制芯片.这款MCU不但封装紧凑,而且自带的Flash空间也非常有限,所以我们选择了LL库实现.本文我们将说明如何通过LL库实现PWM信号 ...
- STM32F0使用LL库实现DMA方式AD采集
在本次项目中,限于空间要求我们选用了STM32F030F4作为控制芯片.这款MCU不但封装紧凑,而且自带的Flash空间也非常有限,所以我们选择了LL库实现.在本文中我们将介绍基于LL库的ADC的DM ...
- 使用MQTTClient.h库进行mqtt通讯【C语言】
目录 MQTT 安装paho.mqtt.c库 安装依赖 安装 编译及运行 编译 运行 源代码 MQTT MQTT是一种轻量级物联网消息推送协议,使用MQTT开发物联网设备将会十分简单方便. 关于MQT ...
最新文章
- 大数据背后的神秘定理:贝叶斯公式
- DBA工具——DMV——通过sys.dm_exec_procedure_stats查看存储过程执行信息
- 这样写交互说明,开发不会约你去爬山~
- dynamic web module 2.5与2.4
- 会员中心 收藏动态消息创作SELECT LAST_INSERT_ID() 的使用和注意事项
- 在布局空间标注的尺寸量不对_CAD图纸中标注值和实际测量值不一样怎么回事?...
- Linux下最简单的修改文件名后缀的命令行技巧
- 拼多多年货节上线,“百亿补贴”加码iPhone 12等产品
- 自动驾驶——模型部署的学习笔记
- springMVC web项目 对访问数据库的用户名密码进行加密解密
- matlab正弦函数傅里叶变换,正弦函数及其傅里叶变换 二
- 抽样分布的形式与原有总体的分布和样本容量n的大小有关
- 一个文科毕业生在德国 IT 行业的漫漫求职路
- 运维快速入门必备的 Linux 服务器安全简明指南,速收!
- python实现数据库的增删改查
- 风险预测模型评价第二弹:NRI的R语言计算
- 百度地图查询数据结果
- 《一本书读懂24种互联网思维》用户思维1
- python入门的小问题:计算复利函数
- 字符串截取的常用方法
热门文章
- 美商务部再禁6项新兴技术,包括光刻软件和5nm生产技术
- android一体机-迅为10.1寸用于售货机、人机界面、自动终端、触摸控制
- 基于spring的观察者模式
- 工具资源系列之给虚拟机装个windows
- 渲染上下文Rendering Context
- 计算机网络之Web应用
- oracle的删除的row如何,Oracle 删除大表中部分数据
- python天天向上的力量三天打鱼两天晒网_017 示例3-天天向上的力量-Go语言中文社区...
- android 进程管理机制,Android的进程管理机制
- bootstrap 富文本_入坑吗?说说几个富文本编辑器