#include "bsp_wf5803.h" #include "CONFIG.h" static uint8_t Peripheral_TaskID = 0xff; void SPICs_Start(void) { GPIOA_ResetBits(GPIO_Pin_6); } void SPICs_Stop(void) { GPIOA_SetBits(GPIO_Pin_6); } uint8_t WF5803_SendByte(uint8_t data) { R8_SPI1_BUFFER = data; while (!(R8_SPI1_INT_FLAG & RB_SPI_FREE)) ; return (R8_SPI1_BUFFER); } void WF5803_WriteReg(uint8_t Address, uint8_t value) { SPICs_Start(); WF5803_SendByte(0x00); WF5803_SendByte(Address); WF5803_SendByte(value); SPICs_Stop(); } uint8_t WF5803_ReadReg(uint8_t addr) { uint8_t value; SPICs_Start(); WF5803_SendByte(0x80); WF5803_SendByte(addr); value = WF5803_SendByte(0xFF); SPICs_Stop(); return value; } void WF5803_Init(void) { /** * CSB: PA6 * SCL: PA0 * SDA: PA1 * SDO: PA2 */ // spi初始化,模式0 GPIOA_ModeCfg(GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_6 | GPIO_Pin_3, GPIO_ModeOut_PP_5mA); GPIOA_ModeCfg(GPIO_Pin_2, GPIO_ModeIN_Floating); SPI1_MasterDefInit(); SPICs_Stop(); WF5803_WriteReg(0x00, 0x81); // 配置spi为四线模式 } long reading = 0; float press = 0; float temp = 0; float fDat = 0; float press_air = 101.0f; int a = 1; uint8_t RawData[5]; uint8_t *GetSensorData(void) { memset(RawData, 0, sizeof(uint8_t) * 5); WF5803_WriteReg(0x30, 0x0a); DelayMs(50); // 气压数据 RawData[0] = WF5803_ReadReg(0x06); RawData[1] = WF5803_ReadReg(0x07); RawData[2] = WF5803_ReadReg(0x08); // 温度数据 RawData[3] = WF5803_ReadReg(0x09); RawData[4] = WF5803_ReadReg(0x0a); // for(int i=0; i<5; i++) // { // PRINT("RawData[%d] = %x\r\n", i,RawData[i]); // } return RawData; } void SensorData_Process(void) { 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 = fDat * 125 + 17.5; // WF5803_1BAR 如果是使用10m级别的深传就使用这个 // if (a) {press_air = press ; a = 0;} // press = press_air > press ? press_air : press; // // int deep_100 = (int)(100*((press - press_air)/0.098f)); // //printf("P=%d.%d pa\r\n",(int)press,((int)(press*10000.0f)%10000));` // printf("D=%d.%d cm\r\n",deep_100/100,deep_100%100); reading = p1[3]; reading = reading << 8; reading |= p1[4]; if (reading > 32768) { temp = (reading - 65844) / 256.0f; } else { temp = (reading - 308) / 256.0f; } // PRINT("--s-1--\r\n"); PRINT("P=%d.%d pa\r\n", (int)(press * 1000), ((int)(press * 10000000.0f) % 10000)); // PRINT("T=%d.%d \r\n", (int)temp, ((int)(temp * 100.0f) % 100)); } uint16_t wf5803_ProcessEvent(uint8_t task_id, uint16_t events) { if (events & WF5803_EVT) { SensorData_Process(); tmos_start_task(Peripheral_TaskID, WF5803_EVT, MS1_TO_SYSTEM_TIME(100)); return (events ^ WF5803_EVT); } return 0; } void BSPWF5803_Init(void) { WF5803_Init(); Peripheral_TaskID = TMOS_ProcessEventRegister(wf5803_ProcessEvent); tmos_set_event(Peripheral_TaskID, WF5803_EVT); }