STM32
直播中

一曲作罢

9年用户 893经验值
擅长:可编程逻辑 电源/新能源 MEMS/传感技术
私信 关注
[问答]

请问MS5611如何实现使用SPI通信读取数据?

请问MS5611如何实现使用SPI通信读取数据?

回帖(1)

李婧

2021-11-22 09:21:45
ms5611是同时支持I2C和SPI通信协议的气压计芯片。已经很普遍的被用在飞行器控制板上作为高度传感器。开发过stm32的朋友都知道它的硬件I2C是由bug的,一般使用的都是自己编写的软件I2C通信协议。但是其硬件SPI通信却是没有问题的。SPI通信一般会比I2C通信快点。下面先从硬件上说明MS5611在选择SPI的准备。
MS5611要选择使用SPI通信首先需要做的就是把芯片的PS引脚置低。参考数据手册如下:





根据其设计的PCB原理图如下:





下面是主要代码:
1.首先是芯片初始化。
void ms5611_init(void)
{
// ms5611_cs_init();
ms5611_ba_reset();
read_prom_data();
}
复位芯片可以从数据手册中找到参考,其实很简单就是向芯片发送数据0x1e,
void ms5611_ba_reset(void)
{
MS5611_CS_L;
SPI1_Read_Write_Byte(0X1E);
MS5611_CS_H;
Delay_us(2800);
}
初始化第二步是读取prom的数据,这里面有包含计算温度和气压的一些系数。
void read_prom_data(void)
{
u8 i;
for(i=0;i<8;i++)
data = ms5611_read(0xa0+2*i);
for(i=0;i<8;i++)
printf(“data %d = %dn”,i,data);
}
下面就是读取数据和运算数据的循环了。
int32_t get_pressure(void)
{
int64_t D1,dT,OFF,SENS;
int64_t pressure;
MS5611_CS_L;
SPI1_Read_Write_Byte(0X58);
MS5611_CS_H;
Delay_us(1100);
dT = ms5611_read_adc(0x00);
dT -= (data[5]<<8);
// printf(“dT = %lldn”,dT);
OFF = ((int64_t)data[2]<<16) + (((int64_t)data[4]*dT)>>7);
SENS = ((int64_t)data[1]<<15) + (((int64_t)data[3]*dT)>>8);
MS5611_CS_L;
SPI1_Read_Write_Byte(0x48);
MS5611_CS_H;
Delay_us(1100);
D1 = ms5611_read_adc(0x00);
pressure = (((D1*SENS)>>21)-OFF)>>15;
return pressure;
}
使用串口终端获得数据在MATLAB中做出曲线如下图:





与工程代码对应的硬件如下:









该飞控板移植了MDK的cleanflight代码,由于硬件跟cleanflight的并不完全一致,代码有所改动,需要购买板子的可给我留言
举报

更多回帖

发帖
×
20
完善资料,
赚取积分