#include "mf5803.h" /* ** 返回值 : temp--SPI读取的一字节数据 ** 描 述 : 下降沿读数据,每次读取 1 bit */ uint8_t SPI_Read_OneByte(void) { uint8_t i; uint8_t temp = 0; for (i = 0; i < 8; i++) { //读取MISO 8次输入的值,存入temp。之所以不放在“SCK = 0”语句之后的位置是因为: //读取最后1byte的最后一位(即LSB)之后,不能再左移了 temp <<= 1; MF5803_SCK(1); delay_tick(10); if(MF5803_MISO) //读取最高位,保存至最末尾,通过左移位完成读整个字节 temp |= 0x01; else temp &= ~0x01; delay_tick(10); MF5803_SCK(0); delay_tick(10); } return temp; } /* ** 参 数 : u8_writedata--SPI写入的一字节数据 ** 描 述 : 上升沿写数据,每次写入 1 bit */ void SPI_Write_OneByte(uint8_t u8_writedata) { uint8_t i; for (i = 0; i < 8; i++) { delay_tick(10); if (u8_writedata & 0x80) //判断最高位,总是发送最高位 { MF5803_MOSI(1); //MOSI输出1,数据总线准备数据1 } else { MF5803_MOSI(0);//MOSI输出0,数据总线准备数据0 } MF5803_SCK(1); //上升沿来了(SCK从0-->1),数据总线上的数据写入到器件 delay_tick(10); u8_writedata <<= 1; //左移抛弃已经输出的最高位 MF5803_SCK(0); //拉低SCK信号,初始化为0 delay_tick(10); } } /* ** 返回值 : u8_readdata--SPI读取的一字节数据 ** 参 数 : u8_writedata--SPI写入的一字节数据 ** 描 述 : 上升沿写,下降沿读 */ uint8_t SPI_WriteAndRead_OneByte(uint8_t u8_writedata) { uint8_t i; uint8_t u8_readdata = 0x00; for (i = 0; i < 8; i++) { u8_readdata <<= 1;//读取MISO 8次输入的值,存入u8_readdata if (u8_writedata & 0x80)//判断最高位,总是写最高位(输出最高位) MF5803_MOSI(1);//MOSI输出1,数据总线准备数据1 else MF5803_MOSI(0);//MOSI输出0,数据总线准备数据0 u8_writedata <<= 1;//左移抛弃已经输出的最高位 MF5803_SCK(1);//上升沿来了(SCK从0-->1),数据总线上的数据写入器件 if(MF5803_MISO)//读取最高位,保存至最末尾,通过左移位完成读整个字节 u8_readdata |= 0x01; else u8_readdata &= ~0x01; MF5803_SCK(0);//下降沿来了(SCK从1-->0),MISO上将产生新的数据,读取存入u8——readdata } return u8_readdata; } uint8_t RawData[5]; uint8_t* GetSensorData() { //重置清0 memset(RawData, 0, sizeof(uint8_t) * 5); //采集温度数据 wf5803_WriteReg(0x30, 0x08); delay_ms(2); RawData[3] = wf5803_ReadReg(0x09); RawData[4] = wf5803_ReadReg(0x0A); //采集气压数据 wf5803_WriteReg(0x30, 0x09); delay_ms(3); RawData[0] = wf5803_ReadReg(0x06); RawData[1] = wf5803_ReadReg(0x07); RawData[2] = wf5803_ReadReg(0x08); return RawData; } /* ** 参 数 : (1)uint8_t addr--寄存器地址 ** (2)uint8_t value--写入值 ** 说 明 : wf5803寄存器写函数 */ void wf5803_WriteReg(uint8_t addr, uint8_t value) { clrcs();//CS片选拉低 SPI_Write_OneByte(0x00);//SPI写地址命令 SPI_Write_OneByte(addr); SPI_Write_OneByte(value);//SPI写数据 setcs();//CS片选拉高 } /* ** 返回值: value--读取寄存器值 ** 参 数 : addr--寄存器地址 ** 说 明 : wf5803寄存器读函数 */ uint8_t wf5803_ReadReg(uint8_t addr) { uint8_t value; clrcs();//CS片选拉低 SPI_Write_OneByte(0x80);//SPI写地址命令 SPI_Write_OneByte(addr); value = SPI_Read_OneByte();//SPI读数据 setcs();//CS片选拉高 return value; } void wf5803_ReadRegMulti(uint8_t addr, uint8_t lens, uint8_t* value) { clrcs();//CS片选拉低 if (lens == 1) { SPI_Write_OneByte(0x80);//SPI写地址命令 } else if (lens == 2) { SPI_Write_OneByte(0xA0);//SPI写地址命令 } else if (lens == 3) { SPI_Write_OneByte(0xC0);//SPI写地址命令 } else { SPI_Write_OneByte(0xE0);//SPI写地址命令 } SPI_Write_OneByte(addr); for (uint8_t i = 0; i < lens; i++) { value[i] = SPI_Read_OneByte();//SPI读数据 } setcs();//CS片选拉高 } void mf5803_setup() { setcs();//CS片选拉高 SENSOR_SELECT(0); delay_ms(10); NSS_Select = 1; //0x00:SDO_active: 1: 4-wire SPI, 0: 3-wire SPI wf5803_WriteReg(0x00, 0x81); delay_ms(10); NSS_Select = 2; //0x00:SDO_active: 1: 4-wire SPI, 0: 3-wire SPI wf5803_WriteReg(0x00, 0x81); delay_ms(10); NSS_Select = 3; //0x00:SDO_active: 1: 4-wire SPI, 0: 3-wire SPI wf5803_WriteReg(0x00, 0x81); delay_ms(10); SENSOR_SELECT(1); delay_ms(10); NSS_Select = 4; //0x00:SDO_active: 1: 4-wire SPI, 0: 3-wire SPI wf5803_WriteReg(0x00, 0x81); delay_ms(10); NSS_Select = 5; //0x00:SDO_active: 1: 4-wire SPI, 0: 3-wire SPI wf5803_WriteReg(0x00, 0x81); delay_ms(10); NSS_Select = 6; //0x00:SDO_active: 1: 4-wire SPI, 0: 3-wire SPI wf5803_WriteReg(0x00, 0x81); delay_ms(10); NSS_Select = 1; SENSOR_SELECT(0); delay_ms(10); } long reading = 0; float press = 0; //kPa long temp_5803 = 0; //℃ float fDat; uint8_t flt_cnt = 0; float p_flt_window[6][FLT_SIZE] = {0}; //sliding window, sensor_1&2 -> pressure[A,B,S] void mf5803_loop() { float sums = 0; uint8_t* p1 = GetSensorData(); reading = p1[0]; reading = reading << 8; reading |= p1[1]; reading = reading << 8; reading |= p1[2]; if(reading >= 8388608) { fDat = (int32_t)(reading - 16777216) / 8388608.0f; } else { fDat = reading / 8388608.0f; } press = (10000 * fDat + 9000) / 12.0f; //单位0.1Kpa p_flt_window[ NSS_Select -1 ][flt_cnt] = press*10; //滑动窗口记录 NSS_Select++; if(NSS_Select > 3) //记录完3路气压后进入此处,每3*10ms { SENSOR_SELECT(1); for( uint8_t i = 0; i < 6; i++ ) //均值滤波 { sums = 0; for( uint8_t j = 0; j < FLT_SIZE; j++ ) { sums += p_flt_window[i][j]; } InputReg[ 13 + i ] = sums/FLT_SIZE; //InputReg[13]~InputReg[18] temp_5803 = p1[3]; temp_5803 = temp_5803 << 8; temp_5803 += p1[4]; if (temp_5803 > 32768) { temp_5803 = (temp_5803 - 65844) / 256.0; } else { temp_5803 = (temp_5803 - 308) / 256.0; } } } if(NSS_Select > 6) //记录完6路气压后进入此处,每6*10ms { NSS_Select = 1; flt_cnt++; if(flt_cnt > (FLT_SIZE - 1) ) //滑动窗口长度FLT_SIZE,循环记录 { flt_cnt = 0; } } if(NSS_Select < 4) { SENSOR_SELECT(0); } }