val-off-little/board/hp303s.c

307 lines
6.8 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "hp303s.h"
uint8_t reg_0x10_0x21[18];
uint8_t PRS_CFG = 0x74;//压力分辨率配置 128/s 16times oversampling 寄存器0x06
uint8_t TMP_CFG = 0XF4;//温度分辨率配置 外部传感器 128/s 16times oversampling 寄存器0x07
uint8_t CFG_REG = 0X0C;//FIFO配置 寄存器0x09
HP303S_T_and_P hp303sData;
REG_0X10_0X21 Reg0x10_0x20;
COEF_DATA coefData;
/************************************************
函数名称 SPI_Delay_us
功 能 软件毫秒延时
参 数 Count ---- 次数
返 回 值
*************************************************/
static void spi_delay_us( uint32_t Count )
{
delay_us(Count);
}
/************************************************
函数名称 Write_SPI_Byte
功 能 SPI写读一个字节
参 数 Byte ---- 数据
返 回 值 Byte ---- 数据
*************************************************/
uint8_t write_spi_byte( uint8_t Byte )
{
uint8_t i;
SPI_SCK(HIGH);
for(i = 0;i < 8;i++)
{
SPI_SCK(LOW);
spi_delay_us(WAIT_TIME); // 空等待
#if 0
SPI_MOSI((Byte & 0x80) >> 7);
#else
if(Byte & 0x80)
{
SPI_MOSI(HIGH);
}
else
{
SPI_MOSI(LOW);
}
#endif
Byte <<= 1;
spi_delay_us(WAIT_TIME); // 空等待
SPI_SCK(HIGH);
spi_delay_us(WAIT_TIME); // 空等待
Byte |= SPI_MISO;
}
return Byte;
}
/************************************************
函数名称 Read_SPI_Byte
功 能 SPI只读一个字节
参 数
返 回 值 temp ---- 数据
*************************************************/
uint8_t read_spi_byte(void)
{
uint8_t i;
uint8_t temp = 0;
SPI_SCK(HIGH);
for(i = 0;i < 8;i++)
{
SPI_SCK(LOW);
spi_delay_us(WAIT_TIME); // 空等待
temp <<= 1;
#if 1
temp |= SPI_MISO;
#else
if(SPI_MISO)
{
temp++;
}
#endif
SPI_SCK(HIGH);
spi_delay_us(WAIT_TIME); // 空等待
}
return temp;
}
/*******************************************************************************
函数名称 hp303_reg_read
功 能 HP303S寄存器数据读取
参 数 reg_add--寄存器地址reg_num--寄存器数量reg_data--存储数组
返 回 值
*******************************************************************************/
void hp303_reg_read(uint8_t reg_add,uint8_t reg_num,uint8_t *reg_data)
{
HP303_CS(0);
spi_delay_us(10);
write_spi_byte(reg_add | 0x80);
for(int i = 0;i < reg_num;i++)
{
reg_data[i] = read_spi_byte();
}
HP303_CS(1);
spi_delay_us(10);
}
/*******************************************************************************
函数名称 hp303_reg_write
功 能 HP303S寄存器数据写入
参 数 reg_add--寄存器地址reg_data--写入数据
返 回 值
*******************************************************************************/
void hp303_reg_write(uint8_t reg_add,uint8_t reg_data)
{
HP303_CS(0);
spi_delay_us(10);
write_spi_byte(reg_add);
write_spi_byte(reg_data);
HP303_CS(1);
spi_delay_us(10);
}
/*******************************************************************************
函数名称 coef_calc
功 能 HP303S出厂校准值获取
参 数
返 回 值
*******************************************************************************/
void coef_calc(void)
{
coefData.C0 = ( reg_0x10_0x21[0] << 4) | ((reg_0x10_0x21[1] & 0XF0) >> 4);
if(coefData.C0 > (2048 - 1))
{
coefData.C0 = coefData.C0 - 4096;
}
coefData.C1 = ((reg_0x10_0x21[1] & 0X0F) << 8 | (reg_0x10_0x21[2]));
if(coefData.C1 > 2047)
{
coefData.C1 = coefData.C1-4096;
}
coefData.C00 = (reg_0x10_0x21[3] << 12)|(reg_0x10_0x21[4] << 4)|((reg_0x10_0x21[5] & 0xF0) >> 4);
if(coefData.C00 > 524287)
{
coefData.C00 = coefData.C00 - 1048576;
}
coefData.C10 = ((reg_0x10_0x21[5] & 0x0F) << 16) | (reg_0x10_0x21[6] << 8) | reg_0x10_0x21[7];
if(coefData.C10 > 524287)
{
coefData.C10 = coefData.C10 - 1048576;
}
coefData.C01= (reg_0x10_0x21[8] << 8) | (reg_0x10_0x21[9]);
if(coefData.C01 > 32767)
{
coefData.C01 = coefData.C01 - 65536;
}
coefData.C11 = (reg_0x10_0x21[10] << 8) |(reg_0x10_0x21[11]);
if(coefData.C11 > 32767)
{
coefData.C11 = coefData.C11 - 65536;
}
coefData.C20 = reg_0x10_0x21[11] | (reg_0x10_0x21[12] << 8);
if(coefData.C20 > (32768-1))
{
coefData.C20 = coefData.C20 - 65536;
}
coefData.C21 = (reg_0x10_0x21[14] << 8) | (reg_0x10_0x21[15]);
if(coefData.C21 > 32767)
{
coefData.C21 = coefData.C21 - 65536;
}
coefData.C30 = (reg_0x10_0x21[16] << 8 ) | (reg_0x10_0x21[17]);
if(coefData.C30 > 32767)
{
coefData.C30 = coefData.C30 - 65536;
}
}
/*******************************************************************************
函数名称 hp303_init
功 能 HP303S初始化
参 数
返 回 值
*******************************************************************************/
void hp303_init(void)
{
HP303_CS(1);
spi_delay_us(10);
hp303_reg_read(0x10,18,reg_0x10_0x21);//Get coefficient
delay_ms(400);
hp303_reg_write(0x06,PRS_CFG);//Pressure Resolution Config 0x06
delay_ms(200);
hp303_reg_write(0x07,TMP_CFG);//Temperature Resolution Config 0x07
delay_ms(200);
hp303_reg_write(0x09,CFG_REG);//Set P result shift
delay_ms(200);
coef_calc();
}
int step_cnt = 0;
/*******************************************************************************
函数名称 hp303_read
功 能 HP303S数据读取
参 数
返 回 值
*******************************************************************************/
void hp303_read(void)
{
switch(step_cnt)
{
//计算温度
case 0 :
{
hp303_reg_write(0x08,0x02);
step_cnt = 1;
}
break;
case 1:
{
hp303_reg_read(0x03,3,hp303sData.TMP_B);
step_cnt = 2;
}
break;
case 2:
{
coefData.Traw = (hp303sData.TMP_B[0] << 16) | (hp303sData.TMP_B[1] << 8) | (hp303sData.TMP_B[0] << 0);
if(coefData.Traw > 8388607)
{
coefData.Traw = coefData.Traw -16777216;
}
coefData.Traw_sc = ((double)coefData.Traw / HP303S_KP);
coefData.Tcomp = coefData.C0 * 0.5 + coefData.C1 * coefData.Traw_sc;
step_cnt = 3;
}
break;
//计算压力
case 3:
{
hp303_reg_write(0x08,0x01);
step_cnt = 4;
}
break;
case 4:
{
hp303_reg_read(0x00,3,hp303sData.PRS_B);
step_cnt = 5;
}
break;
case 5:
{
coefData.Praw = (hp303sData.PRS_B[0] << 16) | (hp303sData.PRS_B[1] << 8) | (hp303sData.PRS_B[2] << 0);
if( coefData.Praw > 8388607)
{
coefData.Praw = coefData.Praw - 16777216;
}
coefData.Praw_sc = ((double)coefData.Praw / HP303S_KP);
coefData.Pcomp = coefData.C00 + (coefData.Praw_sc * (coefData.C10 + coefData.Praw_sc * (coefData.C20 + (coefData.Praw_sc * coefData.C30))))
+ (coefData.Traw_sc * coefData.C01) + (coefData.Traw_sc * coefData.Praw_sc * (coefData.C11 + (coefData.Praw_sc * coefData.C21)));
step_cnt = 6;
}
break;
case 6:
{
if((coefData.Pcomp / 100 + pressure_offsets[0]) >= 0 && (!(coefData.Pcomp == 0)))
{
InputReg[8] = coefData.Pcomp / 100 + pressure_offsets[0];
}
else
{
pressure_offsets[0] = -coefData.Pcomp / 100;
InputReg[8] = coefData.Pcomp / 100 + pressure_offsets[0];
}
step_cnt = 0;
}
break;
}
}