347 lines
6.5 KiB
C
347 lines
6.5 KiB
C
#include "MS5803.h"
|
||
|
||
PromVar PROMData;
|
||
volatile int32_t CurrentTemp = 0,CurrentPress = 0;
|
||
|
||
/* SPI handler declaration */
|
||
|
||
/* Buffer used for transmission */
|
||
uint8_t aTxBuffer[4];
|
||
|
||
uint8_t aRxBuffer[4];
|
||
|
||
uint8_t NSS_Select = 1;
|
||
|
||
//拉高所有片选脚
|
||
void SetCS(void)
|
||
{
|
||
LL_GPIO_SetOutputPin(SPI1_NSS1_GPIO_Port,SPI1_NSS1_Pin);
|
||
LL_GPIO_SetOutputPin(SPI1_NSS2_GPIO_Port,SPI1_NSS2_Pin);
|
||
LL_GPIO_SetOutputPin(SPI1_NSS3_GPIO_Port,SPI1_NSS3_Pin);
|
||
LL_GPIO_ResetOutputPin(SPI1_NSS4_GPIO_Port,SPI1_NSS4_Pin);
|
||
LL_GPIO_SetOutputPin(SPI1_NSS5_GPIO_Port,SPI1_NSS5_Pin);
|
||
LL_GPIO_SetOutputPin(SPI1_NSS6_GPIO_Port,SPI1_NSS6_Pin);
|
||
LL_GPIO_SetOutputPin(SPI1_NSS7_GPIO_Port,SPI1_NSS7_Pin);
|
||
LL_GPIO_ResetOutputPin(SPI1_NSS8_GPIO_Port,SPI1_NSS8_Pin);
|
||
}
|
||
|
||
void ClrCS(void)
|
||
{
|
||
switch(NSS_Select)
|
||
{
|
||
case 1 :
|
||
LL_GPIO_ResetOutputPin(SPI1_NSS1_GPIO_Port,SPI1_NSS1_Pin);
|
||
break;
|
||
case 2 :
|
||
LL_GPIO_ResetOutputPin(SPI1_NSS2_GPIO_Port,SPI1_NSS2_Pin);
|
||
break;
|
||
case 3 :
|
||
LL_GPIO_ResetOutputPin(SPI1_NSS3_GPIO_Port,SPI1_NSS3_Pin);
|
||
break;
|
||
case 4 :
|
||
LL_GPIO_SetOutputPin(SPI1_NSS4_GPIO_Port,SPI1_NSS4_Pin);
|
||
break;
|
||
case 5 :
|
||
LL_GPIO_ResetOutputPin(SPI1_NSS5_GPIO_Port,SPI1_NSS5_Pin);
|
||
break;
|
||
case 6 :
|
||
LL_GPIO_ResetOutputPin(SPI1_NSS6_GPIO_Port,SPI1_NSS6_Pin);
|
||
break;
|
||
case 7 :
|
||
LL_GPIO_ResetOutputPin(SPI1_NSS7_GPIO_Port,SPI1_NSS7_Pin);
|
||
break;
|
||
case 8 :
|
||
LL_GPIO_SetOutputPin(SPI1_NSS8_GPIO_Port,SPI1_NSS8_Pin);
|
||
break;
|
||
}
|
||
}
|
||
|
||
//****************************************
|
||
//*功能:向MS5803写入命令
|
||
//*参数:CMD
|
||
//*返回:True/False
|
||
|
||
static int WriteCmd(uint8_t CMD)
|
||
{
|
||
memset(aTxBuffer,0,sizeof(aTxBuffer));
|
||
aTxBuffer[0] = CMD;
|
||
|
||
ClrCS();// pull CSB low to start the command
|
||
delay_tick(10);
|
||
|
||
if(HAL_SPI_Transmit(&hspi1,(uint8_t*)aTxBuffer,1,1))
|
||
{
|
||
SetCS();
|
||
return 1;
|
||
}
|
||
else
|
||
{
|
||
SetCS();
|
||
return 0;
|
||
}
|
||
}
|
||
|
||
//****************************************
|
||
//*功能:根据指令从MS5803读相应数据
|
||
//*参数:CMD,Count
|
||
//*返回:True/False
|
||
|
||
static int ReadCmdData(uint8_t CMD,uint8_t Count)
|
||
{
|
||
memset(aTxBuffer,0,sizeof(aTxBuffer));
|
||
aTxBuffer[0] = CMD;
|
||
|
||
ClrCS();
|
||
delay_tick(10);
|
||
|
||
if(HAL_SPI_TransmitReceive(&hspi1, (uint8_t*)aTxBuffer, (uint8_t *)aRxBuffer, Count+1, 1))
|
||
{
|
||
SetCS();
|
||
return 1;
|
||
}
|
||
else
|
||
{
|
||
SetCS();
|
||
return 0;
|
||
}
|
||
//memmove(aRxBuffer,aRxBuffer+1,Count);//
|
||
}
|
||
|
||
//****************************************
|
||
//*功能:复位MS5803
|
||
//*参数:
|
||
//*返回:
|
||
|
||
static void ResetDevice()
|
||
{
|
||
WriteCmd(RESET);
|
||
LL_mDelay(3); //必须延时3ms
|
||
}
|
||
|
||
//****************************************
|
||
//*功能:获取PROM校准参数,只需要获取一次
|
||
//*参数:
|
||
//*返回:
|
||
|
||
static void GetPromData()
|
||
{
|
||
memset(aRxBuffer,0,sizeof(aRxBuffer));
|
||
ReadCmdData(Cof1,2);
|
||
PROMData.C1[NSS_Select] = (aRxBuffer[1]<<8) + aRxBuffer[2];
|
||
|
||
memset(aRxBuffer,0,sizeof(aRxBuffer));
|
||
ReadCmdData(Cof2,2);
|
||
PROMData.C2[NSS_Select] = (aRxBuffer[1]<<8) + aRxBuffer[2];
|
||
|
||
memset(aRxBuffer,0,sizeof(aRxBuffer));
|
||
ReadCmdData(Cof3,2);
|
||
PROMData.C3[NSS_Select] = (aRxBuffer[1]<<8) + aRxBuffer[2];
|
||
|
||
memset(aRxBuffer,0,sizeof(aRxBuffer));
|
||
ReadCmdData(Cof4,2);
|
||
PROMData.C4[NSS_Select] = (aRxBuffer[1]<<8) + aRxBuffer[2];
|
||
|
||
memset(aRxBuffer,0,sizeof(aRxBuffer));
|
||
ReadCmdData(Cof5,2);
|
||
PROMData.C5[NSS_Select] = (aRxBuffer[1]<<8) + aRxBuffer[2];
|
||
|
||
memset(aRxBuffer,0,sizeof(aRxBuffer));
|
||
ReadCmdData(Cof6,2);
|
||
PROMData.C6[NSS_Select] = (aRxBuffer[1]<<8) + aRxBuffer[2];
|
||
}
|
||
|
||
//****************************************
|
||
//*功能:MS5803初始化
|
||
//*参数:
|
||
//*返回:
|
||
|
||
void MS5803Init()
|
||
{
|
||
// LL_SPI_Enable(SPI1);
|
||
//SPI_Init();
|
||
LL_GPIO_ResetOutputPin(SENSOR_SELECT_GPIO_Port,SENSOR_SELECT_Pin);
|
||
SetCS();
|
||
|
||
NSS_Select = 1;
|
||
delay_tick(10);
|
||
//初始化代码
|
||
ResetDevice();
|
||
GetPromData();
|
||
|
||
NSS_Select = 2;
|
||
delay_tick(10);
|
||
//初始化代码
|
||
ResetDevice();
|
||
GetPromData();
|
||
|
||
NSS_Select = 3;
|
||
delay_tick(10);
|
||
//初始化代码
|
||
ResetDevice();
|
||
GetPromData();
|
||
//
|
||
// NSS_Select = 4;
|
||
// //初始化代码
|
||
// ResetDevice();
|
||
// GetPromData();
|
||
}
|
||
|
||
//****************************************
|
||
//*功能:获取温度和压力 MS5803-14BA
|
||
//*参数:
|
||
//*返回:
|
||
|
||
void StartCalculation()
|
||
{
|
||
uint32_t D1,D2;
|
||
|
||
int32_t dT,TEMP;
|
||
int64_t OFF,SENS;
|
||
|
||
|
||
//转换压力
|
||
WriteCmd(CD1_256);
|
||
LL_mDelay(1); //必须延时10ms
|
||
ReadCmdData(ADC_Read,3);
|
||
D1 = (aRxBuffer[1]*pow(2,16)) + (aRxBuffer[2]*pow(2,8)) + aRxBuffer[3];
|
||
|
||
//转换温度
|
||
WriteCmd(CD2_256);
|
||
LL_mDelay(1); //必须延时10ms
|
||
ReadCmdData(ADC_Read,3);
|
||
D2 = (aRxBuffer[1]*pow(2,16)) + (aRxBuffer[2]*pow(2,8)) + aRxBuffer[3];
|
||
|
||
//计算温度
|
||
dT = D2 - (PROMData.C5[NSS_Select]*pow(2,8));
|
||
|
||
if(dT > 16777216)
|
||
{
|
||
dT = 16777216;
|
||
}
|
||
else if(dT < -16776960)
|
||
{
|
||
dT = -16776960;
|
||
}
|
||
|
||
TEMP = 2000 + ((((long long)dT)*PROMData.C6[NSS_Select])/pow(2,23));
|
||
|
||
//计算压力
|
||
OFF = (PROMData.C2[NSS_Select]*pow(2,16)) + ((((long long)dT)*PROMData.C4[NSS_Select])/pow(2,7));
|
||
if(OFF > 51538821120)
|
||
{
|
||
OFF = 51538821120;
|
||
}
|
||
else if(OFF < -34358689800)
|
||
{
|
||
OFF = -34358689800;
|
||
}
|
||
|
||
|
||
SENS = (((long long)PROMData.C1[NSS_Select])*pow(2,15)) + ((((long long)dT)*PROMData.C3[NSS_Select])/pow(2,8));
|
||
|
||
if(SENS > 17179607040)
|
||
{
|
||
SENS = 17179607040;
|
||
}
|
||
else if(SENS < -8589672450)
|
||
{
|
||
SENS = -8589672450;
|
||
}
|
||
__nop();
|
||
|
||
//Second order compensation
|
||
long T2 = 0,OFF2 = 0,SENS2 = 0;
|
||
|
||
if(TEMP < 2000)
|
||
{
|
||
T2 = (3*pow(dT,2))/pow(2,33);
|
||
OFF2 = (3*pow((TEMP-2000),2))/pow(2,1);
|
||
SENS2 = (5*pow((TEMP-2000),2))/pow(2,3);
|
||
|
||
if(TEMP < -1500)
|
||
{
|
||
OFF2 += 7 * pow(TEMP+1500,2);
|
||
SENS2 += 4 * pow((TEMP+1500),2);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
T2 = (7*pow(dT,2))/pow(2,37);
|
||
OFF2 = pow((TEMP-2000),2)/pow(2,4);
|
||
}
|
||
|
||
CurrentTemp = TEMP - T2;
|
||
OFF -= OFF2;
|
||
SENS -= SENS2;
|
||
|
||
CurrentPress = (((((long long)SENS)*D1)/pow(2,21)) - OFF)/pow(2,15);
|
||
__nop();
|
||
}
|
||
|
||
void ms5803_task(void)
|
||
{
|
||
StartCalculation();
|
||
|
||
switch(NSS_Select)
|
||
{
|
||
case 1 :
|
||
{
|
||
press_array1[a1] = CurrentPress/10;
|
||
a1++;
|
||
if(a1 > 9) a1 = 0;
|
||
for(int a = 0;a < 10;a++)
|
||
{
|
||
press_array1_sum += press_array1[a];
|
||
}
|
||
InputReg[NSS_Select + 6] = press_array1_sum/10;//压力数据存入
|
||
press_array1_sum = 0;
|
||
NSS_Select++;
|
||
}
|
||
break;
|
||
case 2 :
|
||
{
|
||
press_array2[a2] = CurrentPress/10;
|
||
a2++;
|
||
if(a2 > 9) a2 = 0;
|
||
for(int a = 0;a < 10;a++)
|
||
{
|
||
press_array2_sum += press_array2[a];
|
||
}
|
||
InputReg[NSS_Select + 6] = press_array2_sum/10;//压力数据存入
|
||
press_array2_sum = 0;
|
||
NSS_Select++;
|
||
}
|
||
break;
|
||
case 3 :
|
||
{
|
||
press_array3[a3] = CurrentPress/10;
|
||
a3++;
|
||
if(a3 > 9) a3 = 0;
|
||
for(int a = 0;a < 10;a++)
|
||
{
|
||
press_array3_sum += press_array3[a];
|
||
}
|
||
InputReg[NSS_Select + 6] = press_array3_sum/10;//压力数据存入
|
||
press_array3_sum = 0;
|
||
NSS_Select = 1;
|
||
}
|
||
break;
|
||
case 4 :
|
||
{
|
||
|
||
}
|
||
break;
|
||
case 5 :
|
||
{
|
||
|
||
}
|
||
break;
|
||
case 6 :
|
||
{
|
||
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|