#include "wf5803.h" uint8_t NSS_Select = 1; //拉高所有片选脚 void SetCS(void) { HAL_GPIO_WritePin(SPI1_NSS1_GPIO_Port,SPI1_NSS1_Pin,GPIO_PIN_SET); HAL_GPIO_WritePin(SPI1_NSS2_GPIO_Port,SPI1_NSS2_Pin,GPIO_PIN_SET); HAL_GPIO_WritePin(SPI1_NSS3_GPIO_Port,SPI1_NSS3_Pin,GPIO_PIN_SET); } void ClrCS(void) { switch(NSS_Select) { case 1 : HAL_GPIO_WritePin(SPI1_NSS1_GPIO_Port,SPI1_NSS1_Pin,GPIO_PIN_RESET); break; case 2 : HAL_GPIO_WritePin(SPI1_NSS2_GPIO_Port,SPI1_NSS2_Pin,GPIO_PIN_RESET); break; case 3 : HAL_GPIO_WritePin(SPI1_NSS3_GPIO_Port,SPI1_NSS3_Pin,GPIO_PIN_RESET); break; } } /* ** 返回值 : 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; WF5803_SCK(1); delay_tick(5); if(WF5803_MISO) //读取最高位,保存至最末尾,通过左移位完成读整个字节 temp |= 0x01; else temp &= ~0x01; delay_tick(5); WF5803_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(5); if (u8_writedata & 0x80) //判断最高位,总是发送最高位 { WF5803_MOSI(1); //MOSI输出1,数据总线准备数据1 } else { WF5803_MOSI(0);//MOSI输出0,数据总线准备数据0 } WF5803_SCK(1); //上升沿来了(SCK从0-->1),数据总线上的数据写入到器件 delay_tick(10); u8_writedata <<= 1; //左移抛弃已经输出的最高位 WF5803_SCK(0); //拉低SCK信号,初始化为0 delay_tick(5); } } /* ** 返回值 : 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)//判断最高位,总是写最高位(输出最高位) WF5803_MOSI(1);//MOSI输出1,数据总线准备数据1 else WF5803_MOSI(0);//MOSI输出0,数据总线准备数据0 u8_writedata <<= 1;//左移抛弃已经输出的最高位 WF5803_SCK(1);//上升沿来了(SCK从0-->1),数据总线上的数据写入器件 if(WF5803_MISO)//读取最高位,保存至最末尾,通过左移位完成读整个字节 u8_readdata |= 0x01; else u8_readdata &= ~0x01; WF5803_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); HAL_Delay(2); RawData[3] = wf5803_ReadReg(0x09); RawData[4] = wf5803_ReadReg(0x0A); //采集气压数据 wf5803_WriteReg(0x30, 0x09); HAL_Delay(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 wf5803_setup() { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); SetCS();//CS片选拉高 HAL_Delay(1); NSS_Select = 1; HAL_Delay(10); //0x00:SDO_active: 1: 4-wire SPI, 0: 3-wire SPI wf5803_WriteReg(0x00, 0x81); NSS_Select = 2; HAL_Delay(10); //0x00:SDO_active: 1: 4-wire SPI, 0: 3-wire SPI wf5803_WriteReg(0x00, 0x81); NSS_Select = 3; HAL_Delay(10); //0x00:SDO_active: 1: 4-wire SPI, 0: 3-wire SPI wf5803_WriteReg(0x00, 0x81); NSS_Select = 1; HAL_Delay(10); } long press_reading = 0,temp_reading = 0;; float press = 0;//kPa float temp = 0;//℃ float fDat; void wf5803_loop() { uint8_t* p1 = GetSensorData(); press_reading = p1[0]; press_reading = press_reading << 8; press_reading |= p1[1]; press_reading = press_reading << 8; press_reading |= p1[2]; if(press_reading >= 8388608) { fDat = (int32_t)(press_reading - 16777216) / 8388608.0f; } else { fDat = press_reading / 8388608.0f; } press = (10000 * fDat + 9000) / 12.0f; temp_reading = p1[3]; temp_reading = temp_reading << 8; temp_reading |= p1[4]; if (temp_reading > 32768) { temp = (temp_reading - 65844) / 256.0; InputReg[NSS_Select + 15] = (uint16_t)((0xFFFF + temp * 100) + 1); } else { temp = (temp_reading - 308) / 256.0; InputReg[NSS_Select + 15] = temp * 100; } InputReg[NSS_Select + 4] = press * 10 + pressure_offsets[NSS_Select]; NSS_Select++; if(NSS_Select > 3) { NSS_Select = 1; } }