IoT_SCV_CH584M/APP/bsp_wf5803.c

142 lines
3.3 KiB
C
Raw Normal View History

2024-11-14 09:47:21 +08:00
#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<70><69>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ģʽ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); // <20><><EFBFBD><EFBFBD>spiΪ<69><CEAA><EFBFBD><EFBFBD>ģʽ
}
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);
// <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>
RawData[0] = WF5803_ReadReg(0x06);
RawData[1] = WF5803_ReadReg(0x07);
RawData[2] = WF5803_ReadReg(0x08);
// <20><EFBFBD><C2B6><EFBFBD><EFBFBD><EFBFBD>
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 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>10m<30><6D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB4AB>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 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();
2024-11-14 09:48:51 +08:00
tmos_start_task(Peripheral_TaskID, WF5803_EVT, MS1_TO_SYSTEM_TIME(100));
2024-11-14 09:47:21 +08:00
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);
}