#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) { HAL_GPIO_WritePin(MS5803_NSS1_GPIO_Port,MS5803_NSS1_Pin,GPIO_PIN_SET); HAL_GPIO_WritePin(MS5803_NSS2_GPIO_Port,MS5803_NSS2_Pin,GPIO_PIN_SET); HAL_GPIO_WritePin(MS5803_NSS3_GPIO_Port,MS5803_NSS3_Pin,GPIO_PIN_SET); HAL_GPIO_WritePin(MS5803_NSS4_GPIO_Port,MS5803_NSS4_Pin,GPIO_PIN_RESET); HAL_GPIO_WritePin(MS5803_NSS5_GPIO_Port,MS5803_NSS5_Pin,GPIO_PIN_SET); HAL_GPIO_WritePin(MS5803_NSS6_GPIO_Port,MS5803_NSS6_Pin,GPIO_PIN_SET); HAL_GPIO_WritePin(MS5803_NSS7_GPIO_Port,MS5803_NSS7_Pin,GPIO_PIN_SET); HAL_GPIO_WritePin(MS5803_NSS8_GPIO_Port,MS5803_NSS8_Pin,GPIO_PIN_RESET); } void clrcs(void) { switch(NSS_Select) { case 1 : HAL_GPIO_WritePin(MS5803_NSS1_GPIO_Port,MS5803_NSS1_Pin,GPIO_PIN_RESET); break; case 2 : HAL_GPIO_WritePin(MS5803_NSS2_GPIO_Port,MS5803_NSS2_Pin,GPIO_PIN_RESET); break; case 3 : HAL_GPIO_WritePin(MS5803_NSS3_GPIO_Port,MS5803_NSS3_Pin,GPIO_PIN_RESET); break; case 4 : HAL_GPIO_WritePin(MS5803_NSS5_GPIO_Port,MS5803_NSS5_Pin,GPIO_PIN_RESET); break; case 5 : HAL_GPIO_WritePin(MS5803_NSS6_GPIO_Port,MS5803_NSS6_Pin,GPIO_PIN_RESET); break; case 6 : HAL_GPIO_WritePin(MS5803_NSS7_GPIO_Port,MS5803_NSS7_Pin,GPIO_PIN_RESET); break; case 7 : HAL_GPIO_WritePin(MS5803_NSS4_GPIO_Port,MS5803_NSS4_Pin,GPIO_PIN_SET); break; case 8 : HAL_GPIO_WritePin(MS5803_NSS8_GPIO_Port,MS5803_NSS8_Pin,GPIO_PIN_SET); break; } } /************************************************ 函数名称 : Write_SPI_Byte 功 能 : SPI写一个字节 参 数 : Byte ---- 数据 返 回 值 : Byte ---- 数据 *************************************************/ uint8_t ms5803_write_byte( uint8_t Byte ) { uint8_t i; for(i = 0;i < 8;i++) { MS5803_SCK(0); delay_us(1); // 空等待 if(Byte & 0x80) { MS5803_MOSI(1); } else { MS5803_MOSI(0); } Byte <<= 1; delay_us(1); // 空等待 MS5803_SCK(1); delay_us(1); // 空等待 Byte |= MS5803_MISO; } MS5803_SCK(0); return Byte; } /************************************************ 函数名称 : Read_SPI_Byte 功 能 : SPI只读一个字节 参 数 : 无 返 回 值 : temp ---- 数据 *************************************************/ uint8_t ms5803_read_byte(void) { uint8_t i; uint8_t temp = 0; for(i = 0;i < 8;i++) { MS5803_SCK(0); delay_us(1); // 空等待 temp <<= 1; temp |= MS5803_MISO; //delay_us(1); // 空等待 MS5803_SCK(1); delay_us(1); // 空等待 } MS5803_SCK(0); return temp; } //**************************************** //*功能:向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); ms5803_write_byte(CMD); setcs(); return 1; } //**************************************** //*功能:根据指令从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); ms5803_write_byte(CMD); for(int cnt = 0;cnt < Count+1;cnt++) { aRxBuffer[cnt] = ms5803_read_byte(); } setcs(); return 1; } //**************************************** //*功能:复位MS5803 //*参数: //*返回: static void resetdevice() { writecmd(RESET); delay_ms(3); //必须延时3ms } //**************************************** //*功能:获取PROM校准参数,只需要获取一次 //*参数: //*返回: static void getpromdata() { memset(aRxBuffer,0,sizeof(aRxBuffer)); readcmddata(Cof1,2); PROMData.C1[NSS_Select] = (aRxBuffer[0] << 8) + aRxBuffer[1]; memset(aRxBuffer,0,sizeof(aRxBuffer)); readcmddata(Cof2,2); PROMData.C2[NSS_Select] = (aRxBuffer[0] << 8) + aRxBuffer[1]; memset(aRxBuffer,0,sizeof(aRxBuffer)); readcmddata(Cof3,2); PROMData.C3[NSS_Select] = (aRxBuffer[0] << 8) + aRxBuffer[1]; memset(aRxBuffer,0,sizeof(aRxBuffer)); readcmddata(Cof4,2); PROMData.C4[NSS_Select] = (aRxBuffer[0] << 8) + aRxBuffer[1]; memset(aRxBuffer,0,sizeof(aRxBuffer)); readcmddata(Cof5,2); PROMData.C5[NSS_Select] = (aRxBuffer[0] << 8) + aRxBuffer[1]; memset(aRxBuffer,0,sizeof(aRxBuffer)); readcmddata(Cof6,2); PROMData.C6[NSS_Select] = (aRxBuffer[0] << 8) + aRxBuffer[1]; } //**************************************** //*功能:MS5803初始化 //*参数: //*返回: void ms5803_init() { setcs(); SENSOR_SELECT(0); NSS_Select = 1; delay_tick(10); //初始化代码 resetdevice(); getpromdata(); NSS_Select = 2; delay_tick(10); //初始化代码 resetdevice(); getpromdata(); NSS_Select = 3; delay_tick(10); //初始化代码 resetdevice(); getpromdata(); SENSOR_SELECT(1); NSS_Select = 4; delay_tick(10); //初始化代码 resetdevice(); getpromdata(); NSS_Select = 5; delay_tick(10); //初始化代码 resetdevice(); getpromdata(); NSS_Select = 6; delay_tick(10); //初始化代码 resetdevice(); getpromdata(); } //**************************************** //*功能:获取温度和压力 MS5803-14BA //*参数: //*返回: void start_calculation() { uint32_t D1,D2; int32_t dT,TEMP; int64_t OFF,SENS; //转换压力 writecmd(CD1_256); delay_ms(1); //必须延时1ms readcmddata(ADC_Read,3); D1 = (aRxBuffer[2] * pow(2,16)) + (aRxBuffer[1] * pow(2,8)) + aRxBuffer[0]; //转换温度 writecmd(CD2_256); delay_ms(1); //必须延时1ms readcmddata(ADC_Read,3); D2 = (aRxBuffer[2] * pow(2,16)) + (aRxBuffer[1] * pow(2,8)) + aRxBuffer[0]; //计算温度 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) { if(NSS_Select > 3) { SENSOR_SELECT(1); delay_tick(10); } if(NSS_Select > 6) { SENSOR_SELECT(0); delay_tick(10); NSS_Select = 1; } start_calculation(); InputReg[NSS_Select + 12] = CurrentPress / 10;//压力数据存入 NSS_Select++; }