新手入门
- 积分
- 7
- 金钱
- 7
- 注册时间
- 2019-12-23
- 在线时间
- 3 小时
|

楼主 |
发表于 2019-12-26 16:39:57
|
显示全部楼层
#include "5611.h"
extern uint16_t c[6];
extern uint8_t c_team[12];//C1-C6
extern uint8_t ad_team[3];
extern int64_t preesure;
extern int32_t temp;
extern int64_t TEMP2,T2,OFF2,SENS2;
void ms5611_reset(void)
{
uint8_t check;
iic_start();
sent_byte_iic(0xEE);//send device address
check = iic_check_ack();
if(check == 0)
{
return;
}
sent_byte_iic(0x1E);//send reset command
check = iic_check_ack();
if(check == 0)
{
return;
}
iic_stop();
}
void ms5611_read_prom(void)
{
uint8_t check;
uint8_t i;
/*page 2*/
for(i = 1;i <= 6;i++)
{
iic_start();
sent_byte_iic(0xEE);//发送写命令
check = iic_check_ack();
if(check == 0)
{
return;
}
sent_byte_iic(0xA0+(i*2));//目标寄存器地址
check = iic_check_ack();
if(check == 0)
{
return;
}
iic_stop();
delay_us(5);
//开始读
iic_start();
sent_byte_iic(0xEF);
delay_us(1);
check = iic_check_ack();
if(check == 0)
{
return;
}
c_team[((i-1)*2)] = recv_byte_iic();//01放c1以此类推
iic_ack();//发送读取成功
delay_us(1);
c_team[((i-1)*2)+1] = recv_byte_iic();
iic_nack();
iic_stop();
}
for(i = 0;i < 6 ;i++)//获取C1-C6的具体数值
{
c[i] = (((uint16_t)(c_team[i])<< 8) + (uint16_t)(c_team[i+1]));
printf("c%d:%lu\r\n",i,c[i]);
}
}
uint32_t get_coversion(uint32_t reg)
{
uint8_t check;
uint32_t conversation;
//发送AD转换命令
iic_start();
sent_byte_iic(0xEE);
check = iic_check_ack();
if(check == 0)
{
printf("d0\r\n");
}
sent_byte_iic(reg);
check = iic_check_ack();
if(check == 0)
{
printf("a1\r\n");
}
iic_stop();
delay_ms(10);
//step2 发送读取AD寄存器数据的命令
iic_start();
sent_byte_iic(0xEE);
check = iic_check_ack();
if(check == 0)
{
printf("a1\r\n");
}
sent_byte_iic(0);
check = iic_check_ack();
if(check == 0)
{
printf("b2\r\n");
}
iic_stop();
//开始读取AD数据
iic_start();
sent_byte_iic(0xEF);
check = iic_check_ack();
if(check == 0)
{
printf("c3\r\n");
}
ad_team[0] = recv_byte_iic();
iic_ack();
ad_team[1] = recv_byte_iic();
iic_ack();
ad_team[2] = recv_byte_iic();
iic_nack();
iic_stop();
//65536 256
conversation = (((uint32_t)(ad_team[0]) << 16)+((uint32_t)(ad_team[1]) << 8)+((uint32_t)ad_team[2]));
printf("ad0:%d,ad1:%d,ad2:%d,conversation:%lu\r\n",ad_team[0],ad_team[1],ad_team[2],conversation);
return conversation;
}
int32_t get_dT(void)
{
int32_t dT;
dT= (int32_t)get_coversion(0x58)-((int32_t)(c[4]) << 8);
temp = (((int32_t)dT*(int32_t)c[5])>>23)+ (int32_t)2000 ;
printf("当前温度temp:%ld,dT:%ld\r\n",temp,dT);
return dT;
}
void get_pressure(void)
{
int32_t dT;
uint32_t d1;
uint8_t i;
int64_t sens;
int64_t off;
dT = get_dT();//获取温度补偿
delay_ms(100);
printf("dT:%ld\r\n",dT);
d1 = get_coversion(0x48);//获取气压AD值
delay_ms(100);
/*for(i = 0;i < 6;i++)
{
printf("c%d:%d\r\n",i,c[i]);
}*/
sens = ((int64_t)c[0] << 15)+(((int64_t)c[2]*dT)>>8);
printf("sens:%lld",sens);
off = ((int64_t)c[1] << 16)+(((int64_t)c[3]*dT)>>7);
printf("off:%lld",off);
if(temp < 2000)
{
printf("temp<2000\r\n");
/*extern int64_t preesure;
extern int32_t temp;
extern int64_t TEMP2,T2,OFF2,SENS2;*/
T2 = ((int64_t)dT*(int64_t)dT) >> 31;
OFF2 = 5*((int64_t)temp-2000)*((int64_t)temp-2000)/2;
printf("OFF2:%lld\r\n",OFF2);
SENS2 = 5*((int64_t)temp-2000)*((int64_t)temp-2000)/4;
printf("SENS2:%lld\r\n",SENS2);
if(temp < -1500)
{
OFF2 = OFF2 +7*(temp+1500)*(temp+1500);
SENS2 = SENS2 + 11*(temp+1500)*(temp+1500)/2;
}
temp = temp- (int32_t)T2;
off = off - OFF2;
sens = sens - SENS2;
printf("offa:%lld\r\n",off);
printf("sensa:%lld\r\n",sens);
}
preesure = ((((int64_t)d1*sens) >> 21) - off) >> 15;
printf("pressure:%lld",preesure);
}
void ms5611_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
PEout(12) = 1;
PEout(11) = 0;
ms5611_reset();
delay_ms(100);
ms5611_read_prom();
}
|
|