307 lines
6.8 KiB
C
307 lines
6.8 KiB
C
#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;
|
||
}
|
||
}
|
||
|
||
|