142 lines
3.3 KiB
C
142 lines
3.3 KiB
C
#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);
|
||
}
|