IoT_SCV_CH584M/APP/bsp_wf5803.c

142 lines
3.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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);
}