#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; } }