2024-11-14 09:47:21 +08:00
|
|
|
|
#include "bsp_wf5803.h"
|
|
|
|
|
#include "CONFIG.h"
|
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
typedef enum
|
|
|
|
|
{
|
|
|
|
|
kPressIn = 0,
|
|
|
|
|
kPressOut = 1,
|
|
|
|
|
kPressAtom = 2,
|
|
|
|
|
kPressMaxIndex
|
|
|
|
|
} TePressSensorIndex;
|
|
|
|
|
|
|
|
|
|
static tmosTaskID press_task_id = INVALID_TASK_ID;
|
2024-11-19 17:45:09 +08:00
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
#define PRESS_IN_CS_HIGH() GPIOB_SetBits(GPIO_Pin_9)
|
|
|
|
|
#define PRESS_IN_CS_LOW() GPIOB_ResetBits(GPIO_Pin_9)
|
2024-11-19 17:45:09 +08:00
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
#define PRESS_OUT_CS_HIGH() GPIOB_SetBits(GPIO_Pin_4)
|
|
|
|
|
#define PRESS_OUT_CS_LOW() GPIOB_ResetBits(GPIO_Pin_4)
|
2024-11-19 17:45:09 +08:00
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
#define PRESS_ATOM_CS_HIGH() GPIOB_SetBits(GPIO_Pin_17)
|
|
|
|
|
#define PRESS_ATOM_CS_LOW() GPIOB_ResetBits(GPIO_Pin_17)
|
2024-11-19 17:45:09 +08:00
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
uint8_t volatile press_done_flag = 0;
|
2024-11-14 09:47:21 +08:00
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
uint8_t press_raw_data[kPressMaxIndex][5];
|
2024-11-16 17:18:52 +08:00
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
void PRESS_SPI_CsStart(TePressSensorIndex index)
|
2024-11-14 09:47:21 +08:00
|
|
|
|
{
|
2024-11-19 19:01:02 +08:00
|
|
|
|
switch (index)
|
|
|
|
|
{
|
|
|
|
|
case kPressIn:
|
|
|
|
|
PRESS_IN_CS_LOW();
|
|
|
|
|
break;
|
|
|
|
|
case kPressOut:
|
|
|
|
|
PRESS_OUT_CS_LOW();
|
|
|
|
|
break;
|
|
|
|
|
case kPressAtom:
|
|
|
|
|
PRESS_ATOM_CS_LOW();
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
2024-11-14 09:47:21 +08:00
|
|
|
|
}
|
2024-11-16 17:18:52 +08:00
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
void PRESS_SPI_CsStop(TePressSensorIndex index)
|
2024-11-14 09:47:21 +08:00
|
|
|
|
{
|
2024-11-19 19:01:02 +08:00
|
|
|
|
switch (index)
|
|
|
|
|
{
|
|
|
|
|
case kPressIn:
|
|
|
|
|
PRESS_IN_CS_HIGH();
|
|
|
|
|
break;
|
|
|
|
|
case kPressOut:
|
|
|
|
|
PRESS_OUT_CS_HIGH();
|
|
|
|
|
break;
|
|
|
|
|
case kPressAtom:
|
|
|
|
|
PRESS_ATOM_CS_HIGH();
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
2024-11-14 09:47:21 +08:00
|
|
|
|
}
|
2024-11-16 17:18:52 +08:00
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
uint8_t PRESS_SPI_SendByte(uint8_t data)
|
2024-11-14 09:47:21 +08:00
|
|
|
|
{
|
2024-11-16 17:18:52 +08:00
|
|
|
|
R8_SPI0_BUFFER = data;
|
|
|
|
|
while (!(R8_SPI0_INT_FLAG & RB_SPI_FREE));
|
|
|
|
|
return (R8_SPI0_BUFFER);
|
2024-11-14 09:47:21 +08:00
|
|
|
|
}
|
2024-11-16 17:18:52 +08:00
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
void WF5803_WriteReg(uint8_t Address, uint8_t value, TePressSensorIndex index)
|
2024-11-14 09:47:21 +08:00
|
|
|
|
{
|
2024-11-19 19:01:02 +08:00
|
|
|
|
PRESS_SPI_CsStart(index);
|
|
|
|
|
PRESS_SPI_SendByte(0x00);
|
|
|
|
|
PRESS_SPI_SendByte(Address);
|
|
|
|
|
PRESS_SPI_SendByte(value);
|
|
|
|
|
PRESS_SPI_CsStop(index);
|
2024-11-14 09:47:21 +08:00
|
|
|
|
}
|
2024-11-16 17:18:52 +08:00
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
uint8_t WF5803_ReadReg(uint8_t addr, TePressSensorIndex index)
|
2024-11-14 09:47:21 +08:00
|
|
|
|
{
|
|
|
|
|
uint8_t value;
|
2024-11-19 19:01:02 +08:00
|
|
|
|
PRESS_SPI_CsStart(index);
|
|
|
|
|
PRESS_SPI_SendByte(0x80);
|
|
|
|
|
PRESS_SPI_SendByte(addr);
|
|
|
|
|
value = PRESS_SPI_SendByte(0xFF);
|
|
|
|
|
PRESS_SPI_CsStop(index);
|
2024-11-14 09:47:21 +08:00
|
|
|
|
return value;
|
|
|
|
|
}
|
2024-11-16 17:18:52 +08:00
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
void PRESS_IO_SPI_Init(void)
|
2024-11-14 09:47:21 +08:00
|
|
|
|
{
|
2024-11-16 17:18:52 +08:00
|
|
|
|
/**
|
|
|
|
|
* CSB: PB17
|
|
|
|
|
* SCL: PA13
|
|
|
|
|
* SDA: PA14
|
|
|
|
|
* SDO: PA15
|
|
|
|
|
*/
|
|
|
|
|
// SDA: MOSI
|
|
|
|
|
// SDO: MISO
|
|
|
|
|
|
|
|
|
|
// CSB2: PB9
|
2024-11-19 17:45:09 +08:00
|
|
|
|
GPIOB_SetBits(GPIO_Pin_9);
|
2024-11-16 17:18:52 +08:00
|
|
|
|
GPIOB_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA);
|
|
|
|
|
|
|
|
|
|
// CSB3: PB4
|
2024-11-19 17:45:09 +08:00
|
|
|
|
GPIOB_SetBits(GPIO_Pin_4);
|
2024-11-16 17:18:52 +08:00
|
|
|
|
GPIOB_ModeCfg(GPIO_Pin_4, GPIO_ModeOut_PP_5mA);
|
|
|
|
|
|
|
|
|
|
// CSB4: PB17
|
|
|
|
|
GPIOB_SetBits(GPIO_Pin_17);
|
|
|
|
|
GPIOB_ModeCfg(GPIO_Pin_17, GPIO_ModeOut_PP_5mA);
|
2024-11-19 19:01:02 +08:00
|
|
|
|
|
|
|
|
|
PRESS_SPI_CsStop(kPressIn);
|
|
|
|
|
PRESS_SPI_CsStop(kPressOut);
|
|
|
|
|
PRESS_SPI_CsStop(kPressAtom);
|
2024-11-16 17:18:52 +08:00
|
|
|
|
|
2024-11-14 09:47:21 +08:00
|
|
|
|
// spi<70><69>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ģʽ0
|
2024-11-19 17:45:09 +08:00
|
|
|
|
GPIOA_ModeCfg(GPIO_Pin_13 | GPIO_Pin_14, GPIO_ModeOut_PP_5mA);
|
2024-11-16 17:18:52 +08:00
|
|
|
|
GPIOA_ModeCfg(GPIO_Pin_15, GPIO_ModeIN_PU);
|
|
|
|
|
|
|
|
|
|
SPI0_MasterDefInit();
|
2024-11-14 09:47:21 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
void WF5803_Init(void)
|
|
|
|
|
{
|
|
|
|
|
PRESS_IO_SPI_Init();
|
|
|
|
|
WF5803_WriteReg(0x00, 0x81, kPressIn); // <20><><EFBFBD><EFBFBD>spiΪ<69><CEAA><EFBFBD><EFBFBD>ģʽ
|
|
|
|
|
WF5803_WriteReg(0x00, 0x81, kPressOut); // <20><><EFBFBD><EFBFBD>spiΪ<69><CEAA><EFBFBD><EFBFBD>ģʽ
|
|
|
|
|
WF5803_WriteReg(0x00, 0x81, kPressAtom); // <20><><EFBFBD><EFBFBD>spiΪ<69><CEAA><EFBFBD><EFBFBD>ģʽ
|
|
|
|
|
}
|
2024-11-19 17:45:09 +08:00
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
void PRESS_LowerIO_Init(void)
|
2024-11-16 17:18:52 +08:00
|
|
|
|
{
|
2024-11-19 19:01:02 +08:00
|
|
|
|
// WF5803Ĭ<33>Ϲ<EFBFBD><CFB9><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IO<49><4F><EFBFBD>Ǹߵ<C7B8>ƽ
|
2024-11-19 17:45:09 +08:00
|
|
|
|
// SPI
|
2024-11-19 19:01:02 +08:00
|
|
|
|
GPIOA_SetBits(GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
|
|
|
|
|
GPIOA_ModeCfg(GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15, GPIO_ModeIN_PU);
|
2024-11-19 17:45:09 +08:00
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
// CSB2: PB9
|
|
|
|
|
GPIOB_SetBits(GPIO_Pin_9);
|
|
|
|
|
GPIOB_ModeCfg(GPIO_Pin_9, GPIO_ModeIN_PU);
|
2024-11-16 17:18:52 +08:00
|
|
|
|
|
2024-11-19 17:45:09 +08:00
|
|
|
|
// CSB3: PB4
|
2024-11-19 19:01:02 +08:00
|
|
|
|
GPIOB_SetBits(GPIO_Pin_4);
|
|
|
|
|
GPIOB_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_PU);
|
2024-11-19 17:45:09 +08:00
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
// CSB4: PB17
|
|
|
|
|
GPIOB_SetBits(GPIO_Pin_17);
|
|
|
|
|
GPIOB_ModeCfg(GPIO_Pin_17, GPIO_ModeIN_PU);
|
|
|
|
|
}
|
2024-11-19 17:45:09 +08:00
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
void Lower_IO_Deinit(void)
|
|
|
|
|
{
|
2024-11-19 17:45:09 +08:00
|
|
|
|
// LED
|
|
|
|
|
GPIOA_ResetBits(GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_12);
|
|
|
|
|
GPIOA_ModeCfg(GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_12, GPIO_ModeIN_PD);
|
|
|
|
|
|
|
|
|
|
// KEY
|
|
|
|
|
GPIOA_ResetBits(GPIO_Pin_7);
|
|
|
|
|
GPIOA_ModeCfg(GPIO_Pin_7, GPIO_ModeIN_PU);
|
|
|
|
|
|
|
|
|
|
// motor
|
|
|
|
|
GPIOB_ResetBits(GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2);
|
|
|
|
|
GPIOB_ModeCfg(GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2, GPIO_ModeIN_PD);
|
|
|
|
|
|
|
|
|
|
// COIL_ADC
|
|
|
|
|
GPIOA_ResetBits(GPIO_Pin_6);
|
|
|
|
|
GPIOA_ModeCfg(GPIO_Pin_6, GPIO_ModeIN_PD);
|
|
|
|
|
|
|
|
|
|
// ADC_CTRL,ADC_VBAT
|
|
|
|
|
GPIOA_ResetBits(GPIO_Pin_0 | GPIO_Pin_1);
|
|
|
|
|
GPIOA_ModeCfg(GPIO_Pin_0 | GPIO_Pin_1, GPIO_ModeIN_PD);
|
2024-11-16 17:18:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
void PRESS_LowPower(void)
|
|
|
|
|
{
|
|
|
|
|
Lower_IO_Deinit();
|
|
|
|
|
if (press_done_flag == 1)
|
|
|
|
|
{
|
|
|
|
|
PRESS_LowerIO_Init();
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-11-14 09:47:21 +08:00
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
uint8_t GetSensorData(TePressSensorIndex index)
|
2024-11-14 09:47:21 +08:00
|
|
|
|
{
|
2024-11-19 19:01:02 +08:00
|
|
|
|
memset(press_raw_data[index], 0, 5);
|
2024-11-16 17:18:52 +08:00
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
PRINT("Status = %02x\r\n", WF5803_ReadReg(0x02, index));
|
2024-11-16 17:18:52 +08:00
|
|
|
|
|
2024-11-14 09:47:21 +08:00
|
|
|
|
// <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>
|
|
|
|
|
// <20>¶<EFBFBD><C2B6><EFBFBD><EFBFBD><EFBFBD>
|
2024-11-19 19:01:02 +08:00
|
|
|
|
for (uint8_t i = 0; i < 5; i++)
|
|
|
|
|
{
|
|
|
|
|
press_raw_data[index][i] = WF5803_ReadReg(0x06 + i, index);
|
|
|
|
|
}
|
2024-11-16 17:18:52 +08:00
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
return 0;
|
2024-11-16 17:18:52 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
void SensorData_Process(TePressSensorIndex index)
|
2024-11-14 09:47:21 +08:00
|
|
|
|
{
|
2024-11-19 19:01:02 +08:00
|
|
|
|
long reading = 0;
|
|
|
|
|
float fDat = 0;
|
|
|
|
|
float press = 0;
|
|
|
|
|
float temp = 0;
|
|
|
|
|
|
|
|
|
|
GetSensorData(index);
|
|
|
|
|
|
|
|
|
|
reading = press_raw_data[index][0];
|
|
|
|
|
reading = reading << 8;
|
|
|
|
|
reading |= press_raw_data[index][1];
|
2024-11-14 09:47:21 +08:00
|
|
|
|
reading = reading << 8;
|
2024-11-19 19:01:02 +08:00
|
|
|
|
reading |= press_raw_data[index][2];
|
2024-11-14 09:47:21 +08:00
|
|
|
|
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>
|
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
reading = press_raw_data[index][3];
|
2024-11-14 09:47:21 +08:00
|
|
|
|
reading = reading << 8;
|
2024-11-19 19:01:02 +08:00
|
|
|
|
reading |= press_raw_data[index][4];
|
2024-11-14 09:47:21 +08:00
|
|
|
|
if (reading > 32768)
|
|
|
|
|
{
|
|
|
|
|
temp = (reading - 65844) / 256.0f;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
temp = (reading - 308) / 256.0f;
|
|
|
|
|
}
|
2024-11-19 19:01:02 +08:00
|
|
|
|
|
|
|
|
|
PRINT("P[%d] = %d.%d pa\r\n", index, (int)(press * 1000), ((int)(press * 10000000.0f) % 10000));
|
|
|
|
|
PRINT("T[%d] = %d.%d \r\n", index, (int)temp, ((int)(temp * 100.0f) % 100));
|
2024-11-14 09:47:21 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-11-19 17:45:09 +08:00
|
|
|
|
// __HIGH_CODE
|
|
|
|
|
// __attribute__((noinline))
|
|
|
|
|
uint16_t WF5803_ProcessEvent(uint8_t task_id, uint16_t events)
|
2024-11-14 09:47:21 +08:00
|
|
|
|
{
|
2024-11-19 19:01:02 +08:00
|
|
|
|
if (events & WF5803_EVT_START)
|
2024-11-19 17:45:09 +08:00
|
|
|
|
{
|
2024-11-19 19:01:02 +08:00
|
|
|
|
press_done_flag = 0;
|
2024-11-19 17:45:09 +08:00
|
|
|
|
|
|
|
|
|
WF5803_Init();
|
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
WF5803_WriteReg(0x30, 0x0A, kPressIn);
|
|
|
|
|
WF5803_WriteReg(0x30, 0x0A, kPressOut);
|
|
|
|
|
WF5803_WriteReg(0x30, 0x0A, kPressAtom);
|
2024-11-16 17:18:52 +08:00
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
tmos_start_task(press_task_id, WF5803_EVT_READ, MS1_TO_SYSTEM_TIME(5));
|
2024-11-16 17:18:52 +08:00
|
|
|
|
return (events ^ WF5803_EVT_START);
|
|
|
|
|
}
|
|
|
|
|
else if (events & WF5803_EVT_READ)
|
2024-11-14 09:47:21 +08:00
|
|
|
|
{
|
2024-11-19 19:01:02 +08:00
|
|
|
|
SensorData_Process(kPressIn);
|
|
|
|
|
SensorData_Process(kPressOut);
|
|
|
|
|
SensorData_Process(kPressAtom);
|
2024-11-16 17:18:52 +08:00
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
tmos_start_task(press_task_id, WF5803_EVT_START, MS1_TO_SYSTEM_TIME(800));
|
2024-11-19 17:45:09 +08:00
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
press_done_flag = 1;
|
2024-11-16 17:18:52 +08:00
|
|
|
|
return (events ^ WF5803_EVT_READ);
|
2024-11-14 09:47:21 +08:00
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-19 19:01:02 +08:00
|
|
|
|
void BSP_PRESS_Init(void)
|
2024-11-14 09:47:21 +08:00
|
|
|
|
{
|
2024-11-19 19:01:02 +08:00
|
|
|
|
press_task_id = TMOS_ProcessEventRegister(WF5803_ProcessEvent);
|
|
|
|
|
tmos_set_event(press_task_id, WF5803_EVT_START);
|
2024-11-14 09:47:21 +08:00
|
|
|
|
}
|